def create_cis(self): self.ci1 = CI( uid='uid-ci1', type=self.citype1, barcode='barcodeci1', name='ciname1', ) self.ci1.save() self.ci1.layers = [self.cilayer1, self.cilayer2] self.ci1.save() self.ci2 = CI( uid='uid-ci2', type=self.citype2, barcode='barcodeci2', name='ciname2', ) self.ci2.save() self.ci2.layers = [self.cilayer1] self.ci2.save() self.ci3 = CI( uid='other-ci3', type=self.citype2, barcode='otherbarcodeci3', name='otherci', ) self.ci3.save() self.ci3.layers = [self.cilayer2] self.ci3.save()
def create_cis(self): self.ci1 = CI( uid='uid-ci1', type=self.types[0], barcode='barcodeci1', name='ciname1', ) self.ci1.save() self.ci1.layers = [self.layers[0].id, self.layers[1].id] self.ci1.save() self.ci2 = CI( uid='uid-ci2', type=self.types[1], barcode='barcodeci2', name='ciname2', ) self.ci2.save() self.ci2.layers = [self.layers[0].id] self.ci2.save() self.ci3 = CI( uid='other-ci3', type=self.types[1], barcode='otherbarcodeci3', name='otherci', ) self.ci3.save() self.ci3.layers = [self.layers[1].id] self.ci3.save()
def create_cis(self): self.ci1 = CI(uid="uid-ci1", type=self.types[0], barcode="barcodeci1", name="ciname1") self.ci1.save() self.ci1.layers = [self.layers[0].id, self.layers[1].id] self.ci1.save() self.ci2 = CI(uid="uid-ci2", type=self.types[1], barcode="barcodeci2", name="ciname2") self.ci2.save() self.ci2.layers = [self.layers[0].id] self.ci2.save() self.ci3 = CI(uid="other-ci3", type=self.types[1], barcode="otherbarcodeci3", name="otherci") self.ci3.save() self.ci3.layers = [self.layers[1].id] self.ci3.save()
def business_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] owners = CIOwner.objects.filter(ciownership__type=CIOwnershipType.business.id, ci=ci) return ", ".join([unicode(owner) for owner in owners])
def business_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] owners = CIOwner.objects.filter( ciownership__type=CIOwnershipType.business.id, ci=ci) return ", ".join([unicode(owner) for owner in owners])
def ralph_device_owner_table(device): """Renders a table containing owners of a given ralph device object.""" context = { 'venture': device.venture, 'venture_business': [], 'venture_technical': [], 'service_business': [], 'service_technical': [], } if device.venture: venture_ci = CI.get_by_content_object(device.venture) venture_ownerships = CIOwnership.objects.filter(ci=venture_ci) context['venture_business'] = venture_ownerships.filter( type=CIOwnershipType.business, ) context['venture_technical'] = venture_ownerships.filter( type=CIOwnershipType.technical, ) if device.service: service_ownerships = CIOwnership.objects.filter(ci=device.service) context['service_business'] = service_ownerships.filter( type=CIOwnershipType.business, ) context['service_technical'] = service_ownerships.filter( type=CIOwnershipType.technical, ) return render_to_string('cmdb/ralph_device_owner_table.html', context)
def setUp(self): self.client = login_as_su() self.service = CI(name='allegro.pl', type=CIType.objects.get(id=CI_TYPES.SERVICE)) self.service.save() self.db_service = CI.objects.get(id=self.service.id) self.venture = CI(name='allegro_prod', type=CIType.objects.get(id=CI_TYPES.VENTURE)) self.venture.save() self.ci_venture = CI.objects.get(id=self.venture.id) self.relation = CIRelation( parent=self.ci_venture, child=self.db_service, type=CI_RELATION_TYPES.CONTAINS, ) self.relation.save()
def setUp(self): self.user = create_user( 'api_user', '*****@*****.**', 'password', is_superuser=True ) self.puppet_cv = "v%s" % random.randrange(0, 1000) self.post_data_puppet = { 'configuration_version': self.puppet_cv, 'host': 's11111.dc2', 'kind': 'apply', 'status': 'failed', 'time': '2012-11-14 13:00:00', } self.git_changeset = "change:%s" % random.randrange(0, 1000) self.git_comment = "comment:%s" % random.randrange(0, 1000) self.post_data_git = { 'author': 'Jan Kowalski', 'changeset': self.git_changeset, 'comment': self.git_comment, 'file_paths': '/some/path', } temp_venture = Venture.objects.create(name='TempTestVenture') if settings.AUTOCI: self.ci = CI.get_by_content_object(temp_venture) else: CIImporter().import_single_object(temp_venture) self.ci = CI.objects.create( name='TempTestVentureCI', uid=CI.get_uid_by_content_object(temp_venture), type_id=4, ) self.cmdb_new_value = 'nv_%s' % random.randrange(0, 1000) self.cmdb_old_value = 'ov_%s' % random.randrange(0, 1000) self.post_data_cmdb_change = { 'ci': '/api/v0.9/ci/%d/' % self.ci.pk, 'comment': 'test api', 'field_name': 'child', 'new_value': self.cmdb_new_value, 'old_value': self.cmdb_old_value, 'time': '2012-11-15 12:00:00', } cache.clear()
def technical_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] return CIOwner.objects.filter( ci=ci, ciownership__type=CIOwnershipType.technical.id, )
def business_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] return CIOwner.objects.filter( ci=ci, ciownership__type=CIOwnershipType.business.id )
def business_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] owners = CIOwner.objects.filter(ciownership__type=CIOwnershipType.business.id, ci=ci) part_url = reverse_lazy('ci_edit', kwargs={'ci_id': str(ci.id)}) return "<a href=\"{}\">{}</a>".format(part_url, ", ".join([unicode(owner) for owner in owners]))
def business_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] owners = CIOwner.objects.filter( ciownership__type=CIOwnershipType.business.id, ci=ci) part_url = reverse_lazy('ci_edit', kwargs={'ci_id': str(ci.id)}) link_text = ", ".join([unicode(owner) for owner in owners]) if owners else '[add]' return "<a href=\"{}\">{}</a>".format(part_url, link_text)
def setUp(self): engine = settings.ISSUETRACKERS["default"]["ENGINE"] if engine != "": raise ImproperlyConfigured("""Expected ISSUETRACKERS['default']['ENGINE']='' got: %r""" % engine) # usual stuff self.top_venture = Venture(name="top_venture") self.top_venture.save() self.child_venture = Venture(name="child_venture", parent=self.top_venture) self.child_venture.save() self.role = VentureRole(name="role", venture=self.child_venture) self.role.save() self.child_role = VentureRole(name="child_role", venture=self.child_venture, parent=self.role) self.child_role.save() to = CIOwner(first_name="Bufallo", last_name="Kudłaczek") to.save() bo = CIOwner(first_name="Bill", last_name="Bąbelek") bo.save() ct = ContentType.objects.get_for_model(self.top_venture) CIImporter().import_all_ci([ct]) CIOwnership(owner=to, ci=CI.get_by_content_object(self.child_venture), type=CIOwnershipType.technical.id).save() CIOwnership(owner=bo, ci=CI.get_by_content_object(self.child_venture), type=CIOwnershipType.business.id).save() dm = self.add_model("DC model sample", DeviceType.data_center.id) self.dc = Device.create(sn="sn1", model=dm) self.dc.name = "dc" self.dc.save() dm = self.add_model("Rack model sample", DeviceType.rack_server.id) self.rack = Device.create(venture=self.child_venture, sn="sn2", model=dm) self.rack.parent = self.dc self.rack.name = "rack" self.rack.save() dm = self.add_model("Blade model sample", DeviceType.blade_server.id) self.blade = Device.create(venture=self.child_venture, venturerole=self.child_role, sn="sn3", model=dm) self.blade.name = "blade" self.blade.parent = self.rack self.blade.save() self.deployment = Deployment() self.deployment.hostname = "test_host2" self.deployment.device = self.blade self.deployment.mac = "10:9a:df:6f:af:01" self.deployment.ip = "192.168.1.1" self.deployment.hostname = "test" self.deployment.save()
def setUp(self): self.client = login_as_su() self.service = CI( name='allegro.pl', type=CIType.objects.get(id=CI_TYPES.SERVICE) ) self.service.save() self.db_service = CI.objects.get(id=self.service.id) self.venture = CI( name='allegro_prod', type=CIType.objects.get(id=CI_TYPES.VENTURE) ) self.venture.save() self.ci_venture = CI.objects.get(id=self.venture.id) self.relation = CIRelation( parent=self.ci_venture, child=self.db_service, type=CI_RELATION_TYPES.CONTAINS, ) self.relation.save()
def technical_owners(self): ci = CI.get_by_content_object(self) if not ci: return [] owners = CIOwner.objects.filter( ciownership__type=CIOwnershipType.technical.id, ci=ci ) part_url = reverse_lazy('ci_edit', kwargs={'ci_id': str(ci.id)}) link_text = ", ".join([unicode(owner) for owner in owners]) if owners else '[add]' return "<a href=\"{}\">{}</a>".format(part_url, link_text)
def test_reports_views(self): url = '/ui/reports/services/' report = self.client.get(url, follow=True) self.assertEqual(report.status_code, 200) invalid_relation = report.context['invalid_relation'] services_without_venture = report.context['services_without_venture'] self.assertEqual(invalid_relation[0].name, 'allegro.pl') self.assertEqual(len(invalid_relation), 1) self.assertEqual(len(services_without_venture), 0) # local service for tests service = CI(name='ceneo.pl', type=CIType.objects.get( id=CI_TYPES.SERVICE) ) service.save() # local venture for tests venture = CI(name='allegro_prod', type=CIType.objects.get( id=CI_TYPES.VENTURE) ) venture.save() reload_report = self.client.get(url, follow=True) re_invalid_relation = reload_report.context['invalid_relation'] re_services_without_venture = reload_report.context[ 'services_without_venture'] self.assertEqual(len(re_invalid_relation), 1) self.assertEqual(len(re_services_without_venture), 0)
def setUp(self): self.user = create_user("api_user", "*****@*****.**", "password", is_superuser=True) self.puppet_cv = "v%s" % random.randrange(0, 1000) self.post_data_puppet = { "configuration_version": self.puppet_cv, "host": "s11111.dc2", "kind": "apply", "status": "failed", "time": "2012-11-14 13:00:00", } self.git_changeset = "change:%s" % random.randrange(0, 1000) self.git_comment = "comment:%s" % random.randrange(0, 1000) self.post_data_git = { "author": "Jan Kowalski", "changeset": self.git_changeset, "comment": self.git_comment, "file_paths": "/some/path", } temp_venture = Venture.objects.create(name="TempTestVenture") if settings.AUTOCI: self.ci = CI.get_by_content_object(temp_venture) else: CIImporter().import_single_object(temp_venture) self.ci = CI.objects.create( name="TempTestVentureCI", uid=CI.get_uid_by_content_object(temp_venture), type_id=4 ) self.cmdb_new_value = "nv_%s" % random.randrange(0, 1000) self.cmdb_old_value = "ov_%s" % random.randrange(0, 1000) self.post_data_cmdb_change = { "ci": "/api/v0.9/ci/%d/" % self.ci.pk, "comment": "test api", "field_name": "child", "new_value": self.cmdb_new_value, "old_value": self.cmdb_old_value, "time": "2012-11-15 12:00:00", } cache.clear()
def setUp(self): self.puppet_cv = "v%s" % random.randrange(0, 1000) puppet_bundle = Bundle( data={ 'configuration_version': self.puppet_cv, 'host': 's11111.dc2', 'kind': 'apply', 'status': 'failed', 'time': '2012-11-14 13:00:00' }) puppet_resource = CIChangePuppetResource() puppet_resource.obj_create(bundle=puppet_bundle) self.git_changeset = "change:%s" % random.randrange(0, 1000) self.git_comment = "comment:%s" % random.randrange(0, 1000) git_bundle = Bundle( data={ 'author': 'Jan Kowalski', 'changeset': self.git_changeset, 'comment': self.git_comment, 'file_paths': '/some/path', }) git_resource = CIChangeGitResource() git_resource.obj_create(bundle=git_bundle) temp_venture = Venture.objects.create(name='TempTestVenture') self.ci = CI.objects.create( name='TempTestVentureCI', uid=CI.get_uid_by_content_object(temp_venture), type_id=4) self.cmdb_new_value = 'nv_%s' % random.randrange(0, 1000) self.cmdb_old_value = 'ov_%s' % random.randrange(0, 1000) cmdb_bundle = Bundle( data={ 'ci': '/api/v0.9/ci/%d/' % self.ci.pk, 'comment': 'test api', 'field_name': 'child', 'new_value': self.cmdb_new_value, 'old_value': self.cmdb_old_value, 'time': '2012-11-15 12:00:00' }) cmdb_resource = CIChangeCMDBHistoryResource() cmdb_resource.obj_create(bundle=cmdb_bundle)
def test_reports_views(self): url = '/ui/reports/services/' report = self.client.get(url, follow=True) self.assertEqual(report.status_code, 200) invalid_relation = report.context['invalid_relation'] services_without_venture = report.context['services_without_venture'] self.assertEqual(invalid_relation[0].name, 'allegro.pl') self.assertEqual(len(invalid_relation), 1) self.assertEqual(len(services_without_venture), 0) # local service for tests service = CI(name='ceneo.pl', type=CIType.objects.get(id=CI_TYPES.SERVICE)) service.save() # local venture for tests venture = CI(name='allegro_prod', type=CIType.objects.get(id=CI_TYPES.VENTURE)) venture.save() reload_report = self.client.get(url, follow=True) re_invalid_relation = reload_report.context['invalid_relation'] re_services_without_venture = reload_report.context[ 'services_without_venture'] self.assertEqual(len(re_invalid_relation), 1) self.assertEqual(len(re_services_without_venture), 0)
class ReportsServicesTest(TestCase): fixtures = [ '0_types.yaml', '1_attributes.yaml', '2_layers.yaml', '3_prefixes.yaml' ] def setUp(self): self.client = login_as_su() self.service = CI( name='allegro.pl', type=CIType.objects.get(id=CI_TYPES.SERVICE) ) self.service.save() self.db_service = CI.objects.get(id=self.service.id) self.venture = CI( name='allegro_prod', type=CIType.objects.get(id=CI_TYPES.VENTURE) ) self.venture.save() self.ci_venture = CI.objects.get(id=self.venture.id) self.relation = CIRelation( parent=self.ci_venture, child=self.db_service, type=CI_RELATION_TYPES.CONTAINS, ) self.relation.save() def test_user_login(self): self.assertTrue(self.client) def test_reports_devices(self): self.assertEqual(self.service.name, 'allegro.pl') self.assertEqual(self.db_service.name, self.service.name) def test_reports_venture(self): self.assertEqual(self.venture.name, 'allegro_prod') self.assertEqual(self.ci_venture.name, self.venture.name) def test_reports_relation(self): self.assertEqual(self.relation.child.type_id, CI_TYPES.SERVICE) self.assertEqual(self.relation.parent.type_id, CI_TYPES.VENTURE) self.assertNotEqual(self.relation.child.type_id, CI_TYPES.VENTURE) def test_reports_views(self): url = '/ui/reports/services/' report = self.client.get(url, follow=True) self.assertEqual(report.status_code, 200) invalid_relation = report.context['invalid_relation'] services_without_venture = report.context['services_without_venture'] self.assertEqual(invalid_relation[0].name, 'allegro.pl') self.assertEqual(len(invalid_relation), 1) self.assertEqual(len(services_without_venture), 0) # local service for tests service = CI(name='ceneo.pl', type=CIType.objects.get( id=CI_TYPES.SERVICE) ) service.save() # local venture for tests venture = CI(name='allegro_prod', type=CIType.objects.get( id=CI_TYPES.VENTURE) ) venture.save() reload_report = self.client.get(url, follow=True) re_invalid_relation = reload_report.context['invalid_relation'] re_services_without_venture = reload_report.context['services_without_venture'] self.assertEqual(len(re_invalid_relation), 1) self.assertEqual(len(re_services_without_venture), 0)
def all_ownerships(self): ci = CI.get_by_content_object(self) if not ci: return [] return CIOwnership.objects.filter(ci=ci)
class CMDBApiTest(UserTestCase): def setUp(self): self.layers = CILayer.objects.all() self.types = CIType.objects.all() self.create_owners() self.create_cis() self.create_ownerships() self.create_attributes() self.create_relations() super(CMDBApiTest, self).setUp() def create_owners(self): self.owner1 = CIOwnerFactory() self.owner2 = CIOwnerFactory() def create_cis(self): self.ci1 = CI( uid='uid-ci1', type=self.types[0], barcode='barcodeci1', name='ciname1', ) self.ci1.save() self.ci1.layers = [self.layers[0].id, self.layers[1].id] self.ci1.save() self.ci2 = CI( uid='uid-ci2', type=self.types[1], barcode='barcodeci2', name='ciname2', ) self.ci2.save() self.ci2.layers = [self.layers[0].id] self.ci2.save() self.ci3 = CI( uid='other-ci3', type=self.types[1], barcode='otherbarcodeci3', name='otherci', ) self.ci3.save() self.ci3.layers = [self.layers[1].id] self.ci3.save() def create_ownerships(self): self.ciownership1 = CIOwnership( ci=self.ci1, owner=self.owner1, type=CIOwnershipType.technical, ) self.ciownership1.save() self.ciownership2 = CIOwnership( ci=self.ci1, owner=self.owner2, type=CIOwnershipType.business, ) self.ciownership2.save() self.ciownership3 = CIOwnership( ci=self.ci2, owner=self.owner2, type=CIOwnershipType.business, ) self.ciownership3.save() def create_relations(self): self.relation1 = CIRelation( parent=self.ci1, child=self.ci2, type=CI_RELATION_TYPES.CONTAINS, ) self.relation1.save() self.relation2 = CIRelation( parent=self.ci2, child=self.ci3, type=CI_RELATION_TYPES.HASROLE, ) self.relation2.save() def create_attributes(self): self.attribute1 = CIAttribute( name='Attribute 1', attribute_type=CI_ATTRIBUTE_TYPES.INTEGER, choices='', ) self.attribute1.save() self.attribute1.ci_types.add(self.types[0]), self.attribute_value1 = CIAttributeValue( ci=self.ci1, attribute=self.attribute1, ) self.attribute_value1.value = 10 self.attribute_value1.save() def test_layers(self): path = "/api/v0.9/cilayers/" response = self.get(path) json_string = response.content json_data = json.loads(json_string) resource_uris = [ ci_layer['resource_uri'] for ci_layer in json_data['objects'] ] response = self.get(resource_uris[0]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.layers[0].name) response = self.get(resource_uris[1]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.layers[1].name) def test_types(self): path = "/api/v0.9/citypes/" response = self.get(path=path) json_string = response.content json_data = json.loads(json_string) resource_uris = [ ci_type['resource_uri'] for ci_type in json_data['objects'] ] response = self.get(path=resource_uris[0]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.types[0].name) response = self.get(resource_uris[1]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.types[1].name) def test_ci(self): path = "/api/v0.9/ci/" response = self.get(path) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci['resource_uri'] for ci in json_data['objects']] response = self.get(resource_uris[0]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['layers'][1]['name'], self.layers[1].name) self.assertEqual(json_data['barcode'], self.ci1.barcode) self.assertEqual(json_data['name'], self.ci1.name) self.assertEqual(json_data['type']['name'], self.ci1.type.name) self.assertEqual(json_data['uid'], self.ci1.uid) self.assertEqual( json_data['technical_owners'][0]['first_name'], self.owner1.first_name, ) self.assertEqual( json_data['business_owners'][0]['first_name'], self.owner2.first_name, ) response = self.get(resource_uris[1]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['barcode'], self.ci2.barcode) self.assertEqual(json_data['name'], self.ci2.name) self.assertEqual(json_data['type']['name'], self.ci2.type.name) self.assertEqual(json_data['uid'], self.ci2.uid) self.assertFalse(json_data['technical_owners']) self.assertEqual( json_data['business_owners'][0]['first_name'], self.owner2.first_name, ) def test_ownership(self): """Test the direct and effective ownerships.""" path1 = '/api/v0.9/ci/{}/'.format(self.ci1.id) path3 = '/api/v0.9/ci/{}/'.format(self.ci3.id) ci1_data = json.loads(self.get(path1).content) ci3_data = json.loads(self.get(path3).content) # CI1 has its own owners self.assertListEqual( ci1_data['business_owners'], ci1_data['effective_business_owners'] ) # CI3 inherits owners from CI1 self.assertListEqual(ci3_data['business_owners'], []) self.assertListEqual( ci3_data['effective_business_owners'], ci1_data['business_owners'] ) def test_post_ci(self): """POST to ci collection should create a new CI""" ci_count_before = CI.objects.count() ci_data = json.dumps({ 'uid': 'uid-ci-api-1', 'type': '/api/v0.9/citypes/{0}/'.format(self.types[0].id), 'barcode': 'barcodeapi1', 'name': 'ciname from api 1', 'layers': ['/api/v0.9/cilayers/5/'], 'business_owners': [ '/api/v0.9/ciowners/{0}/'.format(self.owner1.id) ], 'technical_owners': [ '/api/v0.9/ciowners/{0}/'.format(self.owner2.id) ], 'attributes': [ { 'name': 'SLA value', 'value': 0.7, }, { 'name': 'Documentation Link', 'value': 'http://www.gutenberg.org/files/27827/' '27827-h/27827-h.htm', }, ], }) resp = self.post( '/api/v0.9/ci/?', ci_data, content_type='application/json', ) self.assertEqual(CI.objects.count(), ci_count_before + 1) created_id = int(resp['Location'].split('/')[-2]) created = CI.objects.get(pk=created_id) self.assertEqual(created.name, 'ciname from api 1') self.assertSetEqual( set(created.business_owners.all()), {self.owner1}, ) self.assertSetEqual( set(av.value for av in created.ciattributevalue_set.all()), { 0.7, 'http://www.gutenberg.org/files/27827/27827-h/27827-h.htm', }, ) def test_put_ci(self): """PUT should edit existing CI""" ci_count_before = CI.objects.count() ci_data = json.dumps({ 'uid': 'uid-ci-api-1', 'type': '/api/v0.9/citypes/{0}/'.format(self.types[0].id), 'barcode': 'barcodeapi1', 'name': 'ciname from api 1', 'layers': ['/api/v0.9/cilayers/5/'], 'business_owners': [ '/api/v0.9/ciowners/{0}/'.format(self.owner1.id) ], 'technical_owners': [ '/api/v0.9/ciowners/{0}/'.format(self.owner2.id) ], 'related': [], 'attributes': [ { 'name': 'SLA value', 'value': 0.7, }, { 'name': 'Documentation Link', 'value': 'http://www.gutenberg.org/files/27827/' '27827-h/27827-h.htm', }, ], }) self.put( '/api/v0.9/ci/{0}/'.format( self.ci1.id, ), ci_data, content_type='application/json', ) self.assertEqual(CI.objects.count(), ci_count_before) edited = CI.objects.get(pk=self.ci1.id) self.assertEqual(edited.name, 'ciname from api 1') self.assertSetEqual( set(edited.business_owners.all()), {self.owner1}, ) self.assertSetEqual( set(av.value for av in edited.ciattributevalue_set.all()), { 0.7, 'http://www.gutenberg.org/files/27827/27827-h/27827-h.htm', }, ) def test_patch(self): """PATCH should edit some attributes.""" ci_count_before = CI.objects.count() ci_data = json.dumps({ 'business_owners': [ '/api/v0.9/ciowners/{0}/'.format(self.owner1.id) ], 'technical_owners': [ '/api/v0.9/ciowners/{0}/'.format(self.owner2.id) ], 'attributes': [ { 'name': 'SLA value', 'value': 0.7, }, { 'name': 'Documentation Link', 'value': 'http://www.gutenberg.org/files/27827/' '27827-h/27827-h.htm', }, ], }) self.patch( '/api/v0.9/ci/{0}/'.format(self.ci1.id), ci_data, CONTENT_TYPE='application/json' ) self.assertEqual(CI.objects.count(), ci_count_before) edited = CI.objects.get(pk=self.ci1.id) self.assertEqual(edited.name, 'ciname1') self.assertEqual(edited.uid, 'uid-ci1') self.assertSetEqual( set(edited.business_owners.all()), {self.owner1}, ) self.assertSetEqual( set(av.value for av in edited.ciattributevalue_set.all()), { 0.7, 'http://www.gutenberg.org/files/27827/27827-h/27827-h.htm', }, ) def test_patch_relations(self): """A test for adding relations via 0.10 version of API.""" ci_data = json.dumps({ 'related': [ { 'dir': 'INCOMING', 'type': 'HASROLE', 'id': self.ci2.id, }, { 'dir': 'OUTGOING', 'type': 'CONTAINS', 'id': self.ci3.id, } ], }) req_data = { 'CONTENT_LENGTH': len(ci_data), 'CONTENT_TYPE': 'application/json', 'PATH_INFO': '/api/v0.10/ci/{0}/'.format(self.ci1.id), 'REQUEST_METHOD': 'PATCH', 'wsgi.input': FakePayload(ci_data), } req_data.update(self.headers) self.client.request(**req_data) rel1 = CIRelation.objects.get( child_id=self.ci1.id, parent_id=self.ci2.id, type=CI_RELATION_TYPES.HASROLE.id, ) rel2 = CIRelation.objects.get( child_id=self.ci3.id, parent_id=self.ci1.id, type=CI_RELATION_TYPES.CONTAINS.id, ) def test_get_attribute(self): path = "/api/v0.9/ci/{0}/".format(self.ci1.id) response = self.get(path) json_string = response.content json_data = json.loads(json_string) self.assertListEqual(json_data['attributes'], [ {'name': 'Attribute 1', 'value': 10} ]) def test_relations(self): path = "/api/v0.9/cirelation/" response = self.get(path) json_string = response.content json_data = json.loads(json_string) resource_uris = [ ci_relation['resource_uri'] for ci_relation in json_data['objects'] ] response = self.get(resource_uris[0]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['parent'], self.ci1.id) self.assertEqual(json_data['child'], self.ci2.id) self.assertEqual(json_data['type'], CI_RELATION_TYPES.CONTAINS) response = self.get(resource_uris[1]) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['parent'], self.ci2.id) self.assertEqual(json_data['child'], self.ci3.id) self.assertEqual(json_data['type'], CI_RELATION_TYPES.HASROLE) def test_ci_filter_exact(self): path = "/api/v0.9/ci/" data = {'name__exact': 'otherci'} response = self.get(path, data=data) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci['resource_uri'] for ci in json_data['objects']] self.assertEqual(len(resource_uris), 1) response = self.get(resource_uris[0], data) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[1].name) self.assertEqual(json_data['barcode'], self.ci3.barcode) self.assertEqual(json_data['name'], self.ci3.name) self.assertEqual(json_data['type']['name'], self.ci3.type.name) self.assertEqual(json_data['uid'], self.ci3.uid) def test_ci_filter_startswith(self): path = "/api/v0.9/ci/" data = {'name__startswith': 'ciname'} response = self.get(path=path, data=data) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci['resource_uri'] for ci in json_data['objects']] self.assertEqual(len(resource_uris), 2) response = self.get(resource_uris[0], data=data) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['barcode'], self.ci1.barcode) self.assertEqual(json_data['name'], self.ci1.name) self.assertEqual(json_data['type']['name'], self.ci1.type.name) self.assertEqual(json_data['uid'], self.ci1.uid) response = self.get(resource_uris[1], data=data) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['barcode'], self.ci2.barcode) self.assertEqual(json_data['name'], self.ci2.name) self.assertEqual(json_data['type']['name'], self.ci2.type.name) self.assertEqual(json_data['uid'], self.ci2.uid) def test_filter_related(self): path = "/api/v0.10/ci/" data = {'parent': self.ci1.id, 'child': self.ci3.id} response = self.get(path=path, data=data) json_data = json.loads(response.content) self.assertEqual(len(json_data['objects']), 1) self.assertEqual(json_data['objects'][0]['id'], self.ci2.id)
class TestReportsServices(TestCase): fixtures = [ '0_types.yaml', '1_attributes.yaml', '2_layers.yaml', '3_prefixes.yaml' ] def setUp(self): self.client = login_as_su() self.service = CI( name='allegro.pl', type=CIType.objects.get(id=CI_TYPES.SERVICE) ) self.service.save() self.db_service = CI.objects.get(id=self.service.id) self.venture = CI( name='allegro_prod', type=CIType.objects.get(id=CI_TYPES.VENTURE) ) self.venture.save() self.ci_venture = CI.objects.get(id=self.venture.id) self.relation = CIRelation( parent=self.ci_venture, child=self.db_service, type=CI_RELATION_TYPES.CONTAINS, ) self.relation.save() def test_user_login(self): self.assertTrue(self.client) def test_reports_devices(self): self.assertEqual(self.service.name, 'allegro.pl') self.assertEqual(self.db_service.name, self.service.name) def test_reports_venture(self): self.assertEqual(self.venture.name, 'allegro_prod') self.assertEqual(self.ci_venture.name, self.venture.name) def test_reports_relation(self): self.assertEqual(self.relation.child.type_id, CI_TYPES.SERVICE) self.assertEqual(self.relation.parent.type_id, CI_TYPES.VENTURE) self.assertNotEqual(self.relation.child.type_id, CI_TYPES.VENTURE) def test_reports_client(self): url = '/ui/reports/services/' report = self.client.get(url, follow=True) self.assertEqual(report.status_code, 200) invalid_relation = report.context['invalid_relation'] serv_without_ven = report.context['serv_without_ven'] self.assertEqual(invalid_relation[0].name, 'allegro.pl') self.assertEqual(len(invalid_relation), 1) self.assertEqual(len(serv_without_ven), 0) # local service for tests service = CI(name='ceneo.pl', type=CIType.objects.get( id=CI_TYPES.SERVICE) ) service.save() # local venture for tests venture = CI(name='allegro_prod', type=CIType.objects.get( id=CI_TYPES.VENTURE) ) venture.save() reload_report = self.client.get(url, follow=True) re_invalid_relation = reload_report.context['invalid_relation'] re_serv_without_ven = reload_report.context['serv_without_ven'] self.assertEqual(len(re_invalid_relation), 1) self.assertEqual(len(re_serv_without_ven), 1)
def setUp(self): engine = settings.ISSUETRACKERS['default']['ENGINE'] if engine != '': raise ImproperlyConfigured( '''Expected ISSUETRACKERS['default']['ENGINE']='' got: %r''' % engine) # usual stuff self.top_venture = Venture(name='top_venture') self.top_venture.save() self.child_venture = Venture(name='child_venture', parent=self.top_venture) self.child_venture.save() self.role = VentureRole(name='role', venture=self.child_venture) self.role.save() self.child_role = VentureRole( name='child_role', venture=self.child_venture, parent=self.role, ) self.child_role.save() to = CIOwner( first_name='Bufallo', last_name='Kudłaczek', ) to.save() bo = CIOwner( first_name='Bill', last_name='Bąbelek', ) bo.save() ct = ContentType.objects.get_for_model(self.top_venture) CIImporter().import_all_ci([ct]) CIOwnership(owner=to, ci=CI.get_by_content_object(self.child_venture), type=CIOwnershipType.technical.id).save() CIOwnership(owner=bo, ci=CI.get_by_content_object(self.child_venture), type=CIOwnershipType.business.id).save() dm = self.add_model('DC model sample', DeviceType.data_center.id) self.dc = Device.create(sn='sn1', model=dm) self.dc.name = 'dc' self.dc.save() dm = self.add_model('Rack model sample', DeviceType.rack_server.id) self.rack = Device.create( venture=self.child_venture, sn='sn2', model=dm, ) self.rack.parent = self.dc self.rack.name = 'rack' self.rack.save() dm = self.add_model('Blade model sample', DeviceType.blade_server.id) self.blade = Device.create(venture=self.child_venture, venturerole=self.child_role, sn='sn3', model=dm) self.blade.name = 'blade' self.blade.parent = self.rack self.blade.save() self.deployment = Deployment() self.deployment.hostname = 'test_host2' self.deployment.device = self.blade self.deployment.mac = '10:9a:df:6f:af:01' self.deployment.ip = '192.168.1.1' self.deployment.hostname = 'test' self.deployment.save()
def ralph_obj_all_ownerships(obj): ci = CI.get_by_content_object(obj) if not ci: return [] return CIOwnership.objects.filter(ci=ci)
class CMDBApiTest(TestCase): def setUp(self): self.user = create_user('api_user', '*****@*****.**', 'password') self.layers = CILayer.objects.all() self.types = CIType.objects.all() self.create_owners() self.create_cis() self.create_ownerships() self.create_relations() self.data = { 'format': 'json', 'username': self.user.username, 'api_key': self.user.api_key.key } cache.delete("api_user_accesses") def create_owners(self): self.owner1 = CIOwner( first_name='first_name_owner1', last_name='last_name_owner1', email='*****@*****.**', ) self.owner1.save() self.owner2 = CIOwner( first_name='first_name_owner2', last_name='last_name_owner2', email='*****@*****.**', ) self.owner2.save() def create_cis(self): self.ci1 = CI( uid='uid-ci1', type=self.types[0], barcode='barcodeci1', name='ciname1', ) self.ci1.save() self.ci1.layers = [self.layers[0].id, self.layers[1].id] self.ci1.save() self.ci2 = CI( uid='uid-ci2', type=self.types[1], barcode='barcodeci2', name='ciname2', ) self.ci2.save() self.ci2.layers = [self.layers[0].id] self.ci2.save() self.ci3 = CI( uid='other-ci3', type=self.types[1], barcode='otherbarcodeci3', name='otherci', ) self.ci3.save() self.ci3.layers = [self.layers[1].id] self.ci3.save() def create_ownerships(self): self.ciownership1 = CIOwnership( ci=self.ci1, owner=self.owner1, type=CIOwnershipType.technical, ) self.ciownership1.save() self.ciownership2 = CIOwnership( ci=self.ci1, owner=self.owner2, type=CIOwnershipType.business, ) self.ciownership2.save() self.ciownership3 = CIOwnership( ci=self.ci2, owner=self.owner2, type=CIOwnershipType.business, ) self.ciownership3.save() def create_relations(self): self.relation1 = CIRelation( parent=self.ci1, child=self.ci2, type=CI_RELATION_TYPES.CONTAINS, ) self.relation1.save() self.relation2 = CIRelation( parent=self.ci2, child=self.ci3, type=CI_RELATION_TYPES.HASROLE, ) self.relation2.save() def test_layers(self): path = "/api/v0.9/cilayers/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [ ci_layer['resource_uri'] for ci_layer in json_data['objects'] ] response = self.client.get( path=resource_uris[0], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.layers[0].name) response = self.client.get( path=resource_uris[1], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.layers[1].name) def test_types(self): path = "/api/v0.9/citypes/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [ ci_type['resource_uri'] for ci_type in json_data['objects'] ] response = self.client.get( path=resource_uris[0], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.types[0].name) response = self.client.get( path=resource_uris[1], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.types[1].name) def test_ci(self): path = "/api/v0.9/ci/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [ci['resource_uri'] for ci in json_data['objects']] response = self.client.get( path=resource_uris[0], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['layers'][1]['name'], self.layers[1].name) self.assertEqual(json_data['barcode'], self.ci1.barcode) self.assertEqual(json_data['name'], self.ci1.name) self.assertEqual(json_data['type']['name'], self.ci1.type.name) self.assertEqual(json_data['uid'], self.ci1.uid) self.assertEqual( json_data['technical_owners'][0]['username'], '{}.{}'.format(self.owner1.first_name, self.owner1.last_name)) self.assertEqual( json_data['business_owners'][0]['username'], '{}.{}'.format(self.owner2.first_name, self.owner2.last_name)) response = self.client.get( path=resource_uris[1], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['barcode'], self.ci2.barcode) self.assertEqual(json_data['name'], self.ci2.name) self.assertEqual(json_data['type']['name'], self.ci2.type.name) self.assertEqual(json_data['uid'], self.ci2.uid) self.assertFalse(json_data['technical_owners']) self.assertEqual( json_data['business_owners'][0]['username'], '{}.{}'.format(self.owner2.first_name, self.owner2.last_name)) def test_relations(self): path = "/api/v0.9/cirelation/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [ ci_relation['resource_uri'] for ci_relation in json_data['objects'] ] response = self.client.get( path=resource_uris[0], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['parent'], self.ci1.id) self.assertEqual(json_data['child'], self.ci2.id) self.assertEqual(json_data['type'], CI_RELATION_TYPES.CONTAINS) response = self.client.get( path=resource_uris[1], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['parent'], self.ci2.id) self.assertEqual(json_data['child'], self.ci3.id) self.assertEqual(json_data['type'], CI_RELATION_TYPES.HASROLE) def test_ci_filter_exact(self): path = "/api/v0.9/ci/" data = self.data.copy() data['name__exact'] = 'otherci' response = self.client.get(path=path, data=data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [ci['resource_uri'] for ci in json_data['objects']] self.assertEqual(len(resource_uris), 1) response = self.client.get( path=resource_uris[0], data=data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[1].name) self.assertEqual(json_data['barcode'], self.ci3.barcode) self.assertEqual(json_data['name'], self.ci3.name) self.assertEqual(json_data['type']['name'], self.ci3.type.name) self.assertEqual(json_data['uid'], self.ci3.uid) def test_ci_filter_startswith(self): data = self.data.copy() path = "/api/v0.9/ci/" data['name__startswith'] = 'ciname' response = self.client.get(path=path, data=data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [ci['resource_uri'] for ci in json_data['objects']] self.assertEqual(len(resource_uris), 2) response = self.client.get( path=resource_uris[0], data=data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['barcode'], self.ci1.barcode) self.assertEqual(json_data['name'], self.ci1.name) self.assertEqual(json_data['type']['name'], self.ci1.type.name) self.assertEqual(json_data['uid'], self.ci1.uid) response = self.client.get( path=resource_uris[1], data=data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name) self.assertEqual(json_data['barcode'], self.ci2.barcode) self.assertEqual(json_data['name'], self.ci2.name) self.assertEqual(json_data['type']['name'], self.ci2.type.name) self.assertEqual(json_data['uid'], self.ci2.uid)
class CMDBApiTest(TestCase): def setUp(self): self.user = create_user("api_user", "*****@*****.**", "password") self.layers = CILayer.objects.all() self.types = CIType.objects.all() self.create_owners() self.create_cis() self.create_ownerships() self.create_attributes() self.create_relations() self.headers = { "HTTP_ACCEPT": "application/json", "HTTP_AUTHORIZATION": "ApiKey {}:{}".format(self.user.username, self.user.api_key.key), } cache.delete("api_user_accesses") def create_owners(self): self.owner1 = CIOwner( first_name="first_name_owner1", last_name="last_name_owner1", email="*****@*****.**", ) self.owner1.save() self.owner2 = CIOwner( first_name="first_name_owner2", last_name="last_name_owner2", email="*****@*****.**", ) self.owner2.save() def create_cis(self): self.ci1 = CI(uid="uid-ci1", type=self.types[0], barcode="barcodeci1", name="ciname1") self.ci1.save() self.ci1.layers = [self.layers[0].id, self.layers[1].id] self.ci1.save() self.ci2 = CI(uid="uid-ci2", type=self.types[1], barcode="barcodeci2", name="ciname2") self.ci2.save() self.ci2.layers = [self.layers[0].id] self.ci2.save() self.ci3 = CI(uid="other-ci3", type=self.types[1], barcode="otherbarcodeci3", name="otherci") self.ci3.save() self.ci3.layers = [self.layers[1].id] self.ci3.save() def create_ownerships(self): self.ciownership1 = CIOwnership(ci=self.ci1, owner=self.owner1, type=CIOwnershipType.technical) self.ciownership1.save() self.ciownership2 = CIOwnership(ci=self.ci1, owner=self.owner2, type=CIOwnershipType.business) self.ciownership2.save() self.ciownership3 = CIOwnership(ci=self.ci2, owner=self.owner2, type=CIOwnershipType.business) self.ciownership3.save() def create_relations(self): self.relation1 = CIRelation(parent=self.ci1, child=self.ci2, type=CI_RELATION_TYPES.CONTAINS) self.relation1.save() self.relation2 = CIRelation(parent=self.ci2, child=self.ci3, type=CI_RELATION_TYPES.HASROLE) self.relation2.save() def create_attributes(self): self.attribute1 = CIAttribute(name="Attribute 1", attribute_type=CI_ATTRIBUTE_TYPES.INTEGER, choices="") self.attribute1.save() self.attribute1.ci_types.add(self.types[0]), self.attribute_value1 = CIAttributeValue(ci=self.ci1, attribute=self.attribute1) self.attribute_value1.value = 10 self.attribute_value1.save() def test_layers(self): path = "/api/v0.9/cilayers/" response = self.client.get(path=path, **self.headers) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci_layer["resource_uri"] for ci_layer in json_data["objects"]] response = self.client.get(path=resource_uris[0], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["name"], self.layers[0].name) response = self.client.get(resource_uris[1], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["name"], self.layers[1].name) def test_types(self): path = "/api/v0.9/citypes/" response = self.client.get(path=path, **self.headers) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci_type["resource_uri"] for ci_type in json_data["objects"]] response = self.client.get(path=resource_uris[0], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["name"], self.types[0].name) response = self.client.get(resource_uris[1], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["name"], self.types[1].name) def test_ci(self): path = "/api/v0.9/ci/" response = self.client.get(path, **self.headers) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci["resource_uri"] for ci in json_data["objects"]] response = self.client.get(resource_uris[0], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name) self.assertEqual(json_data["layers"][1]["name"], self.layers[1].name) self.assertEqual(json_data["barcode"], self.ci1.barcode) self.assertEqual(json_data["name"], self.ci1.name) self.assertEqual(json_data["type"]["name"], self.ci1.type.name) self.assertEqual(json_data["uid"], self.ci1.uid) self.assertEqual(json_data["technical_owners"][0]["first_name"], self.owner1.first_name) self.assertEqual(json_data["business_owners"][0]["first_name"], self.owner2.first_name) response = self.client.get(resource_uris[1], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name) self.assertEqual(json_data["barcode"], self.ci2.barcode) self.assertEqual(json_data["name"], self.ci2.name) self.assertEqual(json_data["type"]["name"], self.ci2.type.name) self.assertEqual(json_data["uid"], self.ci2.uid) self.assertFalse(json_data["technical_owners"]) self.assertEqual(json_data["business_owners"][0]["first_name"], self.owner2.first_name) def test_ownership(self): """Test the direct and effective ownerships.""" path1 = "/api/v0.9/ci/{}/".format(self.ci1.id) path3 = "/api/v0.9/ci/{}/".format(self.ci3.id) ci1_data = json.loads(self.client.get(path1, **self.headers).content) ci3_data = json.loads(self.client.get(path3, **self.headers).content) # CI1 has its own owners self.assertListEqual(ci1_data["business_owners"], ci1_data["effective_business_owners"]) # CI3 inherits owners from CI1 self.assertListEqual(ci3_data["business_owners"], []) self.assertListEqual(ci3_data["effective_business_owners"], ci1_data["business_owners"]) def test_post_ci(self): """POST to ci collection should create a new CI""" ci_count_before = CI.objects.count() ci_data = json.dumps( { "uid": "uid-ci-api-1", "type": "/api/v0.9/citypes/{0}/".format(self.types[0].id), "barcode": "barcodeapi1", "name": "ciname from api 1", "layers": ["/api/v0.9/cilayers/5/"], "business_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner1.id)], "technical_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner2.id)], "attributes": [ {"name": "SLA value", "value": 0.7}, { "name": "Documentation Link", "value": "http://www.gutenberg.org/files/27827/" "27827-h/27827-h.htm", }, ], } ) resp = self.client.post("/api/v0.9/ci/?", ci_data, content_type="application/json", **self.headers) self.assertEqual(CI.objects.count(), ci_count_before + 1) created_id = int(resp["Location"].split("/")[-2]) created = CI.objects.get(pk=created_id) self.assertEqual(created.name, "ciname from api 1") self.assertSetEqual(set(created.business_owners.all()), {self.owner1}) self.assertSetEqual( set(av.value for av in created.ciattributevalue_set.all()), {0.7, "http://www.gutenberg.org/files/27827/27827-h/27827-h.htm"}, ) def test_put_ci(self): """PUT should edit existing CI""" ci_count_before = CI.objects.count() ci_data = json.dumps( { "uid": "uid-ci-api-1", "type": "/api/v0.9/citypes/{0}/".format(self.types[0].id), "barcode": "barcodeapi1", "name": "ciname from api 1", "layers": ["/api/v0.9/cilayers/5/"], "business_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner1.id)], "technical_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner2.id)], "attributes": [ {"name": "SLA value", "value": 0.7}, { "name": "Documentation Link", "value": "http://www.gutenberg.org/files/27827/" "27827-h/27827-h.htm", }, ], } ) self.client.put( "/api/v0.9/ci/{0}/".format(self.ci1.id), ci_data, content_type="application/json", **self.headers ) self.assertEqual(CI.objects.count(), ci_count_before) edited = CI.objects.get(pk=self.ci1.id) self.assertEqual(edited.name, "ciname from api 1") self.assertSetEqual(set(edited.business_owners.all()), {self.owner1}) self.assertSetEqual( set(av.value for av in edited.ciattributevalue_set.all()), {0.7, "http://www.gutenberg.org/files/27827/27827-h/27827-h.htm"}, ) def test_patch(self): """PATCH should edit some attributes.""" ci_count_before = CI.objects.count() ci_data = json.dumps( { "business_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner1.id)], "technical_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner2.id)], "attributes": [ {"name": "SLA value", "value": 0.7}, { "name": "Documentation Link", "value": "http://www.gutenberg.org/files/27827/" "27827-h/27827-h.htm", }, ], } ) req_data = { "CONTENT_LENGTH": len(ci_data), "CONTENT_TYPE": "application/json", "PATH_INFO": "/api/v0.9/ci/{0}/".format(self.ci1.id), "REQUEST_METHOD": "PATCH", "wsgi.input": FakePayload(ci_data), } req_data.update(self.headers) self.client.request(**req_data) self.assertEqual(CI.objects.count(), ci_count_before) edited = CI.objects.get(pk=self.ci1.id) self.assertEqual(edited.name, "ciname1") self.assertEqual(edited.uid, "uid-ci1") self.assertSetEqual(set(edited.business_owners.all()), {self.owner1}) self.assertSetEqual( set(av.value for av in edited.ciattributevalue_set.all()), {0.7, "http://www.gutenberg.org/files/27827/27827-h/27827-h.htm"}, ) def test_get_attribute(self): path = "/api/v0.9/ci/{0}/".format(self.ci1.id) response = self.client.get(path, **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertListEqual(json_data["attributes"], [{"name": "Attribute 1", "value": 10}]) def test_relations(self): path = "/api/v0.9/cirelation/" response = self.client.get(path, **self.headers) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci_relation["resource_uri"] for ci_relation in json_data["objects"]] response = self.client.get(resource_uris[0], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["parent"], self.ci1.id) self.assertEqual(json_data["child"], self.ci2.id) self.assertEqual(json_data["type"], CI_RELATION_TYPES.CONTAINS) response = self.client.get(resource_uris[1], **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["parent"], self.ci2.id) self.assertEqual(json_data["child"], self.ci3.id) self.assertEqual(json_data["type"], CI_RELATION_TYPES.HASROLE) def test_ci_filter_exact(self): path = "/api/v0.9/ci/" data = {"name__exact": "otherci"} response = self.client.get(path, data=data, **self.headers) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci["resource_uri"] for ci in json_data["objects"]] self.assertEqual(len(resource_uris), 1) response = self.client.get(resource_uris[0], data, **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["layers"][0]["name"], self.layers[1].name) self.assertEqual(json_data["barcode"], self.ci3.barcode) self.assertEqual(json_data["name"], self.ci3.name) self.assertEqual(json_data["type"]["name"], self.ci3.type.name) self.assertEqual(json_data["uid"], self.ci3.uid) def test_ci_filter_startswith(self): path = "/api/v0.9/ci/" data = {"name__startswith": "ciname"} response = self.client.get(path=path, data=data, **self.headers) json_string = response.content json_data = json.loads(json_string) resource_uris = [ci["resource_uri"] for ci in json_data["objects"]] self.assertEqual(len(resource_uris), 2) response = self.client.get(resource_uris[0], data=data, **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name) self.assertEqual(json_data["barcode"], self.ci1.barcode) self.assertEqual(json_data["name"], self.ci1.name) self.assertEqual(json_data["type"]["name"], self.ci1.type.name) self.assertEqual(json_data["uid"], self.ci1.uid) response = self.client.get(resource_uris[1], data=data, **self.headers) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name) self.assertEqual(json_data["barcode"], self.ci2.barcode) self.assertEqual(json_data["name"], self.ci2.name) self.assertEqual(json_data["type"]["name"], self.ci2.type.name) self.assertEqual(json_data["uid"], self.ci2.uid)
class CMDBApiTest(TestCase): def setUp(self): self.create_user() self.create_cilayers() self.create_citypes() self.create_owners() self.create_cis() self.create_ownerships() self.create_relations() def create_user(self): self.user = User.objects.create_user( 'api_user', '*****@*****.**', 'password' ) self.user.save() self.api_key = ApiKey.objects.get(user=self.user) self.data = { 'format': 'json', 'username': self.user.username, 'api_key': self.api_key.key } cache.delete("api_user_accesses") def create_cilayers(self): self.cilayer1 = CILayer(name='layer1') self.cilayer1.save() self.cilayer2 = CILayer(name='layer2') self.cilayer2.save() def create_citypes(self): self.citype1 = CIType(name='type1') self.citype1.save() self.citype2 = CIType(name='type2') self.citype2.save() def create_owners(self): self.owner1 = CIOwner( first_name='first_name_owner1', last_name='last_name_owner1', email='*****@*****.**' ) self.owner1.save() self.owner2 = CIOwner( first_name='first_name_owner2', last_name='last_name_owner2', email='*****@*****.**' ) self.owner2.save() def create_cis(self): self.ci1 = CI( uid='uid-ci1', type=self.citype1, barcode='barcodeci1', name='ciname1', ) self.ci1.save() self.ci1.layers = [self.cilayer1, self.cilayer2] self.ci1.save() self.ci2 = CI( uid='uid-ci2', type=self.citype2, barcode='barcodeci2', name='ciname2', ) self.ci2.save() self.ci2.layers = [self.cilayer1] self.ci2.save() self.ci3 = CI( uid='other-ci3', type=self.citype2, barcode='otherbarcodeci3', name='otherci', ) self.ci3.save() self.ci3.layers = [self.cilayer2] self.ci3.save() def create_ownerships(self): self.ciownership1 = CIOwnership( ci=self.ci1, owner=self.owner1, type=CIOwnershipType.technical ) self.ciownership1.save() self.ciownership2 = CIOwnership( ci=self.ci1, owner=self.owner2, type=CIOwnershipType.business ) self.ciownership2.save() self.ciownership3 = CIOwnership( ci=self.ci2, owner=self.owner2, type=CIOwnershipType.business ) self.ciownership3.save() def create_relations(self): self.relation1 = CIRelation( parent=self.ci1, child=self.ci2, type=CI_RELATION_TYPES.CONTAINS, ) self.relation1.save() self.relation2 = CIRelation( parent=self.ci2, child=self.ci3, type=CI_RELATION_TYPES.HASROLE, ) self.relation2.save() def test_layers(self): path = "/api/v0.9/cilayers/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [x['resource_uri'] for x in json_data['objects']] response = self.client.get( path=resource_uris[0], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.cilayer1.name) response = self.client.get( path=resource_uris[1], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.cilayer2.name) def test_types(self): path = "/api/v0.9/citypes/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [x['resource_uri'] for x in json_data['objects']] response = self.client.get( path=resource_uris[0], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.citype1.name) response = self.client.get( path=resource_uris[1], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['name'], self.citype2.name) def test_ci(self): path = "/api/v0.9/ci/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [x['resource_uri'] for x in json_data['objects']] response = self.client.get( path=resource_uris[0], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name) self.assertEqual(json_data['layers'][1]['name'], self.cilayer2.name) self.assertEqual(json_data['barcode'], self.ci1.barcode) self.assertEqual(json_data['name'], self.ci1.name) self.assertEqual(json_data['type']['name'], self.ci1.type.name) self.assertEqual(json_data['uid'], self.ci1.uid) self.assertEqual( json_data['technical_owners'][0]['username'], '{}.{}'.format(self.owner1.first_name, self.owner1.last_name) ) self.assertEqual( json_data['business_owners'][0]['username'], '{}.{}'.format(self.owner2.first_name, self.owner2.last_name) ) response = self.client.get( path=resource_uris[1], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name) self.assertEqual(json_data['barcode'], self.ci2.barcode) self.assertEqual(json_data['name'], self.ci2.name) self.assertEqual(json_data['type']['name'], self.ci2.type.name) self.assertEqual(json_data['uid'], self.ci2.uid) self.assertFalse(json_data['technical_owners']) self.assertEqual( json_data['business_owners'][0]['username'], '{}.{}'.format(self.owner2.first_name, self.owner2.last_name) ) def test_relations(self): path = "/api/v0.9/cirelation/" response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [x['resource_uri'] for x in json_data['objects']] response = self.client.get( path=resource_uris[0], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['parent'], self.ci1.id) self.assertEqual(json_data['child'], self.ci2.id) self.assertEqual(json_data['type'], CI_RELATION_TYPES.CONTAINS) response = self.client.get( path=resource_uris[1], data=self.data, format='json', ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['parent'], self.ci2.id) self.assertEqual(json_data['child'], self.ci3.id) self.assertEqual(json_data['type'], CI_RELATION_TYPES.HASROLE) def test_ci_filter_exact(self): path = "/api/v0.9/ci/" self.data['name__exact'] = 'otherci' response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [x['resource_uri'] for x in json_data['objects']] self.assertEqual(len(resource_uris), 1) response = self.client.get( path=resource_uris[0], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.cilayer2.name) self.assertEqual(json_data['barcode'], self.ci3.barcode) self.assertEqual(json_data['name'], self.ci3.name) self.assertEqual(json_data['type']['name'], self.ci3.type.name) self.assertEqual(json_data['uid'], self.ci3.uid) del(self.data['name__exact']) def test_ci_filter_startswith(self): path = "/api/v0.9/ci/" self.data['name__startswith'] = 'ciname' response = self.client.get(path=path, data=self.data, format='json') json_string = response.content json_data = json.loads(json_string) resource_uris = [x['resource_uri'] for x in json_data['objects']] self.assertEqual(len(resource_uris), 2) response = self.client.get( path=resource_uris[0], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name) self.assertEqual(json_data['barcode'], self.ci1.barcode) self.assertEqual(json_data['name'], self.ci1.name) self.assertEqual(json_data['type']['name'], self.ci1.type.name) self.assertEqual(json_data['uid'], self.ci1.uid) response = self.client.get( path=resource_uris[1], data=self.data, format='json' ) json_string = response.content json_data = json.loads(json_string) self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name) self.assertEqual(json_data['barcode'], self.ci2.barcode) self.assertEqual(json_data['name'], self.ci2.name) self.assertEqual(json_data['type']['name'], self.ci2.type.name) self.assertEqual(json_data['uid'], self.ci2.uid) del(self.data['name__startswith'])