Example #1
0
    def update_release(self, chart, namespace, dry_run=False,
                       name=None, values=None, wait=False,
                       disable_hooks=False, recreate=False,
                       reset_values=False, reuse_values=False,
                       force=False, description="", install=False):
        """
        Update a Helm Release
        """
        stub = ReleaseServiceStub(self._channel)

        if install:
            if not namespace:
                namespace = DEFAULT_NAMESPACE

            try:
                release_status = self.get_release_status(name)
            except grpc.RpcError as rpc_error_call:
                if not rpc_error_call.details() == "getting deployed release \"{}\": release: \"{}\" not found".format(name, name):
                    raise rpc_error_call

                # The release doesn't exist - it's time to install
                self._logger.info(
                    "Release %s does not exist. Installing it now.", name)

                return self.install_release(chart, namespace, dry_run,
                                            name, values, wait)

            if release_status.namespace != namespace:
                self._logger.warn("Namespace %s doesn't match with previous. Release will be deployed to %s",
                                  release_status.namespace, namespace)

        values = Config(raw=yaml.safe_dump(values or {}))

        release_request = UpdateReleaseRequest(
            chart=chart,
            dry_run=dry_run,
            disable_hooks=disable_hooks,
            values=values,
            name=name or '',
            wait=wait,
            recreate=recreate,
            reset_values=reset_values,
            reuse_values=reuse_values,
            force=force,
            description=description)

        return stub.UpdateRelease(release_request, self._timeout,
                                  metadata=self.metadata)
Example #2
0
    def get_values(self):
        '''
        Return the chart (default) values
        '''

        # create config object representing unmarshaled values.yaml
        if os.path.exists(os.path.join(self.source_directory, 'values.yaml')):
            with open(os.path.join(self.source_directory,
                                   'values.yaml')) as fd:
                raw_values = fd.read()
        else:
            self._logger.warn("No values.yaml in %s, using empty values",
                              self.source_directory)
            raw_values = ''

        return Config(raw=raw_values)
Example #3
0
    def get_values(self):
        '''
        Return the chart (default) values
        获取chart的values数据
        Args:

        Returns:
            返回tiller所需的values对象
        '''

        # create config object representing unmarshaled values.yaml
        if os.path.exists(os.path.join(self.source_directory, 'values.yaml')):
            raw_values = open(
                os.path.join(self.source_directory, 'values.yaml')).read()
        else:
            raw_values = ''

        return Config(raw=raw_values)
Example #4
0
    def update_release(self,
                       chart,
                       name,
                       dry_run=False,
                       disable_hooks=False,
                       values=None,
                       recreate=False,
                       reset_values=False,
                       reuse_values=False,
                       force=False,
                       timeout=REQUEST_TIMEOUT):
        """升级release
        Args:
            :params - chart - chart 元数据,由函数生成
            :params - name - release name
            :params - dry_run - simulate an upgrade
            :params - values - 额外的values,用来进行value值替换
            :params - disable_hooks - prevent hooks from running during rollback(bool)
            :params - recreate - performs pods restart for the resource if applicable(bool)
            :params - reset_values - when upgrading, reset the values to the ones built into the chart(bool)
            :params - reuse_values - when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored.(bool)
            :params - force - 是否强制升级(bool)
        Returns:
            返回升级release的grpc响应对象
        """

        values = Config(raw=yaml.safe_dump(values or {}))

        # build update release request
        stub = ReleaseServiceStub(self.channel)
        release_request = UpdateReleaseRequest(chart=chart,
                                               dry_run=dry_run,
                                               recreate=recreate,
                                               reset_values=reset_values,
                                               reuse_values=reuse_values,
                                               force=force,
                                               disable_hooks=disable_hooks,
                                               values=values,
                                               timeout=timeout,
                                               name=name)

        return stub.UpdateRelease(release_request,
                                  self.timeout,
                                  metadata=self.metadata)
Example #5
0
    def install_release(self, chart, namespace, dry_run=False,
                        name=None, values=None):
        """
        Create a Helm Release
        """

        values = Config(raw=yaml.safe_dump(values or {}))

        # build release install request
        stub = ReleaseServiceStub(self.channel)
        release_request = InstallReleaseRequest(
            chart=chart,
            dry_run=dry_run,
            values=values,
            name=name or '',
            namespace=namespace)
        return stub.InstallRelease(release_request,
                                   self.timeout,
                                   metadata=self.metadata)
Example #6
0
    def install_release(
        self,
        chart,
        namespace,
        dry_run=False,
        name=None,
        values=None,
        wait=False,
        disable_hooks=False,
        reuse_name=False,
        disable_crd_hook=False,
        description="",
    ):
        """
        Create a Helm Release
        """
        if values:
            f = io.StringIO()
            yaml.dump(values, f)
            f.seek(0)
            raw = f.read()
        else:
            raw = ""
        values = Config(raw=raw)

        stub = ReleaseServiceStub(self._channel)
        release_request = InstallReleaseRequest(
            chart=chart,
            dry_run=dry_run,
            values=values,
            name=name or "",
            namespace=namespace,
            wait=wait,
            disable_hooks=disable_hooks,
            reuse_name=reuse_name,
            disable_crd_hook=disable_crd_hook,
            description=description,
        )

        return stub.InstallRelease(release_request,
                                   self._timeout,
                                   metadata=self.metadata)
Example #7
0
    def update_release(self, chart, dry_run, namespace, name=None,
                       pre_actions=None, post_actions=None,
                       disable_hooks=False, values=None):
        '''
        Update a Helm Release
        '''

        values = Config(raw=yaml.safe_dump(values or {}))
        self._pre_update_actions(pre_actions, namespace)

        # build release install request
        stub = ReleaseServiceStub(self.channel)
        release_request = UpdateReleaseRequest(
            chart=chart,
            dry_run=dry_run,
            disable_hooks=disable_hooks,
            values=values,
            name=name or '')

        stub.UpdateRelease(release_request, self.timeout,
                           metadata=self.metadata)

        self._post_update_actions(post_actions, namespace)
Example #8
0
    def install_release(self, chart, namespace, dry_run=False,
                        name=None, values=None, wait=False,
                        disable_hooks=False, reuse_name=False,
                        disable_crd_hook=False, overrides=[], description="", chartbuilder=None):
        """
        Prepare overrides, note it only supports one file at the moment
        """
        standard_values = {}
        if overrides is not None and chartbuilder is not None:
            standard_values = yaml.safe_load(chartbuilder.get_values().raw)
            for file in overrides:
                standard_values.update(yaml.safe_load(file.value))
        """
        Create a Helm Release
        """
        # now this is where it gets tricky
        # since the overrides are appended 'left to right'
        # the later mappings override the standard values in `values.yaml`
        # the standard helm client does something similar but this 'works' (and is a kludge)
        values = Config(raw=yaml.safe_dump(standard_values))
        stub = ReleaseServiceStub(self._channel)
        release_request = InstallReleaseRequest(
            chart=chart,
            dry_run=dry_run,
            values=values,
            name=name or '',
            namespace=namespace,
            wait=wait,
            disable_hooks=disable_hooks,
            reuse_name=reuse_name,
            disable_crd_hook=disable_crd_hook,
            description=description)

        return stub.InstallRelease(release_request,
                                   self._timeout,
                                   metadata=self.metadata)
Example #9
0
    def update_release(self,
                       chart,
                       release,
                       namespace,
                       pre_actions=None,
                       post_actions=None,
                       disable_hooks=False,
                       values=None,
                       wait=False,
                       timeout=None,
                       force=False,
                       recreate_pods=False):
        '''
        Update a Helm Release
        '''
        timeout = self._check_timeout(wait, timeout)

        LOG.info(
            'Helm update release%s: wait=%s, timeout=%s, force=%s, '
            'recreate_pods=%s', (' (dry run)' if self.dry_run else ''), wait,
            timeout, force, recreate_pods)

        if values is None:
            values = Config(raw='')
        else:
            values = Config(raw=values)

        self._pre_update_actions(pre_actions, release, namespace, chart,
                                 disable_hooks, values, timeout)

        update_msg = None
        # build release install request
        try:
            stub = ReleaseServiceStub(self.channel)
            release_request = UpdateReleaseRequest(
                chart=chart,
                dry_run=self.dry_run,
                disable_hooks=disable_hooks,
                values=values,
                name=release,
                wait=wait,
                timeout=timeout,
                force=force,
                recreate=recreate_pods)

            update_msg = stub.UpdateRelease(
                release_request,
                timeout + GRPC_EPSILON,
                metadata=self.metadata)

        except Exception:
            LOG.exception('Error while updating release %s', release)
            status = self.get_release_status(release)
            raise ex.ReleaseException(release, status, 'Upgrade')

        tiller_result = TillerResult(
            update_msg.release.name, update_msg.release.namespace,
            update_msg.release.info.status.Code.Name(
                update_msg.release.info.status.code),
            update_msg.release.info.Description, update_msg.release.version)

        return tiller_result
Example #10
0
 def _get_values(self):
     return Config(
         raw=self.storage.read("{}/values.yaml".format(self.chart_name)))