3 # Copyright 2022, Mischa Peters <mischa AT alkira DOT net>, Alkira.
5 # Version 0.1 - 20220617 - initial release
6 # Version 0.2 - 20220621 - simplified structure, prepare for -i remove for single ID
8 # Permission to use, copy, modify, and distribute this software for any
9 # purpose with or without fee is hereby granted, provided that the above
10 # copyright notice and this permission notice appear in all copies.
12 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31 parser = argparse.ArgumentParser(description="Clean Alkira tenant config with AlkiraAPI")
32 parser.add_argument("-t", "--tenant", type=str, default='alkira.cnf', help="location of alikira.cnf (default: alkira.cnf)")
33 #parser.add_argument("-i", "--id", type=str, help="remove specific id")
34 parser.add_argument("-v", "--verbose", type=int, default=0, help="Verbose level 0 or 1 (default: 0)")
35 parser.add_argument("-p", "--pretty", help="make the JSON pretty!", action="store_true")
38 args = parser.parse_args()
39 ALKIRA_CONFIG = args.tenant
40 except argparse.ArgumentError as e:
50 loglevel = logging.INFO
52 ###############################################
54 # Set logging.INFO to logging.DEBUG for debug information
55 logging.basicConfig(level=loglevel)
56 logging = logging.getLogger('AlkiraAPI')
59 if not os.path.isfile(ALKIRA_CONFIG):
60 logging.error(f"The config file {ALKIRA_CONFIG} doesn't exist")
62 alkira = configparser.RawConfigParser()
63 alkira.read(ALKIRA_CONFIG)
65 ALKIRA_TENANT = alkira.get('alkira', 'ALKIRA_TENANT')
66 ALKIRA_USERNAME = alkira.get('alkira', 'ALKIRA_USERNAME')
67 ALKIRA_PASSWORD = alkira.get('alkira', 'ALKIRA_PASSWORD')
68 ALKIRA_BASE_URI = f'https://{ALKIRA_TENANT}/api'
70 ###############################################
73 headers = {'Content-Type': "application/json"}
86 body = {'userName': ALKIRA_USERNAME,
87 'password': ALKIRA_PASSWORD}
88 session = requests.session()
89 response = alkira_post(session, '/login', body)
92 def alkira_post(session, uri, body):
93 url = f'{ALKIRA_BASE_URI}{uri}'
95 response = session.post(url, data=json.dumps(body), headers=headers)
96 response.raise_for_status()
97 except Exception as e:
98 logging.error(f'Error: {str(e)}')
102 def alkira_get(session, uri):
103 url = f'{ALKIRA_BASE_URI}{uri}'
105 response = session.get(url, headers=headers)
106 response.raise_for_status()
107 except Exception as e:
108 logging.error(f'Error: {str(e)}')
112 def alkira_delete(session, uri):
113 url = f'{ALKIRA_BASE_URI}{uri}'
115 response = session.delete(url, headers=headers)
116 response.raise_for_status()
117 except Exception as e:
118 logging.error(f'Error: {str(e)}')
123 logging.info('=== Authenticating')
128 logging.info('=== Fetching Tenant Info')
129 r = alkira_get(s, '/tenantnetworks')
131 tenantNetworkId = data[0]['id']
132 tenantName = data[0]['name']
133 logging.info(f'Tenant Name: {tenantName}')
134 logging.info(f'Tenant ID: {tenantNetworkId}')
140 'alkira-remote-access-connector-templates'
144 logging.info(f'=== Collecting {i}')
145 r = alkira_get(s, f'/tenantnetworks/{tenantNetworkId}/{i}')
148 logging.debug(json.dumps(data, indent=4))
150 logging.debug(json.dumps(data))
153 name = item.get('name')
156 type = item.get('type').lower().replace('_', '')
159 if type in url_exceptions.keys():
160 type = url_exceptions[type]
162 logging.debug(f'/tenantnetworks/{tenantNetworkId}/{type}{i}/{id}')
163 logging.info(f'=== Removing {name[:30]} ({type})')
164 r = alkira_delete(s, f'/tenantnetworks/{tenantNetworkId}/{type}{i}/{id}')
165 logging.info(r.status_code)