def test_purge_on_delete_ignore(io_loop, client, server, environment): """ Test purge on delete behavior for resources that have not longer purged_on_delete set """ agent = Agent(io_loop, "localhost", {"blah": "localhost"}, environment=environment) agent.start() aclient = agent._client # Version 1 with purge_on_delete true version = 1 resources = [{ 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1,path=/tmp/file1],v=%d' % version, 'owner': 'root', 'path': '/tmp/file1', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'purge_on_delete': True, 'version': version }] res = yield client.put_version(tid=environment, version=version, resources=resources, unknowns=[], version_info={}) assert res.code == 200 # Release the model and set all resources as deployed result = yield client.release_version(environment, version, push=False) assert result.code == 200 now = datetime.now() result = yield aclient.resource_action_update( environment, ['std::File[vm1,path=/tmp/file1],v=%d' % version], uuid.uuid4(), "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["version"] == version assert result.result["model"]["total"] == len(resources) assert result.result["model"]["done"] == len(resources) assert result.result["model"]["released"] assert result.result["model"]["result"] == const.VersionState.success.name # Version 2 with purge_on_delete false version = 2 resources = [{ 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1,path=/tmp/file1],v=%d' % version, 'owner': 'root', 'path': '/tmp/file1', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'purge_on_delete': False, 'version': version }] res = yield client.put_version(tid=environment, version=version, resources=resources, unknowns=[], version_info={}) assert res.code == 200 # Release the model and set all resources as deployed result = yield client.release_version(environment, version, push=False) assert result.code == 200 now = datetime.now() result = yield aclient.resource_action_update( environment, ['std::File[vm1,path=/tmp/file1],v=%d' % version], uuid.uuid4(), "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["version"] == version assert result.result["model"]["total"] == len(resources) assert result.result["model"]["done"] == len(resources) assert result.result["model"]["released"] assert result.result["model"]["result"] == const.VersionState.success.name # Version 3 with no resources version = 3 resources = [] res = yield client.put_version(tid=environment, version=version, resources=resources, unknowns=[], version_info={}) assert res.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["version"] == version assert result.result["model"]["total"] == len(resources)
def test_resource_update(io_loop, client, server, environment): """ Test updating resources and logging """ agent = Agent(io_loop, "localhost", {"blah": "localhost"}, environment=environment) agent.start() aclient = agent._client version = int(time.time()) resources = [] for j in range(10): resources.append({ 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1,path=/tmp/file%d],v=%d' % (j, version), 'owner': 'root', 'path': '/tmp/file%d' % j, 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'version': version }) res = yield client.put_version(tid=environment, version=version, resources=resources, unknowns=[], version_info={}) assert (res.code == 200) result = yield client.release_version(environment, version, push=False) assert result.code == 200 resource_ids = [x["id"] for x in resources] # Start the deploy action_id = uuid.uuid4() now = datetime.now() result = yield aclient.resource_action_update(environment, resource_ids, action_id, "deploy", now) assert (result.code == 200) # Get the status from a resource result = yield client.get_resource(tid=environment, id=resource_ids[0], logs=True) assert (result.code == 200) logs = {x["action"]: x for x in result.result["logs"]} assert ("deploy" in logs) assert ("finished" not in logs["deploy"]) assert ("messages" not in logs["deploy"]) assert ("changes" not in logs["deploy"]) # Send some logs result = yield aclient.resource_action_update( environment, resource_ids, action_id, "deploy", messages=[ data.LogLine.log(const.LogLevel.INFO, "Test log %(a)s %(b)s", a="a", b="b") ]) assert (result.code == 200) # Get the status from a resource result = yield client.get_resource(tid=environment, id=resource_ids[0], logs=True) assert (result.code == 200) logs = {x["action"]: x for x in result.result["logs"]} assert ("deploy" in logs) assert ("messages" in logs["deploy"]) assert (len(logs["deploy"]["messages"]) == 1) assert (logs["deploy"]["messages"][0]["msg"] == "Test log a b") assert ("finished" not in logs["deploy"]) assert ("changes" not in logs["deploy"]) # Finish the deploy now = datetime.now() changes = { x: { "owner": { "old": "root", "current": "inmanta" } } for x in resource_ids } result = yield aclient.resource_action_update(environment, resource_ids, action_id, "deploy", finished=now, changes=changes) assert (result.code == 500) result = yield aclient.resource_action_update(environment, resource_ids, action_id, "deploy", status="deployed", finished=now, changes=changes) assert (result.code == 200) result = yield client.get_version(environment, version) assert (result.code == 200) assert result.result["model"]["done"] == 10
def test_purge_on_delete(io_loop, client, server, environment): """ Test purge on delete of resources """ agent = Agent(io_loop, "localhost", {"blah": "localhost"}, environment=environment) agent.start() aclient = agent._client version = 1 resources = [{ 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1,path=/tmp/file1],v=%d' % version, 'owner': 'root', 'path': '/tmp/file1', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'purge_on_delete': True, 'version': version }, { 'group': 'root', 'hash': 'b4350bef50c3ec3ee532d4a3f9d6daedec3d2aba', 'id': 'std::File[vm1,path=/tmp/file2],v=%d' % version, 'owner': 'root', 'path': '/tmp/file2', 'permissions': 644, 'purged': False, 'reload': False, 'purge_on_delete': True, 'requires': ['std::File[vm1,path=/tmp/file1],v=%d' % version], 'version': version }, { 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1,path=/tmp/file3],v=%d' % version, 'owner': 'root', 'path': '/tmp/file3', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'purge_on_delete': True, 'version': version }] res = yield client.put_version(tid=environment, version=version, resources=resources, unknowns=[], version_info={}) assert res.code == 200 # Release the model and set all resources as deployed result = yield client.release_version(environment, version, push=False) assert result.code == 200 now = datetime.now() result = yield aclient.resource_action_update( environment, ['std::File[vm1,path=/tmp/file1],v=%d' % version], uuid.uuid4(), "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield aclient.resource_action_update( environment, ['std::File[vm1,path=/tmp/file2],v=%d' % version], uuid.uuid4(), "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield aclient.resource_action_update( environment, ['std::File[vm1,path=/tmp/file3],v=%d' % version], uuid.uuid4(), "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["version"] == version assert result.result["model"]["total"] == len(resources) assert result.result["model"]["done"] == len(resources) assert result.result["model"]["released"] assert result.result["model"]["result"] == const.VersionState.success.name # New version with only file3 version = 2 res3 = { 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1,path=/tmp/file3],v=%d' % version, 'owner': 'root', 'path': '/tmp/file3', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'purge_on_delete': True, 'version': version } res = yield client.put_version(tid=environment, version=version, resources=[res3], unknowns=[], version_info={}) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["total"] == 3 # validate requires and provides file1 = [x for x in result.result["resources"] if "file1" in x["id"]][0] file2 = [x for x in result.result["resources"] if "file2" in x["id"]][0] file3 = [x for x in result.result["resources"] if "file3" in x["id"]][0] assert file1["attributes"]["purged"] assert file2["attributes"]["purged"] assert not file3["attributes"]["purged"]
def test_get_resource_for_agent(io_loop, motor, server_multi, client, environment): """ Test the server to manage the updates on a model during agent deploy """ agent = Agent(io_loop, "localhost", {"nvblah": "localhost"}, environment=environment) agent.start() aclient = agent._client version = 1 resources = [{ 'group': 'root', 'hash': '89bf880a0dc5ffc1156c8d958b4960971370ee6a', 'id': 'std::File[vm1.dev.inmanta.com,path=/etc/sysconfig/network],v=%d' % version, 'owner': 'root', 'path': '/etc/sysconfig/network', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'version': version }, { 'group': 'root', 'hash': 'b4350bef50c3ec3ee532d4a3f9d6daedec3d2aba', 'id': 'std::File[vm2.dev.inmanta.com,path=/etc/motd],v=%d' % version, 'owner': 'root', 'path': '/etc/motd', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'version': version }, { 'group': 'root', 'hash': '3bfcdad9ab7f9d916a954f1a96b28d31d95593e4', 'id': 'std::File[vm1.dev.inmanta.com,path=/etc/hostname],v=%d' % version, 'owner': 'root', 'path': '/etc/hostname', 'permissions': 644, 'purged': False, 'reload': False, 'requires': [], 'version': version }, { 'id': 'std::Service[vm1.dev.inmanta.com,name=network],v=%d' % version, 'name': 'network', 'onboot': True, 'requires': [ 'std::File[vm1.dev.inmanta.com,path=/etc/sysconfig/network],v=%d' % version ], 'state': 'running', 'version': version }] res = yield client.put_version(tid=environment, version=version, resources=resources, unknowns=[], version_info={}) assert res.code == 200 result = yield client.list_versions(environment) assert result.code == 200 assert result.result["count"] == 1 result = yield client.release_version(environment, version, push=False) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["version"] == version assert result.result["model"]["total"] == len(resources) assert result.result["model"]["released"] assert result.result["model"]["result"] == "deploying" result = yield aclient.get_resources_for_agent(environment, "vm1.dev.inmanta.com") assert result.code == 200 assert len(result.result["resources"]) == 3 action_id = uuid.uuid4() now = datetime.now() result = yield aclient.resource_action_update(environment, [ "std::File[vm1.dev.inmanta.com,path=/etc/sysconfig/network],v=%d" % version ], action_id, "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["done"] == 1 action_id = uuid.uuid4() now = datetime.now() result = yield aclient.resource_action_update( environment, ["std::File[vm1.dev.inmanta.com,path=/etc/hostname],v=%d" % version], action_id, "deploy", now, now, "deployed", [], {}) assert result.code == 200 result = yield client.get_version(environment, version) assert result.code == 200 assert result.result["model"]["done"] == 2