def get_install_from_destination(self): install_from = self.read_value("install_from") dest = install_from if install_from: if self.read_value(f"resources.{install_from}.public_ip", False): dest = azutil.get_fqdn(self.read_value("resource_group"), f"{install_from}_pip") elif self.read_value( f"vnet.gateway.name", False) or not self.read_value( f"resources.{install_from}.public_ip", False): dest = azutil.get_vm_private_ip( self.read_value("resource_group"), install_from) log.debug(f"install_from destination : {dest}") return dest
def _add_netapp(self, cfg, name): account = cfg["storage"][name] loc = cfg["location"] vnet = cfg["vnet"]["name"] subnet = account["subnet"] nicdeps = [] rg = cfg["resource_group"] vnetrg = cfg["vnet"].get("resource_group", rg) if rg == vnetrg: log.debug("adding delegation to subnet") rvnet = next((x for x in self.resources if x["name"] == vnet), []) rsubnet = next((x for x in rvnet["properties"]["subnets"] if x["name"] == subnet), None) if not rsubnet: log.error("subnet ({}) for netapp storage ({}) does not exist". format(subnet, name)) sys.exit(1) if "delegations" not in rsubnet["properties"]: rsubnet["properties"]["delegations"] = [] rsubnet["properties"]["delegations"].append({ "properties": { "serviceName": "Microsoft.Netapp/volumes" }, "name": "netappdelegation" }) nicdeps.append("Microsoft.Network/virtualNetworks/" + vnet) subnetid = "[resourceId('Microsoft.Network/virtualNetworks/subnets', '{}', '{}')]".format( vnet, subnet) else: subnetid = "[resourceId('{}', 'Microsoft.Network/virtualNetworks/subnets', '{}', '{}')]".format( vnetrg, vnet, subnet) addomain = account.get("joindomain", None) props = {} if addomain: adip = azutil.get_vm_private_ip(rg, account["ad_server"]) adpassword = account["ad_password"] adusername = account["ad_username"] # TODO: previously we used ip address for the dns here props["activeDirectories"] = [{ "username": adusername, "password": adpassword, "domain": addomain, "dns": adip, "smbServerName": "anf" }] self.resources.append({ "name": name, "type": "Microsoft.NetApp/netAppAccounts", "apiVersion": "2019-07-01", "location": loc, "tags": {}, "properties": props, "dependsOn": nicdeps }) for poolname in account.get("pools", {}).keys(): pool = account["pools"][poolname] poolsize = pool["size"] servicelevel = pool["service_level"] self.resources.append({ "name": name + "/" + poolname, "type": "Microsoft.NetApp/netAppAccounts/capacityPools", "apiVersion": "2019-07-01", "location": loc, "tags": {}, "properties": { "size": poolsize * 2**40, "serviceLevel": servicelevel }, "dependsOn": [ "[resourceId('Microsoft.NetApp/netAppAccounts', '{}')]". format(name) ], }) for volname in pool.get("volumes", {}).keys(): vol = pool["volumes"][volname] volsize = vol["size"] voltype = vol.get("type", "nfs") volmount = vol["mount"] netapp_volume = { "name": name + "/" + poolname + "/" + volname, "type": "Microsoft.NetApp/netAppAccounts/capacityPools/volumes", "apiVersion": "2019-07-01", "location": loc, "tags": {}, "properties": { "creationToken": volname, "serviceLevel": servicelevel, "usageThreshold": volsize * 2**40, "subnetId": subnetid }, "dependsOn": [ "[resourceId('Microsoft.NetApp/netAppAccounts/capacityPools', '{}', '{}')]" .format(name, poolname) ] } if voltype == "cifs": netapp_volume["properties"]["protocolTypes"] = ["CIFS"] self.resources.append(netapp_volume)
def process_value(self, v, extended=True): log.debug(f"process_value (enter): {v} [extended={extended}]") def repl(match): return str(self.process_value(match.group()[2:-2], extended)) v = self.regex.sub( lambda m: str(self.process_value(m.group()[2:-2], extended)), v) parts = v.split('.') prefix = parts[0] if len(parts) == 1: prefix = "" if prefix == "variables": res = self.read_value(v) elif prefix == "secret": res = azutil.get_keyvault_secret(parts[1], parts[2]) elif prefix == "image": res = azutil.get_image_id(parts[1], parts[2]) elif extended and prefix == "sasurl": log.debug(parts) url = azutil.get_storage_url(parts[1]) x = parts[-1].split(",") if len(x) == 1: perm = "r" dur = "2h" elif len(x) == 2: perm = x[1] dur = "2h" parts[-1] = x[0] else: perm = x[1] dur = x[2] parts[-1] = x[0] container = x[0].split('/')[0] saskey = azutil.get_storage_saskey(parts[1], container, perm, dur) log.debug(parts) path = ".".join(parts[2:]) res = f"{url}{path}?{saskey}" elif extended and prefix == "fqdn": res = azutil.get_fqdn(self.read_value("resource_group"), parts[1] + "_pip") elif extended and prefix == "ip": res = azutil.get_vm_private_ip(self.read_value("resource_group"), parts[1]) elif extended and prefix == "sakey": res = azutil.get_storage_key(parts[1]) elif extended and prefix == "saskey": x = parts[-1].split(",") if len(x) == 1: perm = "r" dur = "2h" elif len(x) == 2: perm = x[1] dur = "2h" else: perm = x[1] dur = x[2] container = x[0].split('/')[0] res = azutil.get_storage_saskey(parts[1], container, perm, dur) elif extended and prefix == "laworkspace": res = azutil.get_log_analytics_workspace(parts[1], parts[2]) elif extended and prefix == "lakey": res = azutil.get_log_analytics_key(parts[1], parts[2]) elif extended and prefix == "acrkey": res = azutil.get_acr_key(parts[1]) else: # test to see if we are including a files contents (e.g. for customData) fname = self.file_location + "/" + v[1:] if v.startswith("@") and os.path.isfile(fname): log.debug(f"loading text include {fname}") with open(fname) as f: res = f.read() else: res = v log.debug("process_value (exit): " + str(v) + "=" + str(res)) return res