Example #1
0
    def setup(self):
        scout = Scout("forge", __version__)
        scout_res = scout.report()

        print self.terminal.bold("== Checking Kubernetes Setup ==")
        print

        checks = (("kubectl", "version", "--short"),
                  ("kubectl", "get", "service", "kubernetes", "--namespace",
                   "default"))

        for cmd in checks:
            e = sh.run(*cmd)
            if e.result is ERROR:
                print
                raise CLIError(
                    self.terminal.red("== Kubernetes Check Failed ==") +
                    "\n\nPlease make sure kubectl is installed/configured correctly."
                )

        registry = "registry.hub.docker.com"
        repo = None
        user = os.environ.get("USER", "")
        password = None
        json_key = None

        @task()
        def validate():
            dr = Docker(registry, repo, user, password)
            dr.validate()

        print
        print self.terminal.bold("== Setting up Docker ==")

        while True:
            print
            registry = self.prompt("Docker registry", registry)
            user = self.prompt("Docker user", user)
            repo = self.prompt("Docker organization", user)
            if user == "_json_key":
                json_key, password = self.prompt("Path to json key",
                                                 json_key,
                                                 loader=file_contents)
            else:
                password = self.prompt("Docker password", echo=False)

            print
            e = validate.run(
                task_include=lambda x: x.task.name in ('pull', 'push', 'tag'))
            if e.result is ERROR:
                print
                print self.terminal.red("-- please try again --")
                continue
            else:
                break

        print

        config = renders("SETUP_TEMPLATE",
                         SETUP_TEMPLATE,
                         docker="%s/%s" % (registry, repo),
                         user=user,
                         password=base64.encodestring(password).replace(
                             "\n", "\n  "))

        config_file = "forge.yaml"

        print self.terminal.bold("== Writing config to %s ==" % config_file)

        with open(config_file, "write") as fd:
            fd.write(config)

        print
        print config.strip()
        print

        print self.terminal.bold("== Done ==")
Example #2
0
    def setup(self):
        with task.verbose(True):
            scout = Scout("forge", __version__)
            scout_res = scout.report()

            task.echo(self.terminal.bold("== Checking Kubernetes Setup =="))
            task.echo()

            checks = (("kubectl", "version", "--short"),
                      ("kubectl", "get", "service", "kubernetes", "--namespace", "default"))

            for cmd in checks:
                e = sh.run(*cmd)
                if e.result is ERROR:
                    task.echo()
                    task.echo(self.terminal.bold_red("== Kubernetes Check Failed =="))
                    task.echo()
                    task.echo()
                    task.echo(self.terminal.bold("Please make sure kubectl is installed/configured correctly."))
                    raise TaskError("")

            regtype = "generic"
            prompts = {
                ("generic", "url"): ("Docker registry url", "registry.hub.docker.com"),
                ("generic", "user"): ("Docker user", None),
                ("generic", "namespace"): ("Docker namespace/organization (enter username again for standard accounts)", None),
                ("generic", "password"): ("Docker password", None),
                ("gcr", "key"): ["Path to json key, leave unspecified to use gcloud auth", None]
            }

            @task()
            def validate():
                c = yaml.dump({"registry": regvalues})
                task.echo(c)
                conf = config.load("setup", c)
                dr = get_docker(conf.registry)
                dr.validate()

            task.echo()
            task.echo(self.terminal.bold("== Setting up Docker =="))

            while True:
                task.echo()
                types = OrderedDict((("ecr", config.ECR),
                                     ("gcr", config.GCR),
                                     ("generic", config.DOCKER)))
                regtype = self.prompt("Registry type (one of %s)" % ", ".join(types.keys()), regtype)
                if regtype not in types:
                    task.echo()
                    task.echo(
                        self.terminal.red("%s is not a valid choice, please choose one of %s" %
                                          (regtype, ", ".join(types.keys())))
                    )
                    task.echo()
                    regtype = "generic"
                    continue

                reg = types[regtype]
                regvalues = OrderedDict((("type", reg.fields["type"].type.value),))
                for f in reg.fields.values():
                    if f.name in ("type", "verify"): continue
                    prompt, default = prompts.get((regtype, f.name), (f.name, None))
                    if (regtype, f.name) == ("gcr", "key"):
                        key, value = self.prompt(prompt, default, optional=True, loader=file_contents)
                        prompts[(regtype, f.name)][1] = key
                    else:
                        if f.name in ("password",):
                            if regvalues["user"] is not None:
                                value = self.prompt(prompt, default, echo=False)
                            else:
                                value = None
                        else:
                            value = self.prompt(prompt, default, optional=not f.required)
                    if f.name in ("password", "key"):
                        if value:
                            regvalues[f.name] = base64.encodestring(value)
                    else:
                        regvalues[f.name] = value

                task.echo()
                e = validate.run()
                if e.result is ERROR:
                    task.echo()
                    task.echo(self.terminal.red("-- please try again --"))
                    e.recover()
                    continue
                else:
                    break

            task.echo()

            config_content = renders("SETUP_TEMPLATE", SETUP_TEMPLATE,
                                     yaml=yaml.dump({"registry": regvalues}, allow_unicode=True,
                                                    default_flow_style=False))

            config_file = "forge.yaml"

            task.echo(self.terminal.bold("== Writing config to %s ==" % config_file))

            with open(config_file, "write") as fd:
                fd.write(config_content)

            task.echo()
            task.echo(config_content.strip())
            task.echo()

            task.echo(self.terminal.bold("== Done =="))