示例#1
0
def k8s_create(context, tag='latest', namespace=None, filename=None):
    if filename is None:
        kubernetes_yml = os.path.join(CWD, HOKUSAI_CONFIG_DIR,
                                      "%s.yml" % context)
    else:
        kubernetes_yml = filename

    if not os.path.isfile(kubernetes_yml):
        raise HokusaiError("Yaml file %s does not exist." % kubernetes_yml)

    ecr = ECR()
    if not ecr.project_repo_exists():
        raise HokusaiError(
            "ECR repository %s does not exist... did you run `hokusai setup` for this project?"
            % config.project_name)

    if not ecr.tag_exists(tag):
        raise HokusaiError(
            "Image tag %s does not exist... did you run `hokusai registry push`?"
            % tag)

    if tag is 'latest' and not ecr.tag_exists(context):
        ecr.retag(tag, context)
        print_green("Updated tag 'latest' -> %s" % context)

    if filename is None:
        configmap = ConfigMap(context, namespace=namespace)
        configmap.create()
        print_green("Created configmap %s-environment" % config.project_name)

    kctl = Kubectl(context, namespace=namespace)
    shout(kctl.command("create --save-config -f %s" % kubernetes_yml),
          print_output=True)
    print_green("Created Kubernetes environment %s" % kubernetes_yml)
示例#2
0
def k8s_create(context, tag='latest', namespace=None, yaml_file_name=None):
    if yaml_file_name is None: yaml_file_name = context
    kubernetes_yml = os.path.join(os.getcwd(),
                                  "hokusai/%s.yml" % yaml_file_name)
    if not os.path.isfile(kubernetes_yml):
        raise HokusaiError("Yaml file %s does not exist." % kubernetes_yml)

    ecr = ECR()
    if not ecr.project_repo_exists():
        raise HokusaiError(
            "ECR repository %s does not exist... did you run `hokusai setup` for this project?"
            % config.project_name)

    if not ecr.tag_exists(tag):
        raise HokusaiError(
            "Image tag %s does not exist... did you run `hokusai push`?" % tag)

    if tag is 'latest' and not ecr.tag_exists(context):
        ecr.retag(tag, context)
        print_green("Updated tag 'latest' -> %s" % context)

    kctl = Kubectl(context, namespace=namespace)
    shout(kctl.command("create --save-config -f %s" % kubernetes_yml),
          print_output=True)
    print_green("Created Kubernetes environment %s" % kubernetes_yml)
示例#3
0
def k8s_create(context, tag='latest', namespace=None, filename=None, environment=()):
  if filename is None:
    yaml_template = TemplateSelector().get(os.path.join(CWD, HOKUSAI_CONFIG_DIR, context))
  else:
    yaml_template = TemplateSelector().get(filename)

  ecr = ECR()
  if not ecr.project_repo_exists():
    raise HokusaiError("ECR repository %s does not exist... did you run `hokusai setup` for this project?" % config.project_name)

  if not ecr.tag_exists(tag):
    raise HokusaiError("Image tag %s does not exist... did you run `hokusai registry push`?" % tag)

  if tag == 'latest' and not ecr.tag_exists(context):
    ecr.retag(tag, context)
    print_green("Updated tag 'latest' -> %s" % context)

  if filename is None:
    configmap = ConfigMap(context, namespace=namespace)
    for s in environment:
      if '=' not in s:
        raise HokusaiError("Error: environment variables must be of the form 'KEY=VALUE'")
      split = s.split('=', 1)
      configmap.update(split[0], split[1])
    configmap.create()
    print_green("Created configmap %s-environment" % config.project_name)

  kctl = Kubectl(context, namespace=namespace)
  yaml_spec = YamlSpec(yaml_template).to_file()

  shout(kctl.command("create --save-config -f %s" % yaml_spec), print_output=True)
  print_green("Created Kubernetes environment %s" % yaml_template)
示例#4
0
class TestECR(HokusaiIntegrationTestCase):
  def setUp(self):
    self.ecr = ECR()

  @httpretty.activate
  def test_registry(self):
    httpretty.register_uri(httpretty.POST, "https://ecr.us-east-1.amazonaws.com/",
                            body=open(os.path.join(os.getcwd(), 'test', 'fixtures', 'ecr-repositories-response.json')).read(),
                            content_type="application/x-amz-json-1.1")
    repositories = [str(repo['repositoryName']) for repo in self.ecr.registry()]
    self.assertTrue('foo' in repositories)
    self.assertTrue('bar' in repositories)
    self.assertTrue('baz' in repositories)

  @httpretty.activate
  def test_project_repository_exists(self):
    httpretty.register_uri(httpretty.POST, "https://ecr.us-east-1.amazonaws.com/",
                            body=open(os.path.join(os.getcwd(), 'test', 'fixtures', 'ecr-repositories-response.json')).read(),
                            content_type="application/x-amz-json-1.1")
    self.assertTrue(self.ecr.project_repository_exists())

  @httpretty.activate
  def test_create_project_repository(self):
    httpretty.register_uri(httpretty.POST, "https://ecr.us-east-1.amazonaws.com/",
                            body=open(os.path.join(os.getcwd(), 'test', 'fixtures', 'ecr-create-repository-response.json')).read(),
                            content_type="application/x-amz-json-1.1")
    self.assertTrue(self.ecr.create_project_repository())

  @httpretty.activate
  def test_get_login(self):
    httpretty.register_uri(httpretty.POST, "https://ecr.us-east-1.amazonaws.com/",
                           body=open(os.path.join(os.getcwd(), 'test', 'fixtures', 'ecr-authorization-response.json')).read(),
                           content_type="application/x-amz-json-1.1")
    self.assertEqual(self.ecr.get_login(), 'docker login -u AWS -p 76W8YEUFHDSAE98DFDHSFSDFIUHSDAJKGKSADFGKDF https://123456789012.dkr.ecr.us-east-1.amazonaws.com')

  @httpretty.activate
  def test_get_images(self):
    httpretty.register_uri(httpretty.POST, "https://ecr.us-east-1.amazonaws.com/",
                           body=open(os.path.join(os.getcwd(), 'test', 'fixtures', 'ecr-images-response.json')).read(),
                           content_type="application/x-amz-json-1.1")
    self.assertEqual(self.ecr.get_images()[0]['imageTags'], ['7shdn4f0f34bb8shdkb313cbeccb2fc031808duho', 'latest'])
    self.assertEqual(self.ecr.get_images()[0]['imageDigest'], 'sha256:8sh968hsn205e8bff53ba8ed1006c7f41dacd17db164efdn6d346204f997shdn')
    self.assertEqual(self.ecr.get_images()[0]['registryId'], '123456789012')
    self.assertEqual(self.ecr.get_images()[0]['repositoryName'], 'foo')

  @httpretty.activate
  def test_tag_exists(self):
    httpretty.register_uri(httpretty.POST, "https://ecr.us-east-1.amazonaws.com/",
                           body=open(os.path.join(os.getcwd(), 'test', 'fixtures', 'ecr-images-response.json')).read(),
                           content_type="application/x-amz-json-1.1")
    self.assertTrue(self.ecr.tag_exists('7shdn4f0f34bb8shdkb313cbeccb2fc031808duho'))
    self.assertTrue(self.ecr.tag_exists('latest'))
示例#5
0
def push(tag, force, overwrite):
  if force is None and shout('git status --porcelain'):
    raise HokusaiError("Working directory is not clean.  Aborting.")

  if force is None and shout('git status --porcelain --ignored'):
    raise HokusaiError("Working directory contains ignored files and/or directories.  Aborting.")

  ecr = ECR()
  if not ecr.project_repository_exists():
    raise HokusaiError("ECR repository %s does not exist... did you run `hokusai setup` for this project?" % config.project_name)

  shout(ecr.get_login())
  if tag is None:
    tag = shout('git rev-parse HEAD').strip()

  if overwrite is None and ecr.tag_exists(tag):
    raise HokusaiError("Tag %s already exists in remote repository.  Aborting." % tag)

  docker_compose_yml = os.path.join(os.getcwd(), 'hokusai/common.yml')
  shout("docker-compose -f %s -p hokusai build" % docker_compose_yml, print_output=True)
  build = "hokusai_%s:latest" % config.project_name

  shout("docker tag %s %s:%s" % (build, config.aws_ecr_registry, tag))
  shout("docker push %s:%s" % (config.aws_ecr_registry, tag), print_output=True)
  print_green("Pushed %s to %s:%s" % (build, config.aws_ecr_registry, tag))

  shout("docker tag %s %s:%s" % (build, config.aws_ecr_registry, 'latest'))
  shout("docker push %s:%s" % (config.aws_ecr_registry, 'latest'), print_output=True)
  print_green("Pushed %s to %s:%s" % (build, config.aws_ecr_registry, 'latest'))
示例#6
0
def push(tag, build, force, overwrite, skip_latest=False):
  if force is None and shout('git status --porcelain'):
    raise HokusaiError("Working directory is not clean.  Aborting.")

  if force is None and shout('git status --porcelain --ignored'):
    raise HokusaiError("Working directory contains ignored files and/or directories.  Aborting.")

  ecr = ECR()
  if not ecr.project_repo_exists():
    raise HokusaiError("ECR repo %s does not exist... did you run `hokusai setup` for this project?" % config.project_name)

  shout(ecr.get_login())
  if tag is None:
    tag = shout('git rev-parse HEAD').strip()

  if overwrite is None and ecr.tag_exists(tag):
    raise HokusaiError("Tag %s already exists in registry.  Aborting." % tag)

  if build:
    Docker().build()

  build_tag = "hokusai_%s:latest" % config.project_name

  shout("docker tag %s %s:%s" % (build_tag, ecr.project_repo, tag))
  shout("docker push %s:%s" % (ecr.project_repo, tag), print_output=True)
  print_green("Pushed %s to %s:%s" % (build_tag, ecr.project_repo, tag), newline_after=True)

  if skip_latest: return

  shout("docker tag %s %s:%s" % (build_tag, ecr.project_repo, 'latest'))
  shout("docker push %s:%s" % (ecr.project_repo, 'latest'), print_output=True)
  print_green("Pushed %s to %s:%s" % (build_tag, ecr.project_repo, 'latest'), newline_after=True)
示例#7
0
def push(tag, build, force, overwrite, skip_latest=False):
    if force is None and shout('git status --porcelain'):
        raise HokusaiError("Working directory is not clean.  Aborting.")

    if force is None and shout('git status --porcelain --ignored'):
        raise HokusaiError(
            "Working directory contains ignored files and/or directories.  Aborting."
        )

    ecr = ECR()
    if not ecr.project_repo_exists():
        raise HokusaiError(
            "ECR repo %s does not exist... did you run `hokusai setup` for this project?"
            % config.project_name)

    shout(ecr.get_login())
    if tag is None:
        tag = shout('git rev-parse HEAD').strip()

    if overwrite is None and ecr.tag_exists(tag):
        raise HokusaiError("Tag %s already exists in registry.  Aborting." %
                           tag)

    if build:
        docker_compose_yml = os.path.join(os.getcwd(), 'hokusai/build.yml')
        legacy_docker_compose_yml = os.path.join(os.getcwd(),
                                                 'hokusai/common.yml')
        if not os.path.isfile(docker_compose_yml) and not os.path.isfile(
                legacy_docker_compose_yml):
            raise HokusaiError("Yaml files %s / %s do not exist." %
                               (docker_compose_yml, legacy_docker_compose_yml))
        if os.path.isfile(docker_compose_yml):
            shout("docker-compose -f %s -p hokusai build" % docker_compose_yml,
                  print_output=True)
        if os.path.isfile(legacy_docker_compose_yml):
            shout("docker-compose -f %s -p hokusai build" %
                  legacy_docker_compose_yml,
                  print_output=True)

    build_tag = "hokusai_%s:latest" % config.project_name

    shout("docker tag %s %s:%s" % (build_tag, ecr.project_repo, tag))
    shout("docker push %s:%s" % (ecr.project_repo, tag), print_output=True)
    print_green("Pushed %s to %s:%s" % (build_tag, ecr.project_repo, tag))

    if skip_latest: return

    shout("docker tag %s %s:%s" % (build_tag, ecr.project_repo, 'latest'))
    shout("docker push %s:%s" % (ecr.project_repo, 'latest'),
          print_output=True)
    print_green("Pushed %s to %s:%s" % (build_tag, ecr.project_repo, 'latest'))
示例#8
0
def environment_create(context):
    kubernetes_yml = os.path.join(os.getcwd(), "hokusai/%s.yml" % context)
    if not os.path.isfile(kubernetes_yml):
        raise HokusaiError("Yaml file %s does not exist for given context." %
                           kubernetes_yml)

    ecr = ECR()
    if not ecr.project_repository_exists():
        raise HokusaiError(
            "ECR repository %s does not exist... did you run `hokusai setup` for this project?"
            % config.project_name)

    if not ecr.tag_exists('latest'):
        raise HokusaiError(
            "Image tag 'latest' does not exist... did you run `hokusai push`?")

    if not ecr.tag_exists(context):
        ecr.retag('latest', context)
        print_green("Updated tag 'latest' -> %s" % context)

    kctl = Kubectl(context)
    shout(kctl.command("create --save-config -f %s" % kubernetes_yml),
          print_output=True)
    print_green("Created remote environment %s" % context)
示例#9
0
文件: test_ecr.py 项目: rm3l/hokusai
class TestECR(HokusaiIntegrationTestCase):
    def setUp(self):
        self.ecr = ECR()

    @httpretty.activate
    def test_registry(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-repositories-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        repositories = [
            str(repo['repositoryName']) for repo in self.ecr.registry
        ]
        self.assertTrue('hello' in repositories)
        self.assertTrue('bar' in repositories)
        self.assertTrue('baz' in repositories)

    @httpretty.activate
    def test_project_repo_exists(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-repositories-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertTrue(self.ecr.project_repo_exists())

    @httpretty.activate
    def test_get_project_repo(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-repositories-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertEqual(self.ecr.project_repo,
                         '123456789012.dkr.ecr.us-east-1.amazonaws.com/hello')

    @httpretty.activate
    def test_create_project_repo(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-create-repository-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-empty-repositories-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertTrue(self.ecr.create_project_repo())

    @httpretty.activate
    def test_get_login(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-authorization-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertEqual(
            self.ecr.get_login(),
            'docker login -u AWS -p 76W8YEUFHDSAE98DFDHSFSDFIUHSDAJKGKSADFGKDF https://123456789012.dkr.ecr.us-east-1.amazonaws.com'
        )

    @httpretty.activate
    def test_images(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-images-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertEqual(
            self.ecr.images[0]['imageTags'],
            ['a2605e5b93ec4beecde122c53a3fdea18807459c', 'latest'])
        self.assertEqual(
            self.ecr.images[0]['imageDigest'],
            'sha256:8sh968hsn205e8bff53ba8ed1006c7f41dacd17db164efdn6d346204f997shdn'
        )
        self.assertEqual(self.ecr.images[0]['registryId'], '123456789012')
        self.assertEqual(self.ecr.images[0]['repositoryName'], 'hello')

    @httpretty.activate
    def test_tag_exists(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-images-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertTrue(
            self.ecr.tag_exists('a2605e5b93ec4beecde122c53a3fdea18807459c'))
        self.assertTrue(self.ecr.tag_exists('latest'))

    @httpretty.activate
    def test_tags(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-images-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertIn('a2605e5b93ec4beecde122c53a3fdea18807459c',
                      self.ecr.tags())
        self.assertIn('latest', self.ecr.tags())

    @httpretty.activate
    def test_find_git_sha1_image_tag(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-images-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertEqual(self.ecr.find_git_sha1_image_tag('latest'),
                         'a2605e5b93ec4beecde122c53a3fdea18807459c')

    @httpretty.activate
    def test_image_digest_for_tag(self):
        httpretty.register_uri(
            httpretty.POST,
            "https://sts.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'sts-get-caller-identity-response.xml')).read(),
            content_type="application/xml")
        httpretty.register_uri(
            httpretty.POST,
            "https://api.ecr.us-east-1.amazonaws.com/",
            body=open(
                os.path.join(os.getcwd(), 'test', 'fixtures',
                             'ecr-images-response.json')).read(),
            content_type="application/x-amz-json-1.1")
        self.assertEqual(
            self.ecr.image_digest_for_tag(
                'a2605e5b93ec4beecde122c53a3fdea18807459c'),
            'sha256:8sh968hsn205e8bff53ba8ed1006c7f41dacd17db164efdn6d346204f997shdn'
        )
        self.assertEqual(
            self.ecr.image_digest_for_tag('latest'),
            'sha256:8sh968hsn205e8bff53ba8ed1006c7f41dacd17db164efdn6d346204f997shdn'
        )