def test_kind(svc_resource, rc_resource, ns_resource): ks = Kubernetes(body=svc_resource['body']) kr = Kubernetes(body=rc_resource['body']) kn = Kubernetes(body=ns_resource['body']) assert kr.kind == "replicationcontroller" assert kn.kind == "namespace" assert ks.kind == "service"
def test_create_nohash(ns_resource, subcall_cmd, monkeypatch): def get(*args): return None monkeypatch.setattr("kpm.platforms.kubernetes.Kubernetes.get", get) k = Kubernetes(body=ns_resource['body']) assert k.create() == "created"
def test_create_force_protected(ns_resource, subcall_cmd, monkeypatch): def get(*args): svc2 = json.loads(ns_resource['body']) return svc2 monkeypatch.setattr("kpm.platforms.kubernetes.Kubernetes.get", get) k = Kubernetes(body=ns_resource['body']) assert k.create(force=True) == "protected"
def test_create_ok(svc_resource, subcall_cmd, monkeypatch): def get(*args): svc2 = json.loads(svc_resource['body']) return svc2 monkeypatch.setattr("kpm.platforms.kubernetes.Kubernetes.get", get) k = Kubernetes(body=svc_resource['body']) assert k.create() == "ok"
def test_create_update(svc_resource, subcall_cmd, monkeypatch): def get(*args): svc2 = json.loads(svc_resource['body']) svc2['metadata']['annotations']['kpm.hash'] = 'dummy' return svc2 monkeypatch.setattr("kpm.platforms.kubernetes.Kubernetes.get", get) k = Kubernetes(body=svc_resource['body']) assert k.create() == "updated"
def test_get_proxy_404(svc_resource): proxy = "http://localhost:8001" k = Kubernetes(body=svc_resource['body'], proxy=proxy, endpoint=svc_resource['endpoint']) url = "%s/%s/%s" % (proxy, svc_resource['endpoint'][1:-1], svc_resource['name']) with requests_mock.mock() as m: response = get_response(svc_resource["name"], svc_resource["kind"]) m.get(url, text=response, status_code=404) assert k.get() is None
def test_get_proxy_500_raise(svc_resource): proxy = "http://localhost:8001" k = Kubernetes(body=svc_resource['body'], proxy=proxy, endpoint=svc_resource['endpoint']) url = "%s/%s/%s" % (proxy, svc_resource['endpoint'][1:-1], svc_resource['name']) with requests_mock.mock() as m: response = get_response(svc_resource["name"], svc_resource["kind"]) m.get(url, text=response, status_code=500) with pytest.raises(requests.exceptions.HTTPError): k.get()
def test_create_proxy(svc_resource): proxy = "http://localhost:8001" k = Kubernetes(body=svc_resource['body'], proxy=proxy, endpoint=svc_resource['endpoint']) url = "%s/%s" % (proxy, svc_resource['endpoint'][1:-1]) url2 = "%s/%s" % (k.proxy.geturl(), k.endpoint) assert url == url2 with requests_mock.mock() as m: response = get_response(svc_resource["name"], svc_resource["kind"]) m.post(url, text=response) m.get(url + "/" + svc_resource['name'], status_code=404) assert k.create() == "created"
def test_get_proxy(svc_resource): proxy = "http://localhost:8001" k = Kubernetes(body=svc_resource['body'], proxy=proxy, endpoint=svc_resource['endpoint']) url = "%s/%s/%s" % (proxy, svc_resource['endpoint'][1:-1], svc_resource['name']) url2 = "%s/%s/%s" % (k.proxy.geturl(), k.endpoint, k.name) assert url == url2 with requests_mock.mock() as m: response = get_response(svc_resource["name"], svc_resource["kind"]) m.get(url, text=response) assert json.dumps(k.get()) == json.dumps(json.loads(response))
def test_wait(svc_resource, monkeypatch): import time monkeypatch.setattr(time, 'sleep', lambda s: None) proxy = "http://localhost:8001" k = Kubernetes(body=svc_resource['body'], proxy=proxy, endpoint=svc_resource['endpoint']) url = "%s/%s/%s" % (proxy, svc_resource['endpoint'][1:-1], svc_resource['name']) url2 = "%s/%s/%s" % (k.proxy.geturl(), k.endpoint, k.name) assert url == url2 with requests_mock.mock() as m: response = get_response(svc_resource["name"], svc_resource["kind"]) m.get(url, [{ 'status_code': 404 }, { 'text': response, 'status_code': 200 }]) assert json.dumps(k.wait()) == json.dumps(json.loads(response)) assert m.call_count == 2
def test_force_namespace(ns_resource): k = Kubernetes(namespace="test", body=ns_resource['body']) assert k.namespace == "test"
def test_protected_is_false(svc_resource): k = Kubernetes(body=svc_resource['body']) assert k.protected is False
def test_delete_non_existing_resource(subcall_cmd_error, svc_resource): k = Kubernetes(body=svc_resource['body']) assert k.delete() == "absent"
def test_get_empty(ns_resource): k = Kubernetes(body=ns_resource['body']) assert k.kpmhash is None
def test_delete_ns_protected(subcall_delete, ns_resource): k = Kubernetes(body=ns_resource['body']) assert k.delete() == "protected"
def test__namespace_params(svc_resource): k = Kubernetes(namespace="test", body=svc_resource['body']) assert k._namespace(k.namespace) == "test"
def test__namespace(ns_resource): k = Kubernetes(body=ns_resource['body']) assert k._namespace() == "default"
def test_call_dry(svc_resource): k = Kubernetes(body=svc_resource['body']) assert k._call(["get", "rc", "kube-ui"], dry=True)
def test_exists_false(subcall_cmd_error, svc_resource): k = Kubernetes(body=svc_resource['body']) assert k.exists() is False
def test_exists_true(subcall_get_assert, svc_resource): k = Kubernetes(body=svc_resource['body']) assert k.exists() is True
def test__namespace_annotate(svc_resource): k = Kubernetes(body=svc_resource['body']) assert k._namespace() == "testns"
def test_protected_is_true_when_annoted(ns_resource): k = Kubernetes(body=ns_resource['body']) assert k.protected is True
def test_load_obj(svc_resource): k = Kubernetes(namespace="test", body=svc_resource['body']) assert json.dumps(k.obj) == json.dumps(json.loads(svc_resource['body']))
def test_get_cmd_error(svc_resource, subcall_cmd_error): k = Kubernetes(body=svc_resource['body']) assert k.get() is None
def test_get_hash(svc_resource): ks = Kubernetes(body=svc_resource['body']) kbody = json.loads(svc_resource['body']) assert ks.kpmhash == ks._get_kpmhash(kbody) assert ks.kpmhash == kbody['metadata']['annotations']['kpm.hash']
def test_get_ns(subcall_get_assert, ns_resource): k = Kubernetes(body=ns_resource['body'], namespace="testns") assert json.dumps(k.get()) == json.dumps( json.loads(get_response(k.name, k.kind)))
def test_check_cmd(svc_resource, subcall_cmd): k = Kubernetes(body=svc_resource['body']) assert k._call(["get", "svc", "kube-ui"]) == "kubectl get svc kube-ui --namespace testns"
def test_delete_existing_resource(subcall_delete, svc_resource): k = Kubernetes(body=svc_resource['body']) assert k.delete() == "deleted"
def test_get_svc(subcall_get_assert, svc_resource): k = Kubernetes(body=svc_resource['body']) assert json.dumps(k.get()) == json.dumps( json.loads(get_response(k.name, k.kind)))
def _process_deploy(self, dry=False, force=False, fmt="txt", proxy=None, action="create", dest="/tmp/kpm"): def output_progress(kubsource, status, fmt="text"): if fmt == 'text': print " --> %s (%s): %s" % (kubsource.name, kubsource.kind, colorize(status)) dest = os.path.join(dest, self.name, self.version) mkdir_p(dest) table = [] results = [] if fmt == "text": print "%s %s " % (action, self.name) i = 0 for kub in self.dependencies: package = self._dep_build(kub) i += 1 pname = package["package"] version = package["version"] namespace = package["namespace"] if fmt == "text": print "\n %02d - %s:" % (i, package["package"]) for resource in package["resources"]: body = resource["body"] endpoint = resource["endpoint"] # Use API instead of kubectl with open( os.path.join( dest, "%s-%s" % (resource['name'], resource['file'].replace("/", "_"))), 'wb') as f: f.write(body) kubresource = Kubernetes(namespace=namespace, body=body, endpoint=endpoint, proxy=proxy) status = getattr(kubresource, action)(force=force, dry=dry, strategy=resource.get( 'update_mode', 'update')) if fmt == "text": output_progress(kubresource, status) result_line = OrderedDict([("package", pname), ("version", version), ("kind", kubresource.kind), ("dry", dry), ("name", kubresource.name), ("namespace", kubresource.namespace), ("status", status)]) if status != 'ok' and action == 'create': kubresource.wait(3) results.append(result_line) if fmt == "text": header = [ "package", "version", "kind", "name", "namespace", "status" ] display_line = [] for k in header: display_line.append(result_line[k]) table.append(display_line) if fmt == "text": print_deploy_result(table) return results