예제 #1
0
 def take_snapshot(self):
     self.get_snapshots()
     console.echo('Generating snapshot files...')
     for api in self.apis:
         getattr(self, f'download_{api}')()
     self.progress_bar.close()
     console.echo('Done.')
예제 #2
0
 def wrapper(*args, **kwargs):
     try:
         result = func(*args, **kwargs)
         return result
     except Exception as e:
         touch(APIGEE_CLI_EXCEPTION_LOG_FILE)
         f_handler = logging.FileHandler(APIGEE_CLI_EXCEPTION_LOG_FILE,
                                         'w+')
         f_handler.setLevel(logging.INFO)
         formatter = logging.Formatter(
             '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
         f_handler.setFormatter(formatter)
         logging.getLogger("").addHandler(f_handler)
         logging.error('Exception occurred', exc_info=True)
         frm = inspect.trace()[-1]
         mod = inspect.getmodule(frm[0])
         modname = mod.__name__ if mod else frm[1]
         # error_message = {'Exception': {'detail': {'errorcode': f'{modname}.{type(e).__name__}'}, 'exceptionstring': f'{e}'}}
         sys.exit(
             f'An exception of type {modname}.{type(e).__name__} occurred. Arguments:\n{e}'
         )
         # sys.exit(json.dumps(error_message, indent=2))
     except KeyboardInterrupt as ki:
         console.echo()
         sys.exit(130)
예제 #3
0
 def _func(ts):
     ts_file = str(Path(self._targetservers_dir) / ts)
     if not force:
         path_exists(os.path.relpath(ts_file))
     resp = Targetservers(self._auth, self._org_name,
                          ts).get_targetserver(environment).text
     console.echo(resp, expc_verbosity=1)
     with open(ts_file, 'w') as f:
         f.write(resp)
예제 #4
0
def file(username, password, mfa_secret, token, zonename, org, profile, file,
         key, **kwargs):
    console.echo(
        auth_with_prefix(gen_auth(username, password, mfa_secret, token,
                                  zonename),
                         org,
                         None,
                         file=file,
                         key=key))
예제 #5
0
def name(username, password, mfa_secret, token, zonename, org, profile, name,
         **kwargs):
    console.echo(
        auth_with_prefix(
            gen_auth(username, password, mfa_secret, token, zonename),
            org,
            name,
            file=None,
            key='name',
        ))
예제 #6
0
 def _func(cache):
     cache_file = str(Path(self._caches_dir) / cache)
     if not force:
         path_exists(os.path.relpath(cache_file))
     resp = (Caches(
         self._auth, self._org_name,
         cache).get_information_about_a_cache(environment).text)
     console.echo(resp, expc_verbosity=1)
     with open(cache_file, 'w') as f:
         f.write(resp)
예제 #7
0
 def _func(kvm):
     kvm_file = str(Path(self._keyvaluemaps_dir) / kvm)
     if not force:
         path_exists(os.path.relpath(kvm_file))
     resp = (Keyvaluemaps(
         self._auth, self._org_name,
         kvm).get_keyvaluemap_in_an_environment(environment).text)
     console.echo(resp, expc_verbosity=1)
     with open(kvm_file, 'w') as f:
         f.write(resp)
예제 #8
0
def _get_access_token_for_token(auth, username, password, oauth_url,
                                post_headers, session):
    if auth.zonename:
        oauth_url = APIGEE_ZONENAME_OAUTH_URL.format(zonename=auth.zonename)
    post_body = f'username={urllib.parse.quote(username)}&password={urllib.parse.quote(password)}&grant_type=password&response_type=token'
    try:
        return session.post(f'{oauth_url}',
                            headers=post_headers,
                            data=post_body)
    except ConnectionError as ce:
        console.echo(ce)
예제 #9
0
 def _download_users_for_a_role(self, role_name):
     try:
         write_file(
             Userroles(self.auth, self.org_name, role_name).get_users_for_a_role().json(),
             self._gen_download_path(subpaths=['userroles', role_name, 'users.json']),
             fs_write=self.fs_write,
             indent=2,
         )
     except HTTPError as e:
         console.echo(
             f'Ignoring {type(e).__name__} {e.response.status_code} error for User Role ({role_name}) users'
         )
예제 #10
0
 def create_a_consumer_key_and_secret(
     self,
     developer,
     consumer_key=None,
     consumer_secret=None,
     key_length=32,
     secret_length=32,
     key_suffix=None,
     key_delimiter='-',
     products=[],
 ):
     uri = CREATE_A_CONSUMER_KEY_AND_SECRET_PATH.format(
         api_url=APIGEE_ADMIN_API_URL,
         org=self._org_name,
         developer=developer,
         name=self._app_name,
     )
     hdrs = auth.set_header(self._auth,
                            headers={
                                'Accept': 'application/json',
                                'Content-Type': 'application/json'
                            })
     # app = self.get_developer_app_details(developer)
     if not consumer_key:
         consumer_key = "".join(
             random.SystemRandom().choice(string.ascii_letters +
                                          string.digits)
             for _ in range(key_length))
     if not consumer_secret:
         consumer_secret = "".join(
             random.SystemRandom().choice(string.ascii_letters +
                                          string.digits)
             for _ in range(secret_length))
     if key_suffix:
         consumer_key += key_delimiter
         consumer_key += key_suffix
     body = {'consumerKey': consumer_key, 'consumerSecret': consumer_secret}
     resp = requests.post(uri, headers=hdrs, json=body)
     resp.raise_for_status()
     if products:
         console.echo(resp.text)
         consumer_key = resp.json()['consumerKey']
         request_body = json.dumps({
             'apiProducts': products,
             'attributes': resp.json()['attributes']
         })
         console.echo(
             f'Adding API Products {products} to consumerKey {consumer_key}'
         )
         return self.add_api_product_to_key(developer, consumer_key,
                                            request_body)
     return resp
예제 #11
0
def _get_access_token_for_sso(auth, username, password, oauth_url,
                              post_headers, session):
    oauth_url = APIGEE_ZONENAME_OAUTH_URL.format(zonename=auth.zonename)
    passcode_url = APIGEE_SAML_LOGIN_URL.format(zonename=auth.zonename)
    webbrowser.open(passcode_url)
    console.echo(
        'SSO authorization page has automatically been opened in your default browser.'
    )
    console.echo(
        'Follow the instructions in the browser to complete this authorization request.'
    )
    console.echo(
        f"""\nIf your browser did not automatically open, go to the following URL and sign in:\n\n{passcode_url}\n\nthen copy the Temporary Authentication Code.\n"""
    )
    try:
        passcode = click.prompt(
            'Please enter the Temporary Authentication Code')
        post_body = f'passcode={passcode}&grant_type=password&response_type=token'
        try:
            response_post = session.post(f'{oauth_url}',
                                         headers=post_headers,
                                         data=post_body)
            response_post.json()['access_token']
            return response_post
        except KeyError:
            sys.exit(
                'Temporary Authentication Code is invalid. Please try again.')
    except ConnectionError as ce:
        console.echo(ce)
    except KeyError:
        pass
예제 #12
0
 def download_developers(self):
     for developer in self.snapshot_data.developers:
         try:
             write_file(
                 Developers(self.auth, self.org_name, developer).get_developer().text,
                 self._gen_download_path(subpaths=['developers', f'{developer}.json']),
                 fs_write=self.fs_write,
             )
         except HTTPError as e:
             console.echo(
                 f'Ignoring {type(e).__name__} {e.response.status_code} error for Developer ({developer})'
             )
         self._progress_callback(desc='Developers')
     return self.snapshot_data.developers
예제 #13
0
 def download_apiproducts(self):
     for apiproduct in self.snapshot_data.apiproducts:
         try:
             write_file(
                 Apiproducts(self.auth, self.org_name, apiproduct).get_api_product().text,
                 self._gen_download_path(subpaths=['apiproducts', f'{apiproduct}.json']),
                 fs_write=self.fs_write,
             )
         except HTTPError as e:
             console.echo(
                 f'Ignoring {type(e).__name__} {e.response.status_code} error for API Product ({apiproduct})'
             )
         self._progress_callback(desc='API Products')
     return self.snapshot_data.apiproducts
예제 #14
0
 def _download_resource_permissions(self, role_name):
     try:
         data = {
             'snapshot': self._get_permissions(role_name),
             'target_path': self._gen_download_path(
                 subpaths=['userroles', role_name, 'resource_permissions.json']
             ),
             'fs_write': self.fs_write,
         }
         write_file(data['snapshot'], data['target_path'], fs_write=data['fs_write'])
     except HTTPError as e:
         console.echo(
             f'Ignoring {type(e).__name__} {e.response.status_code} error for User Role ({role_name}) resource permissions'
         )
예제 #15
0
 def wrapper(*args, **kwargs):
     try:
         result = func(*args, **kwargs)
         return result
     except Exception as e:
         logging.error('Exception occurred', exc_info=True)
         frm = inspect.trace()[-1]
         mod = inspect.getmodule(frm[0])
         modname = mod.__name__ if mod else frm[1]
         sys.exit(
             f'An exception of type {modname}.{type(e).__name__} occurred. Arguments:\n{e}'
         )
     except KeyboardInterrupt:
         console.echo()
         sys.exit(130)
예제 #16
0
 def set_apiproxy_basepath(self, basepath, file):
     default_file = os.path.abspath(file)
     tree = et.parse(default_file)
     current_basepath = None
     try:
         current_basepath = tree.find('.//BasePath').text
     except AttributeError:
         sys.exit(f'No BasePath found in {default_file}')
     with open(default_file, 'r+') as f:
         body = f.read().replace(current_basepath, basepath)
         f.seek(0)
         f.write(body)
         f.truncate()
     console.echo(f'{current_basepath} -> {basepath}')
     console.echo(f'M  {os.path.relpath(default_file)}')
예제 #17
0
 def undeploy_shared_flow_revisions_in_environment(
     self, environment, shared_flow_name, except_revisions=set()
 ):
     resp = self.get_shared_flow_deployments(shared_flow_name)
     for deployment in resp.json()['environment']:
         if deployment['name'] == environment:
             for detail in deployment['revision']:
                 revision_number = int(detail['name'])
                 if revision_number not in except_revisions:
                     console.echo(
                         f'Undeploying revision {revision_number}... ', end='', flush=True
                     )
                     self.undeploy_a_shared_flow(environment, shared_flow_name, revision_number)
                     console.echo('Done')
     return resp
예제 #18
0
 def download_apps(self):
     for developer, apps in self.snapshot_data.apps.items():
         for app in apps:
             try:
                 write_file(
                     Apps(self.auth, self.org_name, app)
                     .get_developer_app_details(developer)
                     .text,
                     self._gen_download_path(subpaths=['apps', developer, f'{app}.json']),
                     fs_write=self.fs_write,
                 )
             except HTTPError as e:
                 console.echo(
                     f'Ignoring {type(e).__name__} {e.response.status_code} error for Developer App ({app})'
                 )
             self._progress_callback(desc='Developer Apps')
     return self.snapshot_data.apps
예제 #19
0
 def download_caches(self):
     for environment in self.environments:
         for cache in self.snapshot_data.caches[environment]:
             try:
                 write_file(
                     Caches(self.auth, self.org_name, cache)
                     .get_information_about_a_cache(environment)
                     .text,
                     self._gen_download_path(subpaths=['caches', environment, f'{cache}.json']),
                     fs_write=self.fs_write,
                 )
             except HTTPError as e:
                 console.echo(
                     f'Ignoring {type(e).__name__} {e.response.status_code} error for Cache ({cache})'
                 )
             self._progress_callback(desc='Caches')
     return self.snapshot_data.caches
예제 #20
0
 def download_apis(self):
     for api, metadata in self.snapshot_data.apis.items():
         for revision in metadata['revision']:
             output_file = self._gen_download_path(
                 subpaths=['apis', api, revision, f'{api}.zip']
             )
             target_directory = os.path.dirname(output_file)
             try:
                 Apis(self.auth, self.org_name, None).export_api_proxy(
                     api, revision, fs_write=True, output_file=output_file
                 )
                 extract_zip(output_file, target_directory)
                 os.remove(output_file)
             except HTTPError as e:
                 console.echo(
                     f'Ignoring {type(e).__name__} {e.response.status_code} error for API Proxy ({api}, revision {revision})'
                 )
         self._progress_callback(desc='APIs')
     return self.snapshot_data.apis
예제 #21
0
 def push_data_masks_for_an_api_proxy(self, file):
     maskconfig = read_file(file, type='json')
     maskconfig_name = maskconfig['name']
     try:
         self.get_data_mask_details_for_an_api_proxy(maskconfig_name)
         console.echo(f'Updating {maskconfig_name} for {self._api_name}')
         console.echo(self.create_data_masks_for_an_api_proxy(body).text)
     except HTTPError as e:
         if e.response.status_code != 404:
             raise e
         console.echo(f'Creating {maskconfig_name} for {self._api_name}')
         console.echo(self.create_data_masks_for_an_api_proxy(body).text)
예제 #22
0
 def download_targetservers(self):
     for environment in self.environments:
         for targetserver in self.snapshot_data.targetservers[environment]:
             try:
                 write_file(
                     Targetservers(self.auth, self.org_name, targetserver)
                     .get_targetserver(environment)
                     .text,
                     self._gen_download_path(
                         subpaths=['targetservers', environment, f'{targetserver}.json']
                     ),
                     fs_write=self.fs_write,
                 )
             except HTTPError as e:
                 console.echo(
                     f'Ignoring {type(e).__name__} {e.response.status_code} error for TargetServer ({targetserver})'
                 )
             self._progress_callback(desc='TargetServers')
     return self.snapshot_data.targetservers
예제 #23
0
 def download_keyvaluemaps(self):
     for environment in self.environments:
         for kvm in self.snapshot_data.keyvaluemaps[environment]:
             try:
                 write_file(
                     Keyvaluemaps(self.auth, self.org_name, kvm)
                     .get_keyvaluemap_in_an_environment(environment)
                     .text,
                     self._gen_download_path(
                         subpaths=['keyvaluemaps', environment, f'{kvm}.json']
                     ),
                     fs_write=self.fs_write,
                 )
             except HTTPError as e:
                 console.echo(
                     f'Ignoring {type(e).__name__} {e.response.status_code} error for KVM ({kvm})'
                 )
             self._progress_callback(desc='KeyValueMaps')
     return self.snapshot_data.keyvaluemaps
예제 #24
0
 def push_targetserver(self, environment, file):
     targetserver = read_file(file, type='json')
     self._targetserver_name = targetserver['name']
     try:
         self.get_targetserver(environment)
         console.echo(f'Updating {self._targetserver_name}')
         console.echo(self.update_a_targetserver(environment, body).text)
     except HTTPError as e:
         if e.response.status_code != 404:
             raise e
         console.echo(f'Creating {self._targetserver_name}')
         console.echo(self.create_a_targetserver(environment, body).text)
예제 #25
0
 def push_apiproducts(self, file):
     apiproduct = read_file(file, type='json')
     self._apiproduct_name = apiproduct['name']
     try:
         self.get_api_product()
         console.echo(f'Updating {self._apiproduct_name}')
         console.echo(self.update_api_product(body).text)
     except HTTPError as e:
         if e.response.status_code != 404:
             raise e
         console.echo(f'Creating {self._apiproduct_name}')
         console.echo(self.create_api_product(body).text)
예제 #26
0
 def _download_resource_permissions(self, role_name):
     try:
         write_file(
             json.dumps(
                 Userroles.sort_permissions(
                     Permissions(self.auth, self.org_name, role_name).get_permissions(
                         formatted=True, format='json'
                     )
                 ),
                 indent=2,
             ),
             self._gen_download_path(
                 subpaths=['userroles', role_name, 'resource_permissions.json']
             ),
             fs_write=self.fs_write,
         )
     except HTTPError as e:
         console.echo(
             f'Ignoring {type(e).__name__} {e.response.status_code} error for User Role ({role_name}) resource permissions'
         )
예제 #27
0
 def _download_users_for_a_role(self, role_name):
     try:
         data = {
             'snapshot': self._get_users_for_a_role(role_name),
             'target_path': self._gen_download_path(
                 subpaths=['userroles', role_name, 'users.json']
             ),
             'fs_write': self.fs_write,
             'indent': 2,
         }
         write_file(
             data['snapshot'],
             data['target_path'],
             fs_write=data['fs_write'],
             indent=data['indent'],
         )
     except HTTPError as e:
         console.echo(
             f'Ignoring {type(e).__name__} {e.response.status_code} error for User Role ({role_name}) users'
         )
예제 #28
0
 def deploy_a_shared_flow(
     self,
     environment,
     shared_flow_name,
     revision_number,
     override=False,
     delay=0,
     shared_flow_file=None,
 ):
     do_deployments_exist = False
     try:
         if self.get_shared_flow_revisions(shared_flow_name):
             do_deployments_exist = True
     except HTTPError as e:
         if e.response.status_code != 404:
             raise e
     if shared_flow_file:
         revision_number = int(
             self.import_a_shared_flow(shared_flow_file, shared_flow_name).json()['revision']
         )
     uri = DEPLOY_A_SHARED_FLOW_PATH.format(
         api_url=APIGEE_ADMIN_API_URL,
         org=self._org_name,
         environment=environment,
         shared_flow_name=shared_flow_name,
         revision_number=revision_number,
     )
     options_dict = {'override': 'true' if override else 'false', 'delay': f'{delay}'}
     params = add_to_dict_if_exists(options_dict)
     hdrs = auth.set_header(self._auth, {'Accept': 'application/json'})
     console.echo(f'Deploying revision {revision_number}... ', end='', flush=True)
     resp = requests.post(uri, headers=hdrs, params=params)
     resp.raise_for_status()
     console.echo('Done')
     if do_deployments_exist:
         # console.echo('Attempting undeployment... ')
         self.undeploy_shared_flow_revisions_in_environment(
             environment, shared_flow_name, except_revisions={revision_number}
         )
         # console.echo('Done.')
     return resp
예제 #29
0
    def delete_undeployed_revisions(self,
                                    api_name,
                                    save_last=0,
                                    dry_run=False):
        details = ApisSerializer().filter_deployment_details(
            Deployments(self._auth, self._org_name,
                        api_name).get_api_proxy_deployment_details().json())
        undeployed = ApisSerializer().filter_undeployed_revisions(
            self.list_api_proxy_revisions(api_name).json(),
            ApisSerializer().filter_deployed_revisions(details),
            save_last=save_last,
        )
        console.echo(f'Undeployed revisions to be deleted: {undeployed}')
        if dry_run:
            return undeployed

        def _func(revision):
            console.echo(f'Deleting revison {revision}')
            self.delete_api_proxy_revision(api_name, revision)

        return run_func_on_iterable(undeployed, _func)
예제 #30
0
 def push_cache(self, environment, file):
     cache = read_file(file, type='json')
     self._cache_name = cache['name']
     try:
         self.get_information_about_a_cache(environment)
         console.echo(f'Updating {self._cache_name}')
         console.echo(
             self.update_a_cache_in_an_environment(environment, body).text)
     except HTTPError as e:
         if e.response.status_code != 404:
             raise e
         console.echo(f'Creating {self._cache_name}')
         console.echo(
             self.create_a_cache_in_an_environment(environment, body).text)