# -*- coding: utf-8 -*-
from cfme.generic_objects.definition.associations import get_rest_resource
from cfme.generic_objects.instance import (
GenericObjectInstance,
GenericObjectInstanceCollection
)
from cfme.utils.appliance import MiqImplementationContext
from cfme.utils.appliance.implementations.rest import ViaREST
from cfme.utils.rest import assert_response, create_resource
def _get_associations_dict(appliance, associations, definition):
assoc_dict = {}
for key in associations:
# association type, e.g. "Service"
assoc_type = definition.associations[key]
assoc_dict[key] = []
for resource in associations[key]:
# get the REST representation of the resource
rest_resource = get_rest_resource(appliance, assoc_type, resource)[0]
assoc_dict[key].append({'href': rest_resource.href})
return assoc_dict
@MiqImplementationContext.external_for(GenericObjectInstanceCollection.create, ViaREST)
[docs]def create(self, name, definition, attributes=None, associations=None):
definition_rest = self.appliance.rest_api.collections.generic_object_definitions.get(
name=definition.name)
body = {'name': name, 'generic_object_definition': {'href': definition_rest.href}}
if attributes:
body['property_attributes'] = attributes
if associations:
body['associations'] = _get_associations_dict(self.appliance, associations, definition)
create_resource(self.appliance.rest_api, 'generic_objects', [body])
assert_response(self.appliance)
rest_response = self.appliance.rest_api.response
entity = self.instantiate(
name=name, definition=definition, attributes=attributes, associations=associations
)
entity.rest_response = rest_response
return entity
@MiqImplementationContext.external_for(GenericObjectInstance.update, ViaREST)
[docs]def update(self, updates):
instance = self.appliance.rest_api.collections.generic_objects.find_by(
name=self.name)
if not instance:
self.rest_response = None
return
instance = instance[0]
name = updates.get('name')
attributes = updates.get('attributes')
associations = updates.get('associations')
body = {}
if name:
body['name'] = name
if attributes:
body['property_attributes'] = attributes
if associations:
body['associations'] = _get_associations_dict(self.appliance, associations, self.definition)
instance.action.edit(**body)
assert_response(self.appliance)
self.rest_response = self.appliance.rest_api.response
@MiqImplementationContext.external_for(GenericObjectInstance.delete, ViaREST)
[docs]def delete(self):
instance = self.appliance.rest_api.collections.generic_objects.find_by(
name=self.name)
if not instance:
self.rest_response = None
return
instance = instance[0]
instance.action.delete()
assert_response(self.appliance)
self.rest_response = self.appliance.rest_api.response
@MiqImplementationContext.external_for(GenericObjectInstance.exists.getter, ViaREST)
[docs]def exists(self):
return bool(
self.appliance.rest_api.collections.generic_objects.find_by(name=self.name))
@MiqImplementationContext.external_for(GenericObjectInstance.add_tag, ViaREST)
[docs]def add_tag(self, tag):
instance = self.appliance.rest_api.collections.generic_objects.find_by(
name=self.name)
if not instance:
self.rest_response = None
return
instance = instance[0]
instance.tags.action.assign(tag)
assert_response(self.appliance)
self.rest_response = self.appliance.rest_api.response
@MiqImplementationContext.external_for(GenericObjectInstance.remove_tag, ViaREST)
[docs]def remove_tag(self, tag):
instance = self.appliance.rest_api.collections.generic_objects.find_by(
name=self.name)
if not instance:
self.rest_response = None
return
instance = instance[0]
instance.tags.action.unassign(tag)
assert_response(self.appliance)
self.rest_response = self.appliance.rest_api.response
@MiqImplementationContext.external_for(GenericObjectInstance.get_tags, ViaREST)