Beispiel #1
0
 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
Beispiel #2
0
    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)
Beispiel #3
0
    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