コード例 #1
0
    def main(self, argv):
        # Parse args once to find version
        parser = self.get_base_parser()
        (options, args) = parser.parse_known_args(argv)
        self._setup_logging(options.debug)

        # build available subcommands based on version
        api_version = options.murano_api_version
        subcommand_parser = self.get_subcommand_parser(api_version)
        self.parser = subcommand_parser

        keystone_session = None
        keystone_auth = None

        # Handle top-level --help/-h before attempting to parse
        # a command off the command line.
        if (not args and options.help) or not argv:
            self.do_help(options)
            return 0

        # Parse args again and call whatever callback was selected.
        args = subcommand_parser.parse_args(argv)

        # Short-circuit and deal with help command right away.
        if args.func == self.do_help:
            self.do_help(args)
            return 0
        elif args.func == self.do_bash_completion:
            self.do_bash_completion(args)
            return 0

        if not args.os_username and not args.os_auth_token:
            raise exc.CommandError("You must provide a username via"
                                   " either --os-username or env[OS_USERNAME]"
                                   " or a token via --os-auth-token or"
                                   " env[OS_AUTH_TOKEN]")

        if args.murano_packages_service == 'glance':
            args.murano_packages_service = 'glare'
            # TODO(kzaitsev): remove in P cycle
            versionutils.report_deprecated_feature(
                logger, "'glance' is no longer a valid option for "
                        "--murano-packages-service, please use 'glare' "
                        "instead.")

        if args.os_no_client_auth:
            if not args.murano_url:
                raise exc.CommandError(
                    "If you specify --os-no-client-auth"
                    " you must also specify a Murano API URL"
                    " via either --murano-url or env[MURANO_URL]")
            if (not args.glare_url and
                    args.murano_packages_service == 'glare'):
                raise exc.CommandError(
                    "If you specify --os-no-client-auth and"
                    " set murano-packages-service to 'glare'"
                    " you must also specify a glare API URL"
                    " via either --glare-url or env[GLARE_API]")
            if (not any([args.os_tenant_id, args.os_project_id]) and
                    args.murano_packages_service == 'glare'):
                # TODO(kzaitsev): see if we can use project's name here
                # NOTE(kzaitsev): glare v0.1 needs project_id to operate
                # correctly
                raise exc.CommandError(
                    "If you specify --os-no-client-auth and"
                    " set murano-packages-service to 'glare'"
                    " you must also specify your project's id"
                    " via either --os-project-id or env[OS_PROJECT_ID] or"
                    " --os-tenant-id or env[OS_TENANT_ID]")

        else:
            # Tenant name or ID is needed to make keystoneclient retrieve a
            # service catalog, it's not required if os_no_client_auth is
            # specified, neither is the auth URL.
            if not any([args.os_tenant_name, args.os_tenant_id,
                        args.os_project_id, args.os_project_name]):
                raise exc.CommandError("You must provide a project name or"
                                       " project id via --os-project-name,"
                                       " --os-project-id, env[OS_PROJECT_ID]"
                                       " or env[OS_PROJECT_NAME]. You may"
                                       " use os-project and os-tenant"
                                       " interchangeably.")
            if not args.os_auth_url:
                raise exc.CommandError("You must provide an auth url via"
                                       " either --os-auth-url or via"
                                       " env[OS_AUTH_URL]")

        endpoint_type = args.os_endpoint_type or 'publicURL'
        endpoint = args.murano_url
        glance_endpoint = args.glance_url

        if args.os_no_client_auth:
            # Authenticate through murano, don't use session
            kwargs = {
                'username': args.os_username,
                'password': args.os_password,
                'auth_token': args.os_auth_token,
                'auth_url': args.os_auth_url,
                'token': args.os_auth_token,
                'insecure': args.insecure,
                'timeout': args.api_timeout,
                'tenant': args.os_project_id or args.os_tenant_id,
            }
            glance_kwargs = kwargs.copy()

            if args.os_region_name:
                kwargs['region_name'] = args.os_region_name
                glance_kwargs['region_name'] = args.os_region_name
        else:
            # Create a keystone session and keystone auth
            keystone_session = ksession.Session.load_from_cli_options(args)

            args.os_project_name = args.os_project_name or args.os_tenant_name
            args.os_project_id = args.os_project_id or args.os_tenant_id

            # make args compatible with DefaultCLI/AuthCLI
            args.os_token = args.os_auth_token
            args.os_endpoint = ''
            # avoid password prompt if no password given
            args.os_password = args.os_password or '<no password>'
            (v2_auth_url, v3_auth_url) = self._discover_auth_versions(
                keystone_session, args.os_auth_url)
            if v3_auth_url:
                args.os_project_domain_id = (args.os_project_domain_id or
                                             'default')
                args.os_user_domain_id = (args.os_user_domain_id or
                                          'default')

            keystone_auth = AuthCLI.load_from_argparse_arguments(args)

            service_type = args.os_service_type or 'application-catalog'

            if not endpoint:
                endpoint = keystone_auth.get_endpoint(
                    keystone_session,
                    service_type=service_type,
                    interface=endpoint_type,
                    region_name=args.os_region_name)

            kwargs = {
                'session': keystone_session,
                'auth': keystone_auth,
                'service_type': service_type,
                'region_name': args.os_region_name,
            }
            glance_kwargs = kwargs.copy()

            # glance doesn't need endpoint_type
            kwargs['endpoint_type'] = endpoint_type
            kwargs['tenant'] = keystone_auth.get_project_id(keystone_session)

        if args.api_timeout:
            kwargs['timeout'] = args.api_timeout

        if not glance_endpoint:
            try:
                glance_endpoint = keystone_auth.get_endpoint(
                    keystone_session,
                    service_type='image',
                    interface=endpoint_type,
                    region_name=args.os_region_name)
            except Exception:
                pass

        glance_client = None
        if glance_endpoint:
            try:
                # TODO(starodubcevna): switch back to glance APIv2 when it will
                # be ready for use.
                glance_client = glanceclient.Client(
                    '1', glance_endpoint, **glance_kwargs)
            except Exception:
                pass
        if glance_client:
            kwargs['glance_client'] = glance_client
        else:
            logger.warning("Could not initialize glance client. "
                           "Image creation will be unavailable.")
            kwargs['glance_client'] = None

        if args.murano_packages_service == 'glare':
            glare_endpoint = args.glare_url

            if not glare_endpoint:
                # no glare_endpoint and we requested to store packages in glare
                # let's check keystone
                try:
                    glare_endpoint = keystone_auth.get_endpoint(
                        keystone_session,
                        service_type='artifact',
                        interface=endpoint_type,
                        region_name=args.os_region_name)
                except Exception:
                    raise exc.CommandError(
                        "You set murano-packages-service to {}"
                        " but there is not 'artifact' endpoint in keystone"
                        " Either register one or specify endpoint "
                        " via either --glare-url or env[GLARE_API]".format(
                            args.murano_packages_service))

            auth_token = \
                args.os_auth_token or keystone_auth.get_token(keystone_session)

            artifacts_client = art_client.Client(endpoint=glare_endpoint,
                                                 type_name='murano',
                                                 type_version=1,
                                                 token=auth_token,
                                                 insecure=args.insecure)
            kwargs['artifacts_client'] = artifacts_client

        client = murano_client.Client(api_version, endpoint, **kwargs)

        args.func(client, args)
コード例 #2
0
ファイル: package.py プロジェクト: numvc/LuxoftBot
 def download_to_fh(package_id, fh):
     try:
         fh.write(client.packages.download(package_id))
     except common_exceptions.HTTPNotFound:
         raise exceptions.CommandError("Package with id %s not "
                                       "found" % parsed_args.id)