def get_device_profile_groups(self, dp_name): """Get list of profile group objects from the device profile. Cyborg API returns: {"device_profiles": [<device_profile>]} See module notes above for further details. :param dp_name: string: device profile name Expected to be valid, not None or ''. :returns: [objects.RequestGroup] :raises: DeviceProfileError """ dp_list = self._get_device_profile_list(dp_name) if not dp_list: msg = _('Expected 1 device profile but got nothing.') raise exception.DeviceProfileError(name=dp_name, msg=msg) if len(dp_list) != 1: err = _('Expected 1 device profile but got %s.') % len(dp_list) raise exception.DeviceProfileError(name=dp_name, msg=err) dp_groups = dp_list[0]['groups'] request_groups = [] for dp_group_id, dp_group in enumerate(dp_groups): req_id = get_device_profile_group_requester_id(dp_group_id) rg = objects.RequestGroup(requester_id=req_id) for key, val in dp_group.items(): match = schedutils.ResourceRequest.XS_KEYPAT.match(key) if not match: continue # could be 'accel:foo=bar', skip it prefix, _ignore, name = match.groups() if prefix == schedutils.ResourceRequest.XS_RES_PREFIX: rg.add_resource(rclass=name, amount=val) elif prefix == schedutils.ResourceRequest.XS_TRAIT_PREFIX: rg.add_trait(trait_name=name, trait_type=val) request_groups.append(rg) return request_groups
def _get_device_profile_list(self, dp_name): query = {"name": dp_name} err_msg = None resp, err_msg = self._call_cyborg(self._client.get, self.DEVICE_PROFILE_URL, params=query) if err_msg: raise exception.DeviceProfileError(name=dp_name, msg=err_msg) return resp.json().get('device_profiles')