ebcli/lib/codecommit.py (103 lines of code) (raw):
# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
from cement.utils.misc import minimal_logger
from botocore.exceptions import EndpointConnectionError
from ebcli.lib import aws
from ebcli.core import io
from ebcli.objects.exceptions import ServiceError
LOG = minimal_logger(__name__)
SUPPORTED_REGIONS = [
"af-south-1", # Africa (Cape Town)
"ap-east-1", # Asia Pacific (Hong Kong)
"ap-northeast-1", # Asia Pacific (Tokyo)
"ap-northeast-2", # Asia Pacific (Seoul)
"ap-northeast-3", # Asia Pacific (Osaka-Local)
"ap-south-1", # Asia Pacific (Mumbai)
"ap-southeast-1", # Asia Pacific (Singapore)
"ap-southeast-2", # Asia Pacific (Sydney)
"ca-central-1", # Canada (Central)
"cn-north-1", # China (Beijing)
"cn-northwest-1" # China (Ningxia)
"eu-central-1", # Europe (Frankfurt)
"eu-north-1", # Europe (Stockholm)
"eu-south-1", # Europe (Milan)
"eu-west-1", # Europe (Ireland)
"eu-west-2", # Europe (London)
"eu-west-3", # Europe (Paris)
"me-south-1", # Middle East (Bahrain)
"sa-east-1", # South America (Sao Paulo)
"us-east-1", # US East (N. Virginia)
"us-east-2", # US East (Ohio)
"us-gov-east-1", # AWS GovCloud (US-East)
"us-gov-west-1", # AWS GovCloud (US-West)
"us-west-1", # US West (N. California)
"us-west-2", # US West (Oregon)
]
UNSUPPORTED_REGIONS = [
"ap-southeast-3", # Asia Pacific (Jakarta)
]
def _make_api_call(operation_name, **operation_options):
try:
result = aws.make_api_call('codecommit', operation_name, **operation_options)
except ServiceError as ex:
if ex.code == 'AccessDeniedException':
io.echo(
"EB CLI does not have the right permissions to access CodeCommit."
" List of IAM policies needed by EB CLI, please configure and try again.\n"
" codecommit:CreateRepository\n"
" codecommit:CreateBranch\n"
" codecommit:GetRepository\n"
" codecommit:ListRepositories\n"
" codecommit:ListBranches\n"
"To learn more, see Docs: "
"http://docs.aws.amazon.com/codecommit/latest/userguide/access-permissions.html"
)
raise ex
return result
def create_repository(repo_name, repo_description=None):
params = dict(repositoryName=repo_name)
if repo_description is not None:
params['repositoryDescription'] = repo_description
result = _make_api_call('create_repository', **params)
return result
def create_branch(repo_name, branch_name, commit_id):
params = dict(repositoryName=repo_name, branchName=branch_name, commitId=commit_id)
_make_api_call('create_branch', **params)
def get_repository(repo_name):
params = dict(repositoryName=repo_name)
result = _make_api_call('get_repository', **params)
return result
def get_branch(repo_name, branch_name):
params = dict(repositoryName=repo_name, branchName=branch_name)
result = _make_api_call('get_branch', **params)
return result
def list_repositories(next_token=None, sort_by='lastModifiedDate', order='descending'):
params = dict()
if next_token is not None:
params['nextToken'] = next_token
if sort_by is not None:
params['sortBy'] = sort_by
if order is not None:
params['order'] = order
result = _make_api_call('list_repositories', **params)
return result
def list_branches(repo_name, next_token=None):
params = dict(repositoryName=repo_name)
if next_token is not None:
params['nextToken'] = next_token
result = _make_api_call('list_branches', **params)
return result
def region_supported():
region = aws.get_region_name()
if region is None or region in UNSUPPORTED_REGIONS:
return False
if region in SUPPORTED_REGIONS:
return True
# If region support is unknown attempt to make a request and check for
# connection error. If there is a connection error it is most likely that
# the region is not supported. This is a fall back for regions that have
# not been added to our region support lists.
try:
list_repositories()
except EndpointConnectionError as e:
LOG.debug(
'Could not connect to CodeCommit in region {}: {}'.format(
region, e))
return False
except Exception as e:
LOG.debug('Request failed while checking region support: {}'.format(e))
return True