11"""Use a network group and find its networks."""
22
3- from ast import Or
43import json
54import logging
65
76from .utility import (NETWORK_RESOURCES , RESOURCES , STATUS_CODES ,
87 find_generic_resources , get_generic_resource , http , is_uuidv4 ,
9- normalize_caseless )
8+ normalize_caseless , any_in )
109
1110
1211class NetworkGroup :
1312 """use a network group by name or ID.
14-
13+
1514 The default is to use the first network group available to the organization of the caller.
1615 """
1716
18- def __init__ (self , Organization : object , network_group_id : str = None , network_group_name : str = None , group : str = None ):
17+ def __init__ (self , Organization : object , network_group_id : str = None , network_group_name : str = None , group : str = None ):
1918 """Initialize the network group class with a group name or ID."""
2019 self .network_groups = Organization .get_network_groups_by_organization ()
2120 if (not network_group_id and not network_group_name ) and group :
@@ -25,13 +24,13 @@ def __init__(self, Organization: object, network_group_id: str=None, network_gro
2524 network_group_name = group
2625 if network_group_id :
2726 self .network_group_id = network_group_id
28- self .network_group_name = [ ng ['organizationShortName' ] for ng in self .network_groups if ng ['id' ] == network_group_id ][0 ]
27+ self .network_group_name = [ng ['organizationShortName' ] for ng in self .network_groups if ng ['id' ] == network_group_id ][0 ]
2928 # TODO: review the use of org short name ref https://mattermost.tools.netfoundry.io/netfoundry/pl/gegyzuybypb9jxnrw1g1imjywh
3029 elif network_group_name :
3130 self .network_group_name = network_group_name
32- network_group_matches = [ ng ['id' ] for ng in self .network_groups if ng ['organizationShortName' ] == network_group_name ]
31+ network_group_matches = [ng ['id' ] for ng in self .network_groups if ng ['organizationShortName' ] == network_group_name ]
3332 if len (network_group_matches ) == 1 :
34- self .network_group_id = [ ng ['id' ] for ng in self .network_groups if ng ['organizationShortName' ] == network_group_name ][0 ]
33+ self .network_group_id = [ng ['id' ] for ng in self .network_groups if ng ['organizationShortName' ] == network_group_name ][0 ]
3534 else :
3635 raise RuntimeError (f"there was not exactly one network group matching the name '{ network_group_name } '" )
3736 elif len (self .network_groups ) > 0 :
@@ -75,7 +74,7 @@ def nc_data_centers_by_location(self):
7574 # resolve network UUIDs by name
7675 def network_id_by_normal_name (self , name ):
7776 """Find network ID in group by case-insensitive (caseless, normalized) name.
78-
77+
7978 Case-insensitive uniqueness is enforced by the API for each type of entity.
8079 """
8180 caseless = normalize_caseless (name )
@@ -84,9 +83,9 @@ def network_id_by_normal_name(self, name):
8483 else :
8584 raise RuntimeError (f"no network named '{ name } ' in this network group" )
8685
87- def network_exists (self , name : str , deleted : bool = False ):
86+ def network_exists (self , name : str , deleted : bool = False ):
8887 """Check if a network exists in the current group.
89-
88+
9089 :param name: the case-insensitive string to search
9190 :param deleted: include deleted networks in results
9291 """
@@ -103,35 +102,35 @@ def nc_data_centers(self, **kwargs):
103102 params [param ] = kwargs [param ]
104103 params ["productVersion" ] = self .find_latest_product_version (is_active = True )
105104 params ["hostType" ] = "NC"
106- # params["provider"] = "AWS"
105+ params ["provider" ] = "AWS"
107106
108107 url = self .audience + 'core/v2/data-centers'
109- headers = { "authorization" : "Bearer " + self .token }
108+ headers = {"authorization" : "Bearer " + self .token }
110109 try :
111110 data_centers = list ()
112111 for i in find_generic_resources (url = url , headers = headers , embedded = NETWORK_RESOURCES ['data-centers' ]._embedded , proxies = self .proxies , verify = self .verify , ** params ):
113112 data_centers .extend (i )
114113 except Exception as e :
115- raise RuntimeError (f"failed to get data-centers from url: '{ url } '" )
114+ raise RuntimeError (f"failed to get data-centers from url: '{ url } ', caught { e } " )
116115 else :
117116 return (data_centers )
118117
119118 # provide a compatible alias
120- get_controller_data_centers = nc_data_centers
119+ get_controller_data_centers = nc_data_centers
121120
122- def get_product_metadata (self , is_active : bool = True ):
121+ def get_product_metadata (self , is_active : bool = True ):
123122 """
124123 Get product version metadata.
125-
124+
126125 :param is_active: filter for only active product versions
127126 :param product_version: semver string of a single version to get, default is all versions
128127 """
129128 url = self .audience + 'product-metadata/v2/download-urls.json'
130- headers = dict () # no auth
129+ headers = dict () # no auth
131130 try :
132131 all_product_metadata , status_symbol = get_generic_resource (url = url , headers = headers , proxies = self .proxies , verify = self .verify )
133132 except Exception as e :
134- raise RuntimeError (f"failed to get product-metadata from url: '{ url } '" )
133+ raise RuntimeError (f"failed to get product-metadata from url: '{ url } ', caught { e } " )
135134 else :
136135 if is_active :
137136 filtered_product_metadata = dict ()
@@ -142,7 +141,7 @@ def get_product_metadata(self, is_active: bool=True):
142141 else :
143142 return (all_product_metadata )
144143
145- def list_product_versions (self , product_metadata : dict = dict (), is_active : bool = True ):
144+ def list_product_versions (self , product_metadata : dict = dict (), is_active : bool = True ):
146145 """Find product versions in all products' metadata."""
147146 if product_metadata :
148147 product_versions = product_metadata .keys ()
@@ -152,15 +151,15 @@ def list_product_versions(self, product_metadata: dict=dict(), is_active: bool=T
152151
153152 return (product_versions )
154153
155- def find_latest_product_version (self , product_versions : list = list (), is_active : bool = True ):
154+ def find_latest_product_version (self , product_versions : list = list (), is_active : bool = True ):
156155 """Get the highest product version number (may be experimental, not stable)."""
157156 if not product_versions :
158157 product_versions = self .list_product_versions (is_active = is_active )
159158
160159 from distutils .version import LooseVersion
161160 return sorted (product_versions , key = LooseVersion )[- 1 ]
162161
163- def create_network (self , name : str , network_group_id : str = None , location : str = "us-east-1" , version : str = None , size : str = "small" , ** kwargs ):
162+ def create_network (self , name : str , network_group_id : str = None , location : str = "us-east-1" , version : str = None , size : str = "small" , ** kwargs ):
164163 """
165164 Create a network in this network group.
166165
@@ -175,7 +174,7 @@ def create_network(self, name: str, network_group_id: str=None, location: str="u
175174 raise RuntimeError (f"unexpected network location '{ location } '. Valid locations include: { ',' .join (my_nc_data_centers_by_location .keys ())} ." )
176175
177176 # map incongruent api keys from kwargs to function params ("name", "size" are congruent)
178- for param ,value in kwargs .items ():
177+ for param , value in kwargs .items ():
179178 if param == 'networkGroupId' :
180179 if network_group_id :
181180 logging .debug ("clobbering param 'network_group_id' with kwarg 'networkGroupId'" )
@@ -209,7 +208,7 @@ def create_network(self, name: str, network_group_id: str=None, location: str="u
209208 elif version in product_versions :
210209 request ['productVersion' ] = version
211210 elif version == "default" :
212- pass # do not specify a value for productVersion
211+ pass # do not specify a value for productVersion
213212 else :
214213 raise RuntimeError (f"invalid version '{ version } '. Expected one of { product_versions } " )
215214 headers = {
@@ -227,9 +226,8 @@ def create_network(self, name: str, network_group_id: str=None, location: str="u
227226 )
228227 response_code = response .status_code
229228 except Exception as e :
230- raise
229+ raise RuntimeError ( f"problem creating network, caught { e } " )
231230
232- any_in = lambda a , b : any (i in b for i in a )
233231 response_code_symbols = [s .upper () for s in STATUS_CODES ._codes [response_code ]]
234232 if any_in (response_code_symbols , RESOURCES ['networks' ].create_responses ):
235233 try :
@@ -258,10 +256,10 @@ def delete_network(self, network_id=None, network_name=None):
258256 elif network_name and self .network_ids_by_normal_name .get (normalize_caseless (network_name )):
259257 network_id = self .network_ids_by_normal_name [normalize_caseless (network_name )]
260258 except Exception as e :
261- raise RuntimeError (f"need one of network_id or network_name for a network in this network group: { self .name } , got { e } " )
259+ raise RuntimeError (f"need one of network_id or network_name for a network in this network group: { self .name } , caught { e } " )
262260
263261 try :
264- headers = { "authorization" : "Bearer " + self .token }
262+ headers = {"authorization" : "Bearer " + self .token }
265263 entity_url = self .audience + 'core/v2/networks/' + network_id
266264 response = http .delete (
267265 entity_url ,
@@ -272,10 +270,9 @@ def delete_network(self, network_id=None, network_name=None):
272270 response_code = response .status_code
273271 network = response .json ()
274272 except Exception as e :
275- raise RuntimeError (f"failed deleting network { entity_url } or loading JSON from response, got { e } " )
273+ raise RuntimeError (f"failed deleting network { entity_url } or loading JSON from response, caught { e } " )
276274
277275 if not response_code == STATUS_CODES .codes .ACCEPTED :
278276 raise RuntimeError (f"got unexpected HTTP code { STATUS_CODES ._codes [response_code ][0 ].upper ()} ({ response_code } ) and response { response .text } " )
279277
280278 return (network )
281-
0 commit comments