def test_update_manifests_no_overrides_and_values_valid(self): with open(self.base_manifest) as f: documents = list(yaml.safe_load_all(f.read())) ovr = Override(documents) ovr.update_manifests() # no updates since no overrides and values provided self.assertEqual(documents, ovr.documents)
def test_update_manifests_with_values_valid(self): original = "{}/templates/override-{}.yaml".format(self.basepath, '01') values_yaml = "{}/templates/override-{}-expected.yaml".format( self.basepath, '01') with open(original) as f, open(values_yaml) as g: original_documents = list(yaml.safe_load_all(f.read())) documents_copy = copy.deepcopy(original_documents) values_documents = list(yaml.safe_load_all(g.read())) ovr = Override(original_documents, None, [values_yaml]) ovr.update_manifests() # updating values changed the original document self.assertNotEqual(original_documents, documents_copy) # verifying that these documents have the same value now self.assertEqual(original_documents, values_documents)
def test_set_list_valid(self): expected = "{}/templates/override-{}-expected.yaml".format( self.basepath, '03') with open(self.base_manifest) as f, open(expected) as e: doc_obj = list(yaml.safe_load_all(f.read())) doc_path = ['manifest', 'simple-armada'] override = ('manifest:simple-armada:chart_groups=\ blog-group3,blog-group4',) ovr = Override(doc_obj, override) ovr.update_manifests() ovr_doc = ovr.find_manifest_document(doc_path) expect_doc = list(yaml.load_all(e.read()))[0] self.assertEqual(expect_doc, ovr_doc)
def test_set_list_valid(self): expected = "{}/templates/override-{}-expected.yaml".format( self.basepath, '03') with open(self.base_manifest) as f, open(expected) as e: documents = list(yaml.safe_load_all(f.read())) doc_path = ['manifest', 'simple-armada'] override = ('manifest:simple-armada:chart_groups=\ blog-group3,blog-group4', ) ovr = Override(documents, override) ovr.update_manifests() ovr_doc = ovr.find_manifest_document(doc_path) target_docs = list(yaml.load_all(e.read())) expected_doc = [ x for x in target_docs if x.get('schema') == 'armada/Manifest/v1' ][0] self.assertEqual(expected_doc.get('data'), ovr_doc.get('data'))
def test_update_manifests_with_values_and_overrides_valid(self): values_yaml = "{}/templates/override-{}-expected.yaml".format( self.basepath, '01') comparison_yaml = "{}/templates/override-{}-expected.yaml".format( self.basepath, '03') with open(self.base_manifest) as f, open(values_yaml) as g: original_documents = list(yaml.safe_load_all(f.read())) documents_copy = copy.deepcopy(original_documents) values_documents = list(yaml.safe_load_all(g.read())) override = ('manifest:simple-armada:release_prefix=' 'overridden', ) # Case 1: Checking if primitive gets updated. ovr = Override(original_documents, override, [values_yaml]) ovr.update_manifests() # updating values changed the original document self.assertNotEqual(original_documents, documents_copy) # since overrides done, these documents aren't same anymore self.assertNotEqual(original_documents, values_documents) target_doc = [ x for x in ovr.documents if x.get('metadata').get('name') == 'simple-armada' ][0] self.assertEqual('overridden', target_doc['data']['release_prefix']) override = ('manifest:simple-armada:chart_groups=' 'blog-group3,blog-group4', ) # Case 2: Checking if list gets updated. ovr = Override(original_documents, override, [values_yaml]) ovr.update_manifests() # updating values changed the original document self.assertNotEqual(original_documents, documents_copy) # since overrides done, these documents aren't same anymore self.assertNotEqual(original_documents, values_documents) with open(comparison_yaml) as c: comparison_documents = list(yaml.safe_load_all(c.read())) # verifying that the override is correct self.assertEqual(original_documents[2]['data']['chart_groups'], comparison_documents[0]['data']['chart_groups'])
def on_post(self, req, resp): # Load data from request and get options if req.content_type == 'application/x-yaml': data = list(self.req_yaml(req)) if type(data[0]) is list: documents = list(data[0]) else: documents = data elif req.content_type == 'application/json': self.logger.debug("Applying manifest based on reference.") req_body = self.req_json(req) doc_ref = req_body.get('hrefs', None) if not doc_ref: self.logger.info("Request did not contain 'hrefs'.") resp.status = falcon.HTTP_400 return data = ReferenceResolver.resolve_reference(doc_ref) documents = list() for d in data: documents.extend(list(yaml.safe_load_all(d.decode()))) if req_body.get('overrides', None): overrides = Override(documents, overrides=req_body.get('overrides')) documents = overrides.update_manifests() else: self.error(req.context, "Unknown content-type %s" % req.content_type) # TODO(fmontei): Use falcon.<Relevant API Exception Class> instead. return self.return_error( resp, falcon.HTTP_415, message="Request must be in application/x-yaml" "or application/json") try: with self.get_tiller(req, resp) as tiller: msg = self.handle(req, documents, tiller) resp.body = json.dumps({ 'message': msg, }) resp.content_type = 'application/json' resp.status = falcon.HTTP_200 except exceptions.ManifestException as e: self.return_error(resp, falcon.HTTP_400, message=str(e)) except LockException as e: self.return_error(resp, falcon.HTTP_409, message=str(e)) except Exception as e: self.logger.exception('Caught unexpected exception') err_message = 'Failed to apply manifest: {}'.format(e) self.error(req.context, err_message) self.return_error(resp, falcon.HTTP_500, message=err_message)
def on_post(self, req, resp): # Load data from request and get options if req.content_type == 'application/x-yaml': data = list(self.req_yaml(req)) if type(data[0]) is list: documents = list(data[0]) else: documents = data elif req.content_type == 'application/json': self.logger.debug("Applying manifest based on reference.") req_body = self.req_json(req) doc_ref = req_body.get('hrefs', None) if not doc_ref: self.logger.info("Request did not contain 'hrefs'.") resp.status = falcon.HTTP_400 return data = ReferenceResolver.resolve_reference(doc_ref) documents = list() for d in data: documents.extend(list(yaml.safe_load_all(d.decode()))) if req_body.get('overrides', None): overrides = Override( documents, overrides=req_body.get('overrides')) documents = overrides.update_manifests() else: self.error(req.context, "Unknown content-type %s" % req.content_type) # TODO(fmontei): Use falcon.<Relevant API Exception Class> instead. return self.return_error( resp, falcon.HTTP_415, message="Request must be in application/x-yaml" "or application/json") try: armada = Armada( documents, disable_update_pre=req.get_param_as_bool('disable_update_pre'), disable_update_post=req.get_param_as_bool( 'disable_update_post'), enable_chart_cleanup=req.get_param_as_bool( 'enable_chart_cleanup'), dry_run=req.get_param_as_bool('dry_run'), force_wait=req.get_param_as_bool('wait'), timeout=req.get_param_as_int('timeout') or 0, tiller_host=req.get_param('tiller_host'), tiller_port=req.get_param_as_int('tiller_port') or CONF.tiller_port, tiller_namespace=req.get_param( 'tiller_namespace', default=CONF.tiller_namespace), target_manifest=req.get_param('target_manifest')) msg = armada.sync() resp.body = json.dumps({ 'message': msg, }) resp.content_type = 'application/json' resp.status = falcon.HTTP_200 except exceptions.ManifestException as e: self.return_error(resp, falcon.HTTP_400, message=str(e)) except Exception as e: self.logger.exception('Caught unexpected exception') err_message = 'Failed to apply manifest: {}'.format(e) self.error(req.context, err_message) self.return_error(resp, falcon.HTTP_500, message=err_message)
def on_post(self, req, resp): try: # Load data from request and get options if req.content_type == 'application/x-yaml': data = list(self.req_yaml(req)) if type(data[0]) is list: documents = list(data[0]) else: documents = data elif req.content_type == 'application/json': self.logger.debug("Applying manifest based on reference.") req_body = self.req_json(req) doc_ref = req_body.get('hrefs', None) if not doc_ref: self.logger.info("Request did not contain 'hrefs'.") resp.status = falcon.HTTP_400 return data = ReferenceResolver.resolve_reference(doc_ref) documents = list() for d in data: documents.extend(list(yaml.safe_load_all(d.decode()))) if req_body.get('overrides', None): overrides = Override(documents, overrides=req_body.get('overrides')) documents = overrides.update_manifests() else: self.error(req.context, "Unknown content-type %s" % req.content_type) self.return_error( resp, falcon.HTTP_415, message="Request must be in application/x-yaml" "or application/json") opts = req.params # Encode filename armada = Armada( documents, disable_update_pre=req.get_param_as_bool('disable_update_pre'), disable_update_post=req.get_param_as_bool( 'disable_update_post'), enable_chart_cleanup=req.get_param_as_bool( 'enable_chart_cleanup'), dry_run=req.get_param_as_bool('dry_run'), wait=req.get_param_as_bool('wait'), timeout=int(opts.get('timeout', 3600)), tiller_host=opts.get('tiller_host', None), tiller_port=int(opts.get('tiller_port', 44134)), ) msg = armada.sync() resp.body = json.dumps({ 'message': msg, }) resp.content_type = 'application/json' resp.status = falcon.HTTP_200 except Exception as e: err_message = 'Failed to apply manifest: {}'.format(e) self.error(req.context, err_message) self.return_error(resp, falcon.HTTP_500, message=err_message)