async def test_different_bucket_different_name_link(self): papiea_test.logger.debug("Running test to link to different object in a different bucket") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket2_name = "test-bucket2" bucket1_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket1_ref) bucket2_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket2_name) bucket2_entity = await bucket_entity_client.get(bucket2_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 assert bucket2_entity.spec.name == bucket2_name assert len(bucket2_entity.spec.objects) == 0 object1_name = "test-object1" object2_name = "test-object2" object_ref = await bucket_entity_client.invoke_procedure("create_object", bucket1_entity.metadata, object1_name) async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: b1_object1_entity = await object_entity_client.get(object_ref) bucket1_entity = await bucket_entity_client.get(bucket1_ref) assert len(bucket1_entity.spec.objects) == 1 assert bucket1_entity.spec.objects[0].name == object1_name assert bucket1_entity.spec.objects[0].reference.uuid == b1_object1_entity.metadata.uuid assert b1_object1_entity.spec.content == "" object_input = AttributeDict( object_name=object2_name, object_uuid=b1_object1_entity.metadata.uuid ) await bucket_entity_client.invoke_procedure("link_object", bucket2_entity.metadata, object_input) async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: b1_object1_entity = await object_entity_client.get(object_ref) bucket2_entity = await bucket_entity_client.get(bucket2_ref) assert len(bucket2_entity.spec.objects) == 1 assert bucket2_entity.spec.objects[0].name == object2_name assert bucket2_entity.spec.objects[0].reference.uuid == b1_object1_entity.metadata.uuid finally: await sdk.server.close()
async def test_object_content_change_intent(self): papiea_test.logger.debug("Running test to change object content and validate intent resolver") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 object1_name = "test-object1" object_ref = await bucket_entity_client.invoke_procedure("create_object", bucket1_entity.metadata, object1_name) async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: b1_object1_entity = await object_entity_client.get(object_ref) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert b1_object1_entity.spec.content == "" obj_content = "test-content" spec = Spec( content=obj_content ) callback_invoked = False def cb_function(fut: asyncio.Future): nonlocal callback_invoked callback_invoked = True watcher_ref = await object_entity_client.update(b1_object1_entity.metadata, spec) watcher_status = IntentfulStatus.Completed_Successfully task = asyncio.create_task(sdk.intent_watcher.wait_for_watcher_status(watcher_ref.watcher, watcher_status, 50)) task.add_done_callback(cb_function) await asyncio.sleep(10) b1_object1_entity = await object_entity_client.get(object_ref) assert b1_object1_entity.spec.content == obj_content assert callback_invoked == True finally: await sdk.server.close()
async def test_object_add_bucket_intent(self): papiea_test.logger.debug("Running test to add object to bucket and validate intent resolver") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 object1_name = "test-object1" object_ref = await bucket_entity_client.invoke_procedure("create_object", bucket1_entity.metadata, object1_name) async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: b1_object1_entity = await object_entity_client.get(object_ref) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert b1_object1_entity.spec.content == "" retries = 10 for _ in range(1, retries+1): bucket1_entity = await bucket_entity_client.get(bucket_ref) if len(bucket1_entity.status.objects) == 1: break time.sleep(5) async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: b1_object1_entity = await object_entity_client.get(object_ref) assert len(bucket1_entity.status.objects) == 1 assert bucket1_entity.status.objects[0].name == object1_name assert bucket1_entity.status.objects[0].reference.uuid == b1_object1_entity.metadata.uuid assert len(b1_object1_entity.status.references) == 1 assert b1_object1_entity.status.references[0].bucket_name == bucket1_name assert b1_object1_entity.status.references[0].object_name == object1_name assert b1_object1_entity.status.references[0].bucket_reference.uuid == bucket1_entity.metadata.uuid finally: await sdk.server.close()
async def print_kinds_data(): async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: try: print(await bucket_entity_client.get_all()) except: papiea_test.logger.debug("Failed to fetch the buckets") pass async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: try: print(await object_entity_client.get_all()) except: papiea_test.logger.debug("Failed to fetch the objects") pass
async def test_object_create_intent(self): papiea_test.logger.debug("Running test to create object and validate intent resolver") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: object_ref = await object_entity_client.create( {"content": "test", "owner": "nutanix"} ) object_entity = await object_entity_client.get(object_ref.metadata) assert object_entity.spec.content == "test" assert object_entity.status.content == "test" assert object_entity.status.size == 4 assert len(object_entity.status.references) == 0 finally: await sdk.server.close()
async def test_bucket_create_intent(self): papiea_test.logger.debug("Running test to create bucket and validate intent resolver") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket_ref = await bucket_entity_client.create( {"name": bucket1_name, "objects": list(), "owner": "nutanix"} ) bucket_entity = await bucket_entity_client.get(bucket_ref.metadata) assert bucket_entity.spec.name == bucket1_name assert len(bucket_entity.status.objects) == 0 assert bucket_entity.spec.name == bucket1_name assert len(bucket_entity.status.objects) == 0 finally: await sdk.server.close()
async def test_non_existent_object_unlink(self): papiea_test.logger.debug("Running test to unlink from a non-existing object") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 object1_name = "test-object1" await bucket_entity_client.invoke_procedure("unlink_object", bucket1_entity.metadata, object1_name) except Exception as ex: papiea_test.logger.debug("Failed to perform entity operation : " + str(ex)) assert str(ex) == "Object not found in the bucket" finally: await sdk.server.close()
async def test_duplicate_bucket_create(self): papiea_test.logger.debug("Running test to create a duplicate bucket") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 bucket_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 finally: await sdk.server.close()
async def on_object_removed_handler(ctx, entity_bucket, diff): try: papiea_test.logger.debug( "Executing object removed from bucket intent handler...") async with papiea_test.get_client( papiea_test.OBJECT_KIND) as object_entity_client: for entity in diff: entity_object = await object_entity_client.get( AttributeDict(uuid=entity.status[0].reference.uuid)) entity_object.status.references[:] = [ d for d in entity_object.status.references if d.get("object_name") != entity.status[0].name or d.get("bucket_name") != entity_bucket.spec.name ] if not entity_object.status.references: papiea_test.logger.debug( "Object refcount is zero. Deleting the object...") await object_entity_client.delete(entity_object.metadata) else: await ctx.update_status(entity_object.metadata, entity_object.status) entity_bucket.status.objects = entity_bucket.spec.objects await ctx.update_status(entity_bucket.metadata, entity_bucket.status) except: raise
async def bucket_name_handler(ctx, entity_bucket, diff): # fetch unique uuids for the objects in the bucket # for each uuid, get the object references list # iterate and update bucket name if bucket ref match is found # update all such object entities try: papiea_test.logger.debug( "Executing bucket name change intent handler...") object_uuid_set = set() for obj in entity_bucket.spec.objects: object_uuid_set.add(obj.reference.uuid) async with papiea_test.get_client( papiea_test.OBJECT_KIND) as object_entity_client: for object_uuid in object_uuid_set: entity_object = await object_entity_client.get( AttributeDict(uuid=object_uuid)) for i in range(len(entity_object.status.references)): if entity_object.status.references[ i].bucket_reference.uuid == entity_bucket.metadata.uuid: entity_object.status.references[ i].bucket_name = entity_bucket.spec.name await ctx.update_status(entity_object.metadata, entity_object.status) entity_bucket.status.name = entity_bucket.spec.name await ctx.update_status(entity_bucket.metadata, entity_bucket.status) except: raise
async def cleanup(): async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: try: object_list = await object_entity_client.get_all() for obj in object_list: await object_entity_client.delete(obj.metadata) except: raise async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: try: bucket_list = await bucket_entity_client.get_all() for bucket in bucket_list: await bucket_entity_client.delete(bucket.metadata) except: raise
async def test_duplicate_object_create(self): papiea_test.logger.debug("Running test to create a duplicate object in same bucket") try: sdk = await provider.setup_and_register_sdk() except Exception as ex: papiea_test.logger.debug("Failed to setup/register sdk : " + str(ex)) return try: await test_utils.cleanup() except Exception as ex: papiea_test.logger.debug("Failed cleanup : " + str(ex)) raise Exception("Cleanup operation failed : " + str(ex)) try: async with papiea_test.get_client(papiea_test.BUCKET_KIND) as bucket_entity_client: bucket1_name = "test-bucket1" bucket_ref = await bucket_entity_client.invoke_kind_procedure("ensure_bucket_exists", bucket1_name) bucket1_entity = await bucket_entity_client.get(bucket_ref) assert bucket1_entity.spec.name == bucket1_name assert len(bucket1_entity.spec.objects) == 0 object1_name = "test-object1" object_ref = await bucket_entity_client.invoke_procedure("create_object", bucket1_entity.metadata, object1_name) async with papiea_test.get_client(papiea_test.OBJECT_KIND) as object_entity_client: b1_object1_entity = await object_entity_client.get(object_ref) assert b1_object1_entity.spec.content == "" await bucket_entity_client.invoke_procedure("create_object", bucket1_entity.metadata, object1_name) except Exception as ex: papiea_test.logger.debug("Failed to perform entity operation : " + str(ex)) assert str(ex) == "Object already exists in the bucket" finally: await sdk.server.close()
async def on_object_added_handler(ctx, entity_bucket, diff): try: papiea_test.logger.debug( "Executing object added to bucket intent handler...") async with papiea_test.get_client( papiea_test.OBJECT_KIND) as object_entity_client: for entity in diff: entity_object = await object_entity_client.get( AttributeDict(uuid=entity.spec[0].reference.uuid)) entity_object.status.references.append( AttributeDict(bucket_name=entity_bucket.spec.name, object_name=entity.spec[0].name, bucket_reference=AttributeDict( uuid=entity_bucket.metadata.uuid, kind=papiea_test.BUCKET_KIND))) await ctx.update_status(entity_object.metadata, entity_object.status) entity_bucket.status.objects = entity_bucket.spec.objects await ctx.update_status(entity_bucket.metadata, entity_bucket.status) except: raise