コード例 #1
0
 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)
コード例 #2
0
 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)
コード例 #3
0
ファイル: test_override.py プロジェクト: nuaays/armada
    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)
コード例 #4
0
    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'))
コード例 #5
0
ファイル: test_override.py プロジェクト: raja324/armada
    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'])
コード例 #6
0
ファイル: armada.py プロジェクト: dustinspecker/armada
    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)
コード例 #7
0
    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)
コード例 #8
0
ファイル: armada.py プロジェクト: nuaays/armada
    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)