Beispiel #1
0
    async def _parse_instance(self, raw_instance):
        instance_dict = {}
        instance_dict['id'] = get_non_provider_id(raw_instance.id.lower())
        instance_dict['name'] = raw_instance.name
        instance_dict['vm_id'] = raw_instance.vm_id
        instance_dict['zones'] = raw_instance.zones
        instance_dict['instance_view'] = raw_instance.instance_view
        instance_dict['availability_set'] = raw_instance.availability_set
        instance_dict[
            'proximity_placement_group'] = raw_instance.proximity_placement_group
        instance_dict['additional_properties'] = list(
            raw_instance.additional_properties)
        instance_dict['location'] = raw_instance.location
        instance_dict['type'] = raw_instance.type
        instance_dict['resources'] = raw_instance.resources
        if raw_instance.tags is not None:
            instance_dict['tags'] = [
                "{}:{}".format(key, value)
                for key, value in raw_instance.tags.items()
            ]
        else:
            instance_dict['tags'] = []
        instance_dict['resource_group_name'] = get_resource_group_name(
            raw_instance.id)
        instance_dict['provisioning_state'] = raw_instance.provisioning_state
        instance_dict['plan'] = raw_instance.plan
        instance_dict['identity'] = raw_instance.identity
        instance_dict[
            'additional_capabilities'] = raw_instance.additional_capabilities
        instance_dict['license_type'] = raw_instance.license_type

        # TODO process and display the below
        instance_dict['hardware_profile'] = raw_instance.hardware_profile
        instance_dict['diagnostics_profile'] = raw_instance.diagnostics_profile
        instance_dict['os_profile'] = raw_instance.os_profile
        instance_dict['storage_profile'] = raw_instance.storage_profile
        instance_dict['network_profile'] = raw_instance.network_profile

        # instance_dict['network_profile'] = raw_instance.network_profile
        instance_dict['network_interfaces'] = []
        for interface in raw_instance.network_profile.network_interfaces:
            instance_dict['network_interfaces'].append(
                get_non_provider_id(interface.id))

        instance_dict[
            'extensions'] = await self.facade.virtualmachines.get_instance_extensions(
                subscription_id=self.subscription_id,
                instance_name=instance_dict['name'],
                resource_group=get_resource_group_name(raw_instance.id))

        return instance_dict['id'], instance_dict
Beispiel #2
0
 def _parse_application_security_group(self,
                                       raw_application_security_group):
     application_security_group_dict = {}
     application_security_group_dict['id'] = get_non_provider_id(
         raw_application_security_group.id)
     application_security_group_dict[
         'name'] = raw_application_security_group.name
     application_security_group_dict[
         'type'] = raw_application_security_group.type
     application_security_group_dict[
         'location'] = raw_application_security_group.location
     if raw_application_security_group.tags is not None:
         application_security_group_dict['tags'] = [
             "{}:{}".format(key, value)
             for key, value in raw_application_security_group.tags.items()
         ]
     else:
         application_security_group_dict['tags'] = []
     application_security_group_dict[
         'resource_group_name'] = get_resource_group_name(
             raw_application_security_group.id)
     application_security_group_dict[
         'resource_guid'] = raw_application_security_group.resource_guid
     application_security_group_dict[
         'provisioning_state'] = raw_application_security_group.provisioning_state
     application_security_group_dict[
         'etag'] = raw_application_security_group.etag
     application_security_group_dict['network_interfaces'] = [
     ]  # this is filled in the base class
     return application_security_group_dict[
         'id'], application_security_group_dict
Beispiel #3
0
    async def fetch_all(self):
        for db in await self.facade.sqldatabase.get_databases(
                self.resource_group_name, self.server_name,
                self.subscription_id):
            # We do not want to scan 'master' database which is auto-generated by Azure and read-only:
            if db.name == 'master':
                continue

            self[db.name] = {
                'id':
                db.name,
                'name':
                db.name,
                'tags':
                ["{}:{}".format(key, value) for key, value in db.tags.items()]
                if db.tags is not None else [],
                'resource_group_name':
                get_resource_group_name(db.id)
            }

        await self._fetch_children_of_all_resources(
            resources=self,
            scopes={
                db_id: {
                    'resource_group_name': self.resource_group_name,
                    'server_name': self.server_name,
                    'database_name': db['name'],
                    'subscription_id': self.subscription_id
                }
                for (db_id, db) in self.items()
            })
Beispiel #4
0
 async def _get_and_set_web_app_configuration(self, web_app, api_client):
     resource_group_name = get_resource_group_name(web_app.id)
     try:
         web_app_config = await run_concurrently(
             lambda: api_client.web_apps.get_configuration(resource_group_name, web_app.name)
         )
     except Exception as e:
         print_exception(f'Failed to retrieve web app configuration: {e}')
         setattr(web_app, 'config', None)
     else:
         setattr(web_app, 'config', web_app_config)
Beispiel #5
0
 async def _get_and_set_web_app_auth_settings(self, web_app, api_client):
     resource_group_name = get_resource_group_name(web_app.id)
     try:
         web_app_auth_settings = await run_concurrently(
             lambda: api_client.web_apps.get_auth_settings(resource_group_name=resource_group_name,
                                                           name=web_app.name)
         )
     except Exception as e:
         print_exception(f'Failed to retrieve web app auth settings: {e}')
         setattr(web_app, 'auth_settings', None)
     else:
         setattr(web_app, 'auth_settings', web_app_auth_settings)
Beispiel #6
0
    def _get_servers(self, api_client, method, list_params):
        servers = []
        servers_raw = method(**list_params)
        for server in servers_raw:
            resource_group_name = get_resource_group_name(server.id)
            setattr(server, "azure_ad_admin_settings",
                    self._get_azure_ad_admin_settings(api_client, resource_group_name, server.name))
            setattr(server, "databases",
                    self._get_databases(api_client, resource_group_name, server.name))
            servers.append(server)

        return servers
Beispiel #7
0
    def _parse_virtual_network(self, raw_virtual_network):
        virtual_network_dict = {}
        virtual_network_dict['id'] = get_non_provider_id(raw_virtual_network.id)
        virtual_network_dict['name'] = raw_virtual_network.name

        virtual_network_dict['enable_vm_protection'] = raw_virtual_network.enable_vm_protection
        virtual_network_dict['etag'] = str(raw_virtual_network.etag)
        if raw_virtual_network.tags is not None:
            virtual_network_dict['tags'] = ["{}:{}".format(key, value) for key, value in  raw_virtual_network.tags.items()]
        else:
            virtual_network_dict['tags'] = []
        virtual_network_dict['resource_group_name'] = get_resource_group_name(raw_virtual_network.id)
        virtual_network_dict['virtual_network_peerings'] = raw_virtual_network.virtual_network_peerings
        virtual_network_dict['enable_ddos_protection'] = raw_virtual_network.enable_ddos_protection
        virtual_network_dict['resource_guid'] = raw_virtual_network.resource_guid
        virtual_network_dict['provisioning_state'] = raw_virtual_network.provisioning_state
        virtual_network_dict['address_space'] = raw_virtual_network.address_space
        virtual_network_dict['ddos_protection_plan'] = raw_virtual_network.ddos_protection_plan
        virtual_network_dict['additional_properties'] = list(raw_virtual_network.additional_properties)
        virtual_network_dict['location'] = raw_virtual_network.location
        virtual_network_dict['type'] = raw_virtual_network.type
        virtual_network_dict['dhcp_options'] = raw_virtual_network.dhcp_options

        virtual_network_dict['subnets'] = {}
        virtual_network_dict['subnets_count'] = 0
        for raw_subnet in raw_virtual_network.subnets:
            subnet_dict = {}
            subnet_dict['id'] = get_non_provider_id(raw_subnet.id)
            subnet_dict['name'] = raw_subnet.name
            subnet_dict['service_association_links'] = raw_subnet.service_association_links
            subnet_dict['resource_navigation_links'] = raw_subnet.resource_navigation_links
            subnet_dict['service_endpoint_policies'] = raw_subnet.service_endpoint_policies
            subnet_dict['interface_endpoints'] = raw_subnet.interface_endpoints if \
                hasattr(raw_subnet, 'interface_endpoints') else None
            subnet_dict['purpose'] = raw_subnet.purpose
            subnet_dict['address_prefix'] = raw_subnet.address_prefix
            subnet_dict['provisioning_state'] = raw_subnet.provisioning_state
            subnet_dict['etag'] = str(raw_subnet.etag)
            subnet_dict['additional_properties'] = raw_subnet.additional_properties
            subnet_dict['route_table'] = raw_subnet.route_table
            subnet_dict['delegations'] = raw_subnet.delegations
            subnet_dict['service_endpoints'] = raw_subnet.service_endpoints
            subnet_dict['ip_configuration_profiles'] = raw_subnet.ip_configuration_profiles
            subnet_dict['ip_configurations'] = raw_subnet.ip_configurations
            subnet_dict['address_prefixes'] = raw_subnet.address_prefixes
            if raw_subnet.network_security_group:
                subnet_dict['network_security_group'] = get_non_provider_id(raw_subnet.network_security_group.id)
            else:
                subnet_dict['network_security_group'] = None
            virtual_network_dict['subnets_count'] += 1
            virtual_network_dict['subnets'][subnet_dict['id']] = subnet_dict

        return virtual_network_dict['id'], virtual_network_dict
Beispiel #8
0
 def _parse_server(self, raw_server):
     server = {}
     server['id'] = get_non_provider_id(raw_server.id)
     server['name'] = raw_server.name
     server['resource_group_name'] = get_resource_group_name(raw_server.id)
     if raw_server.tags is not None:
         server['tags'] = [
             "{}:{}".format(key, value)
             for key, value in raw_server.tags.items()
         ]
     else:
         server['tags'] = []
     return server['id'], server
Beispiel #9
0
    def _parse_storage_account(self, raw_storage_account):
        storage_account = {}
        raw_id = raw_storage_account.id
        storage_account['id'] = get_non_provider_id(raw_id.lower())
        storage_account['resource_group_name'] = get_resource_group_name(raw_id)
        storage_account['name'] = raw_storage_account.name
        storage_account['https_traffic_enabled'] = raw_storage_account.enable_https_traffic_only
        storage_account['public_traffic_allowed'] = self._is_public_traffic_allowed(raw_storage_account)
        storage_account['trusted_microsoft_services_enabled'] = \
            self._is_trusted_microsoft_services_enabled(raw_storage_account)
        storage_account['bypass'] = raw_storage_account.network_rule_set.bypass
        storage_account['access_keys_last_rotation_date'] = \
            self._parse_access_keys_last_rotation_date(raw_storage_account.activity_logs)

        return storage_account['id'], storage_account
Beispiel #10
0
 def _parse_network_watcher(self, raw_watcher):
     watcher_dict = {}
     watcher_dict['id'] = get_non_provider_id(raw_watcher.id)
     watcher_dict['name'] = raw_watcher.name
     watcher_dict['type'] = raw_watcher.type
     watcher_dict['location'] = raw_watcher.location
     if raw_watcher.tags is not None:
         watcher_dict['tags'] = ["{}:{}".format(key, value) for key, value in raw_watcher.tags.items()]
     else:
         watcher_dict['tags'] = []
     watcher_dict['resource_group_name'] = get_resource_group_name(raw_watcher.id)
     watcher_dict['etag'] = raw_watcher.etag
     watcher_dict['additional_properties'] = raw_watcher.additional_properties
     watcher_dict['provisioning_state'] = raw_watcher.provisioning_state
     return watcher_dict['id'], watcher_dict
Beispiel #11
0
    async def fetch_all(self):
        for server in await self.facade.sqldatabase.get_servers(self.subscription_id):
            id = get_non_provider_id(server.id)
            resource_group_name = get_resource_group_name(server.id)
            self[id] = {
                'id': id,
                'name': server.name,
                'resource_group_name': resource_group_name
            }

        await self._fetch_children_of_all_resources(
            resources=self,
            scopes={server_id: {'resource_group_name': server['resource_group_name'],
                                'server_name': server['name'],
                                'subscription_id': self.subscription_id}
                    for (server_id, server) in self.items()}
        )
Beispiel #12
0
 def _parse_key_vault(self, raw_vault):
     vault = {}
     vault['id'] = get_non_provider_id(raw_vault.id)
     vault['name'] = raw_vault.name
     vault['type'] = raw_vault.type
     vault['location'] = raw_vault.location
     vault['additional_properties'] = raw_vault.additional_properties
     if raw_vault.tags is not None:
         vault['tags'] = [
             "{}:{}".format(key, value)
             for key, value in raw_vault.tags.items()
         ]
     else:
         vault['tags'] = []
     vault['resource_group_name'] = get_resource_group_name(raw_vault.id)
     vault['properties'] = raw_vault.properties
     vault['public_access_allowed'] = self._is_public_access_allowed(
         raw_vault)
     return vault['id'], vault
Beispiel #13
0
    async def fetch_all(self):
        self['servers'] = {}
        for server in await self.facade.sqldatabase.get_servers():
            id = get_non_provider_id(server.id)
            resource_group_name = get_resource_group_name(server.id)

            self['servers'][id] = {
                'id': id,
                'name': server.name,
                'resource_group_name': resource_group_name
            }
        self['servers_count'] = len(self['servers'])

        await self._fetch_children_of_all_resources(
            resources=self['servers'],
            scopes={
                server_id: {
                    'resource_group_name': server['resource_group_name'],
                    'server_name': server['name']
                }
                for (server_id, server) in self['servers'].items()
            })
Beispiel #14
0
 def _parse_server(self, raw_server):
     server = {}
     server['id'] = get_non_provider_id(raw_server.id)
     server['name'] = raw_server.name
     server['resource_group_name'] = get_resource_group_name(raw_server.id)
     return server['id'], server
    def _parse_network_interface(self, raw_network_interface):
        network_interface_dict = {}
        network_interface_dict['id'] = get_non_provider_id(
            raw_network_interface.id)
        network_interface_dict[
            'enable_accelerated_networking'] = raw_network_interface.enable_accelerated_networking
        network_interface_dict['virtual_machine'] = \
            get_non_provider_id(raw_network_interface.virtual_machine.id.lower()) if \
                raw_network_interface.virtual_machine else None
        network_interface_dict['name'] = raw_network_interface.name
        if raw_network_interface.tags is not None:
            network_interface_dict['tags'] = [
                "{}:{}".format(key, value)
                for key, value in raw_network_interface.tags.items()
            ]
        else:
            network_interface_dict['tags'] = []
        network_interface_dict[
            'resource_group_name'] = get_resource_group_name(
                raw_network_interface.id)
        network_interface_dict['interface_endpoint'] = raw_network_interface.interface_endpoint if \
            hasattr(raw_network_interface, 'interface_endpoint') else None
        network_interface_dict['primary'] = raw_network_interface.primary
        network_interface_dict['etag'] = raw_network_interface.etag
        network_interface_dict[
            'additional_properties'] = raw_network_interface.additional_properties
        network_interface_dict['location'] = raw_network_interface.location
        network_interface_dict[
            'mac_address'] = raw_network_interface.mac_address
        network_interface_dict[
            'provisioning_state'] = raw_network_interface.provisioning_state
        network_interface_dict[
            'resource_guid'] = raw_network_interface.resource_guid
        network_interface_dict[
            'enable_ip_forwarding'] = raw_network_interface.enable_ip_forwarding
        network_interface_dict['type'] = raw_network_interface.type
        network_interface_dict['network_security_group'] = \
            get_non_provider_id(raw_network_interface.network_security_group.id) if \
                raw_network_interface.network_security_group else None

        # TODO process and display the below
        network_interface_dict[
            'hosted_workloads'] = raw_network_interface.hosted_workloads
        network_interface_dict[
            'tap_configurations'] = raw_network_interface.tap_configurations
        network_interface_dict[
            'dns_settings'] = raw_network_interface.dns_settings

        ip_configuration = raw_network_interface.ip_configurations[
            0]  # TODO is this always an array of 1?
        network_interface_dict['ip_configuration'] = {}
        network_interface_dict['ip_configuration']['id'] = ip_configuration.id
        network_interface_dict['ip_configuration'][
            'additional_properties'] = ip_configuration.additional_properties
        network_interface_dict['ip_configuration'][
            'virtual_network_taps'] = ip_configuration.virtual_network_taps
        network_interface_dict['ip_configuration'][
            'application_gateway_backend_address_pools'] = ip_configuration.application_gateway_backend_address_pools
        network_interface_dict['ip_configuration'][
            'load_balancer_backend_address_pools'] = ip_configuration.load_balancer_backend_address_pools
        network_interface_dict['ip_configuration'][
            'load_balancer_inbound_nat_rules'] = ip_configuration.load_balancer_inbound_nat_rules
        network_interface_dict['ip_configuration'][
            'private_ip_address'] = ip_configuration.private_ip_address
        network_interface_dict['ip_configuration'][
            'private_ip_allocation_method'] = ip_configuration.private_ip_allocation_method
        network_interface_dict['ip_configuration'][
            'private_ip_address_version'] = ip_configuration.private_ip_address_version
        network_interface_dict['ip_configuration']['subnet'] = {
            'id': get_non_provider_id(ip_configuration.subnet.id)
        }
        network_interface_dict['ip_configuration'][
            'primary'] = ip_configuration.primary
        network_interface_dict['ip_configuration'][
            'public_ip_address'] = ip_configuration.public_ip_address
        network_interface_dict['ip_configuration'][
            'provisioning_state'] = ip_configuration.provisioning_state
        network_interface_dict['ip_configuration'][
            'name'] = ip_configuration.name
        network_interface_dict['ip_configuration'][
            'etag'] = ip_configuration.etag

        network_interface_dict['ip_configuration'][
            'application_security_groups'] = []
        if ip_configuration.application_security_groups:
            for asg in ip_configuration.application_security_groups:
                network_interface_dict['ip_configuration'][
                    'application_security_groups'].append(
                        get_non_provider_id(asg.id))

        # FIXME this is currently always None, might change in the future?
        # network_interface_dict['ip_configuration']['subnet_security_group'] = ip_configuration.subnet.network_security_group

        return network_interface_dict['id'], network_interface_dict
Beispiel #16
0
    async def _parse_instance(self, raw_instance):
        instance_dict = {}

        instance_dict['id'] = get_non_provider_id(raw_instance.id.lower())
        instance_dict['name'] = raw_instance.name
        instance_dict['vm_id'] = raw_instance.vm_id
        instance_dict['zones'] = raw_instance.zones
        if raw_instance.availability_set is not None:
            #Get the resource group and availability set if set
            try:
                instance_dict[
                    'availability_set'] = raw_instance.availability_set.id.split(
                        '/')[4] + ':' + raw_instance.availability_set.id.split(
                            '/')[8]
            except Exception as e:
                instance_dict[
                    'availability_set'] = raw_instance.availability_set.id
        else:
            instance_dict['availability_set'] = None
        if raw_instance.proximity_placement_group is not None:
            #Get the resource group and proximity placement group if set
            try:
                instance_dict[
                    'proximity_placement_group'] = raw_instance.proximity_placement_group.id.split(
                        '/'
                    )[4] + ':' + raw_instance.proximity_placement_group.id.split(
                        '/')[8]
            except Exception as e:
                instance_dict[
                    'proximity_placement_group'] = raw_instance.proximity_placement_group.id
        else:
            instance_dict['proximity_placement_group'] = None
        instance_dict['additional_properties'] = list(
            raw_instance.additional_properties)
        instance_dict['location'] = raw_instance.location
        instance_dict['type'] = raw_instance.type
        instance_dict['resources'] = raw_instance.resources
        if raw_instance.tags is not None:
            instance_dict['tags'] = [
                "{}:{}".format(key, value)
                for key, value in raw_instance.tags.items()
            ]
        else:
            instance_dict['tags'] = []
        instance_dict['resource_group_name'] = get_resource_group_name(
            raw_instance.id)
        instance_dict['provisioning_state'] = raw_instance.provisioning_state
        if raw_instance.plan is not None:
            instance_dict['plan'] = raw_instance.plan.name
        else:
            instance_dict['plan'] = None
        instance_dict['identity'] = raw_instance.identity

        if raw_instance.additional_capabilities is not None:
            #Get all the enabled additional capabilities ignoring not set or empty values
            instance_dict['additional_capabilities'] = [
                additional_capability for additional_capability, value in
                raw_instance.additional_capabilities.__dict__.items()
                if (value and value is not None)
            ]
        else:
            instance_dict['additional_capabilities'] = None
        instance_dict['license_type'] = raw_instance.license_type

        # TODO process and display the below
        instance_dict[
            'hardware_profile'] = raw_instance.hardware_profile.vm_size
        instance_dict['diagnostics_profile'] = {
            'Boot Diagnostics':
            True if raw_instance.diagnostics_profile.boot_diagnostics.enabled
            else None
        }

        instance_dict['os_profile'] = {}
        if raw_instance.os_profile is not None:
            instance_dict['os_profile'][
                'Administrator Username'] = raw_instance.os_profile.admin_username
            instance_dict['os_profile'][
                'Allow Extension Operations'] = raw_instance.os_profile.allow_extension_operations
            instance_dict['os_profile'][
                'Computer Name'] = raw_instance.os_profile.computer_name
            instance_dict['os_profile'][
                'Custom Data'] = raw_instance.os_profile.custom_data
            instance_dict['os_profile']['Secrets'] = ''.join(
                raw_instance.os_profile.secrets)
            if raw_instance.os_profile.windows_configuration:
                instance_dict['os_profile'][
                    'Unnatended Content'] = raw_instance.os_profile.windows_configuration.additional_unattend_content
                instance_dict['os_profile'][
                    'Automatic Updates'] = raw_instance.os_profile.windows_configuration.enable_automatic_updates
                instance_dict['os_profile'][
                    'VM Agent Provision'] = raw_instance.os_profile.windows_configuration.provision_vm_agent
                instance_dict['os_profile'][
                    'Windows Remote Management'] = raw_instance.os_profile.windows_configuration.win_rm
            elif raw_instance.os_profile.linux_configuration:
                instance_dict['os_profile'][
                    'Disable Password Authentication'] = raw_instance.os_profile.linux_configuration.disable_password_authentication
                instance_dict['os_profile'][
                    'VM Agent Provision'] = raw_instance.os_profile.linux_configuration.provision_vm_agent

        if raw_instance.storage_profile is not None:
            instance_dict['storage_profile'] = {}
            instance_dict['storage_profile'][
                'Publisher'] = raw_instance.storage_profile.image_reference.publisher
            instance_dict['storage_profile'][
                'Release'] = raw_instance.storage_profile.image_reference.version
            instance_dict['storage_profile'][
                'SKU'] = raw_instance.storage_profile.image_reference.sku
            instance_dict['storage_profile'][
                'Offer'] = raw_instance.storage_profile.image_reference.offer
            instance_dict['storage_profile'][
                'Exact Version'] = raw_instance.storage_profile.image_reference.exact_version
            instance_dict['storage_profile'][
                'OS Disk Size (GB)'] = raw_instance.storage_profile.os_disk.disk_size_gb
            instance_dict['storage_profile'][
                'OS Disk Name'] = raw_instance.storage_profile.os_disk.name
            instance_dict['storage_profile'][
                'OS Disk VHD'] = raw_instance.storage_profile.os_disk.vhd
            instance_dict['storage_profile'][
                'OS Managed Disk ID'] = raw_instance.storage_profile.os_disk.managed_disk.id.split(
                    '/')[-1]
            instance_dict['storage_profile'][
                'OS Managed Disk Storage Account Type'] = raw_instance.storage_profile.os_disk.managed_disk.storage_account_type
            if raw_instance.storage_profile.data_disks is not None and raw_instance.storage_profile.data_disks:
                instance_dict['storage_profile']['Data Disks'] = [
                    "{} ({}GB)".format(disk.name, disk.disk_size_gb)
                    for disk in raw_instance.storage_profile.data_disks
                ]
        else:
            instance_dict['storage_profile'] = None

        instance_dict['network_interfaces'] = []
        for interface in raw_instance.network_profile.network_interfaces:
            instance_dict['network_interfaces'].append(
                get_non_provider_id(interface.id))

        instance_dict[
            'extensions'] = await self.facade.virtualmachines.get_instance_extensions(
                subscription_id=self.subscription_id,
                instance_name=instance_dict['name'],
                resource_group=get_resource_group_name(raw_instance.id))

        return instance_dict['id'], instance_dict
Beispiel #17
0
    def _parse_web_app(self, raw_web_app):

        web_app_dict = {}
        web_app_dict['id'] = get_non_provider_id(raw_web_app.id)
        web_app_dict['name'] = raw_web_app.name
        web_app_dict['kind'] = raw_web_app.kind
        web_app_dict['location'] = raw_web_app.location
        web_app_dict['type'] = raw_web_app.type
        if raw_web_app.tags is not None:
            web_app_dict['tags'] = [
                "{}:{}".format(key, value)
                for key, value in raw_web_app.tags.items()
            ]
        else:
            web_app_dict['tags'] = []
        web_app_dict['resource_group_name'] = get_resource_group_name(
            raw_web_app.id)
        web_app_dict['state'] = raw_web_app.state
        web_app_dict['host_names'] = raw_web_app.host_names
        web_app_dict['repository_site_name'] = raw_web_app.repository_site_name
        web_app_dict['usage_state'] = raw_web_app.usage_state
        web_app_dict['enabled'] = raw_web_app.enabled
        web_app_dict['https_only'] = raw_web_app.https_only
        web_app_dict['enabled_host_names'] = raw_web_app.enabled_host_names
        web_app_dict['availability_state'] = raw_web_app.availability_state
        web_app_dict['host_name_ssl_states'] = raw_web_app.host_name_ssl_states
        web_app_dict['server_farm_id'] = raw_web_app.server_farm_id
        web_app_dict['reserved'] = raw_web_app.reserved
        web_app_dict['is_xenon'] = raw_web_app.is_xenon
        web_app_dict['hyper_v'] = raw_web_app.hyper_v
        web_app_dict[
            'last_modified_time_utc'] = raw_web_app.last_modified_time_utc
        web_app_dict['site_config'] = raw_web_app.site_config
        web_app_dict[
            'traffic_manager_host_names'] = raw_web_app.traffic_manager_host_names
        web_app_dict[
            'scm_site_also_stopped'] = raw_web_app.scm_site_also_stopped
        web_app_dict['target_swap_slot'] = raw_web_app.target_swap_slot
        web_app_dict[
            'hosting_environment_profile'] = raw_web_app.hosting_environment_profile
        web_app_dict[
            'client_affinity_enabled'] = raw_web_app.client_affinity_enabled
        web_app_dict['client_cert_enabled'] = raw_web_app.client_cert_enabled
        web_app_dict[
            'client_cert_exclusion_paths'] = raw_web_app.client_cert_exclusion_paths
        web_app_dict['host_names_disabled'] = raw_web_app.host_names_disabled
        web_app_dict['container_size'] = raw_web_app.container_size
        web_app_dict[
            'daily_memory_time_quota'] = raw_web_app.daily_memory_time_quota
        web_app_dict['suspended_till'] = raw_web_app.suspended_till
        web_app_dict[
            'max_number_of_workers'] = raw_web_app.max_number_of_workers
        web_app_dict['cloning_info'] = raw_web_app.cloning_info
        web_app_dict['resource_group'] = raw_web_app.resource_group
        web_app_dict['is_default_container'] = raw_web_app.is_default_container
        web_app_dict['default_host_name'] = raw_web_app.default_host_name
        web_app_dict['slot_swap_status'] = raw_web_app.slot_swap_status
        web_app_dict['redundancy_mode'] = raw_web_app.redundancy_mode
        web_app_dict[
            'in_progress_operation_id'] = raw_web_app.in_progress_operation_id
        web_app_dict['identity'] = raw_web_app.identity
        web_app_dict[
            'additional_properties'] = raw_web_app.additional_properties

        web_app_dict[
            'outbound_ip_addresses'] = raw_web_app.outbound_ip_addresses.split(
                ',')
        web_app_dict[
            'possible_outbound_ip_addresses'] = raw_web_app.possible_outbound_ip_addresses.split(
                ',')

        if raw_web_app.config is not None:
            web_app_dict[
                'minimum_tls_version_supported'] = raw_web_app.config.min_tls_version
            web_app_dict['http_2_enabled'] = raw_web_app.config.http20_enabled
            web_app_dict[
                'http_logging_enabled'] = raw_web_app.config.http_logging_enabled

            if raw_web_app.config.linux_fx_version:
                web_app_dict[
                    'programming_language'] = raw_web_app.config.linux_fx_version.split(
                        '|')[0].lower()
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.linux_fx_version.split(
                        '|')[1]
            elif raw_web_app.config.windows_fx_version:
                web_app_dict[
                    'programming_language'] = raw_web_app.config.windows_fx_version.split(
                        '|')[0].lower()
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.windows_fx_version.split(
                        '|')[1]
            elif raw_web_app.config.net_framework_version:
                web_app_dict['programming_language'] = 'dotnet'
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.net_framework_version
            elif raw_web_app.config.php_version:
                web_app_dict['programming_language'] = 'php'
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.php_version
            elif raw_web_app.config.python_version:
                web_app_dict['programming_language'] = 'python'
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.python_version
            elif raw_web_app.config.node_version:
                web_app_dict['programming_language'] = 'node'
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.node_version
            elif raw_web_app.config.java_version:
                web_app_dict['programming_language'] = 'java'
                web_app_dict[
                    'programming_language_version'] = raw_web_app.config.java_version
            else:
                web_app_dict['programming_language'] = None
                web_app_dict['programming_language_version'] = None

        else:
            web_app_dict['minimum_tls_version_supported'] = None
            web_app_dict['http_2_enabled'] = None
            web_app_dict['http_logging_enabled'] = False

            web_app_dict['programming_language'] = None
            web_app_dict['programming_language_version'] = None

        if raw_web_app.auth_settings is not None:
            web_app_dict[
                'authentication_enabled'] = raw_web_app.auth_settings.enabled
        else:
            web_app_dict['authentication_enabled'] = None

        return web_app_dict['id'], web_app_dict