Code Monkey home page Code Monkey logo

py-az2tf's Introduction

az2tf

October 2023: Project Archived

(Development switched to a sister project for AWS here: http://github.com/aws-samples/aws2tf)


This utility 'Azure to Terraform' (az2tf) reads an Azure Subscription and generates all the required terraform configuration files (.tf) from each of the composite Azure Resource Groups It also imports the terraform state using a

"terraform import ...." command

And finally runs a

"terraform plan ." command

There should hopefully be no subsequent additions or deletions reported by the terraform plan command as all the approriate terraform configuration files will have have automatically been created.

Requirements & Prerequisites

  • The tool is written for the bash shell script & Python2 and has been tested on macOS
  • Azure cli2 version 2.0.75 or higher needs to be installed and you need a login with at least "Read" priviledges
  • terraform version v0.12.16 or higher needs to be installed
  • Python version 3.6.1 or higher

May also be required

  • pip install requests
  • pip install adal

Quickstart guide to using the tool

Running the tool in your local shell (bash) required these steps:

  1. Unzip or clone this git repo into an empty directory
  2. login to the Azure cli2 (az login)
  3. run the tool

Usage Guide

The First Run

To generate the terraform files for a subscription and stop after a "terraform validate":

./az2tf.sh -s <Subscription ID> -v yes

The above will either show :

terraform validate
Success! The configuration is valid.

Or there may be some kind of python error. (as trying to test everyone's Azure combinations in advance isn't possible)

If you happen to find one of these errors please open an issue here and paste in the error and it will get fixed.

Once the validation is ok you can use the tool in anger to not only generate the terraform files (-v yes) but also import the resources and perform a terraform plan (see below)



To generate the terraform files for an entire Azure subscription, import the resourcs and perform a terraform plan:

./az2tf.sh -s <Subscription ID>

If your resources are in Azure US Government:

./az2tf.sh -c AzureUSGovernment -s <Subscription ID>

To include Azure Subscription Policies and RBAC controls and assignments:

./az2tf.sh [-c <Cloud Name>] -s <Subscription ID> -p yes

To generate the terraform files for a specific Resource Group in a subscription:

./az2tf.sh [-c <Cloud Name>] -s <Subscription ID> -g <Resource Group>

To include the secrets from a Key Vault in terraform files (secrets will be in plain text):

./az2tf.sh [-c <Cloud Name>] -s <Subscription ID> -g <Resource Group> -x yes

To filter the terraform resource type: (eg: just availability sets)

./az2tf.sh [-c <Cloud Name>] -s <Subscription ID> -g <Resource Group> -r azurerm_availability_set

To filter the terraform resource type: (eg: just availability sets) and fast forward - ie. build up resources one after another.:

./az2tf.sh -s <Subscription ID> -g <Resource Group> -r azurerm_rsource_group
./az2tf.sh -s <Subscription ID> -g <Resource Group> -r azurerm_availability_set -f yes
./az2tf.sh -s <Subscription ID> -g <Resource Group> -r azurerm_public_ip -f yes

To use the fast forward option correctly you'll need a good understanding of terraform resource dependancies to ensure you avoid any depenacy errors.


Be patient - lots of output is given as az2tf:

  • Loops for each provider through your resource groups &
  • Creates the requited *.tf configuration files in the "generated" directory
  • Performs the necessary 'terraform import' commands
  • And finally runs a 'terraform plan'

Supported Resource Types

The following terraform resource types are supported by this tool at this time:

Base Resources

  • azurerm_resource_group

Authorization Resources

  • azurerm_role_definition (subscription level)
  • azurerm_role_assignment (subscription level)
  • azurerm_user_assigned_identity

Active Directory Resources

App Service (Web Apps) Resources

  • azurerm_app_service
  • azurerm_app_service_plan
  • azurerm_app_service_slot
  • azurerm_function_app

Automation Resources

  • azurerm_automation_account

Compute Resources

  • azurerm_availability_set
  • azurerm_image
  • azurerm_managed_disk
  • azurerm_shared_image_gallery
  • azurerm_shared_image
  • azurerm_shared_image_version
  • azurerm_snapshot
  • azurerm_virtual_machine
  • azurerm_virtual_machine_extension
  • azurerm_virtual_machine_scale_set

Container Resources

  • azurerm_container_registry
  • azurerm_kubernetes_cluster

CosmosDB (DocumentDB) Resources

  • azurerm_cosmosdb_account

Database Resources

  • azurerm_sql_database
  • azurerm_sql_server

Databricks Resources

  • azurerm_databricks_resources (not available for China Azure today)

Key Vault Resources

  • azurerm_key_vault
  • azurerm_key_vault_secret

Load Balancer Resources

  • azurerm_lb
  • azurerm_lb_backend_address_pool
  • azurerm_lb_rule
  • azure_nat_rule
  • azurerm_lb_probe
  • azure_nat_pool

Logic App Resources

  • azurerm_logic_app_workflow

Management Resources

  • azurerm_management_lock

Messaging Resources

  • azurerm_eventhub

  • azurerm_eventhub_namespace

  • zurerm_eventhub_namespace_authorization_rule

  • azurerm_servicebus_namespace

  • azurerm_servicebus_queue

Monitoring Resources

  • azurerm_autoscale_setting (not available for China Azure today)

Network Resources

  • azurerm_application_gateway
  • azurerm_application_security_group
  • azurerm_express_route_circuit
  • azurerm_express_route_circuit_authorization
  • azurerm_express_route_circuit_peering
  • azurerm_local_network_gateway
  • azurerm_network_interface
  • azurerm_network_security_group
  • azurerm_network_watcher
  • azurerm_public_ip
  • azurerm_route_table
  • azurerm_subnet
  • azurerm_subnet_network_security_group_association
  • azurerm_subnet_route_table_group_association
  • azurerm_traffic_manager_endpoint
  • azurerm_traffic_manager_profile
  • azurerm_virtual_network
  • azurerm_virtual_network_gateway
  • azurerm_virtual_network_gateway_connection
  • azurerm_virtual_network_peering

Policy Resources

  • azurerm_policy_definition (custom poicies only)
  • azurerm_policy_set_definition (custom poicies only)
  • azurerm_policy_assignment

OMS Resources

  • azurerm_log_analytics_solution
  • azurerm_log_analytics_workspace

Recovery Services

  • azurerm_recovery_services_vault

Storage Resources

  • azurerm_storage_account

Other Azure Clouds

Global AzureCloud is used by default. To set a specific regional cloud, use -c <Cloud Name>

The following are acceptable values:

  • AzureCloud
  • AzureChinaCloud
  • AzureGermanCloud
  • AzureUSGovernment

Planned Additions

  • PaaS databases and other missing providers (feel free to contribute !)
  • ongoing better AKS support as AKS evolves
  • Other terraform providers as terraform supports

Using the Azure runbook code

Within the runbook directory you'll file a file az2tf-runbook.py

You can paste this code into an Azure python2 runbook, your automation account must have an Azure ARM Runas credential setup.

When runs it will leave you subscriptions terraform and terraform import caommands in the runbook output window

Unfortunately this only works for small subscriptions as Azure currently has a limit on how much output it will show in a runbook output window. If your output window is blank az2tf has probably worked (see the All Logs tab) but the amount of output has exceeded Azure's limit.

To workaround this you can download the output aftert he job has run with powershell see https://docs.microsoft.com/azure/automation/automation-runbook-output-and-messages#runbook-output.

If you find any output in the Exceptions tab please open an issue here and report it.

Known problems

Speed

It can take a lot of time to loop around everything in large subscriptions, in particular the importing of the resources.

KeyVault:

Can fail if your login/SPN doesn't have acccess to the KeyVault

Virtual machines:

These attributes always get reported in terraform plan set to false by default - may need to manually override

  • delete_data_disks_on_termination: "" => "false"
  • delete_os_disk_on_termination: "" => "false"

Storage Account

Can fail if your login/SPN doesn't have acccess to the KeyVault used for encryption. Can also fail if resource locks are in place

OMS

If solutions have '[' & ']' in their names they will be ignored.

ExpressRoute

No support for MS peering (don't have one to test!)

Key Vault

terraform doesn't support the "All" permission anymore but you may still have vaults using that permission.

Virtual Network Gateway

if no bgp settings specified for VNet Gateway, terraform plan will report a benign change see issue in github

~ update in-place
Terraform will perform the following actions:

~ azurerm_virtual_network_gateway.rg-$RGNAME__vgw-$VGWNAME
	bgp_settings.#: "" => <computed>

py-az2tf's People

Contributors

adrien-barret avatar andyt530 avatar bmaltais avatar jonhadfield avatar nebed avatar pjolsen avatar shahiddev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

py-az2tf's Issues

az2tf misses a `settings` attribute

When importing my setup, a settings attribute is missing:

# azurerm_virtual_machine_extension.mc_xyz-dev_xyz-dev_westeurope__aks-agentpool-13954513-0__computeAksLinuxBilling will be updated in-place
  ~ resource "azurerm_virtual_machine_extension" "mc_xyz-dev_xyz-dev_westeurope__aks-agentpool-13954513-0__computeAksLinuxBilling" {
        auto_upgrade_minor_version = true
      + settings                   = jsonencode({})
    }

ImportError: No module named requests

I tried to run this tool but getting below error.

nithin@Azure:~/py-az2tf$ ./az2tf.sh -s xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-v yes

Subscription ID = xxxxxxxxxxxxxxxxxxxxxxxx
Azure Resource Group Filter =
Terraform Resource Type Filter =
Get Subscription Policies & RBAC = no
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = yes
Debug = no

python2.7 ../../scripts/az2tf.py -s XXXXXXXXXXXXXXXXXXXX 2>&1 | tee -a import.log
Traceback (most recent call last):
File "../../scripts/az2tf.py", line 4, in
import requests
ImportError: No module named requests
ImportError: No module named requests
Error in az2tf.py

ValueError malformed string in ast.py

I'm not a Python programmer, and this is a new MacBook so I had to install a ton of prerequisites. However, I've used az2tf successfully before. This is the latest version of pretty much everything.

Traceback output:
./az2tf.sh -s redacted -p yes

Subscription ID = redacted
Azure Resource Group Filter =
Terraform Resource Type Filter =
Get Subscription Policies & RBAC = yes
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = no
Debug = no

python2.7 ../../scripts/az2tf.py -s redacted -p yes 2>&1 | tee -a import.log
Policies & RBAC=yes
Get Access Token from CLI
Subscription: redacted
Found subscription redacted proceeding ...

azurerm_policy_definition 414

Traceback (most recent call last):
File "../../scripts/az2tf.py", line 272, in module
azurerm_policy_definition.azurerm_policy_definition(crf,cde,crg,headers,requests,sub,json,az2tfmess)
File "/Users/aa681787/apps/azure/terraform/py-az2tf/py-az2tf/scripts/azurerm_policy_definition.py", line 78, in azurerm_policy_definition
prules=str(ast.literal_eval(json.dumps(azr[i]["properties"]["policyRule"])))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 62, in
return dict((_convert(k), _convert(v)) for k, v
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 62, in
return dict((_convert(k), _convert(v)) for k, v
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 60, in _convert
return list(map(_convert, node.elts))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 62, in
return dict((_convert(k), _convert(v)) for k, v
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
raise ValueError('malformed string')
ValueError: malformed string
Error in az2tf.py

Vnet Gateway with SKU: Basic returns null

Az cli version = 2.0.74 (installed on WSL2/Ubuntu)
Terraform = 0.12.9 (linux)
OS = WSL2 on Windows 10 (Ubuntu 18.04)

ISSUE:

Error enumerating vnet gateways of that has a sku= 'basic'

Traceback (most recent call last):
  File "../../scripts/az2tf.py", line 337, in <module>
    azurerm_virtual_network_gateway.azurerm_virtual_network_gateway(crf,cde,crg,headers,requests,sub,json,az2tfmess)
  File "/mnt/c/github/py-az2tf/scripts/azurerm_virtual_network_gateway.py", line 53, in azurerm_virtual_network_gateway          sku=azr[i]["properties"]["sku"]["name"]
KeyError: 'sku'
KeyError: 'sku'
Error in az2tf.py

Potential root cause

The azr variable in the file azurerm_virtual_network_gateway.py shows no sub-property under 'properties' for the gateway that has a basic SKU.

Troubleshooting

Confirmed that az cli returns the SKU with value Basic

az network vnet-gateway show -n gw-Resource-EastUS2 -g resourcegroupname

this returns

 "resourceGuid": "447f57f0-e5bd-4b1e-ae16-2716a32a542e",
  "sku": {
    "capacity": 2,
    "name": "Basic",
    "tier": "Basic"
  },

Tried changing the API version to : params = {'api-version': '2019-07-01'} Same issue persists.

Since sku is null the below gives a keyError

azr[2]["properties"]["sku"]

This could be related to Python SDK for Azure or the requests module in Python.

Validation error related to OmsAgentForLinux

Trying the quickstart and ran in one of those error that you requested to be logged. I hope this will help you:

root@14042f86dee0:~/py-az2tf# ./az2tf.sh -s 2de839a0-37f9-4163-a32a-e1bdb8d6eb7e -v yes

Subscription ID = 2de839a0-37f9-4163-a32a-e1bdb8d6eb7e
Azure Resource Group Filter =
Terraform Resource Type Filter =
Get Subscription Policies & RBAC = no
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = yes
Debug = no

python2.7 ../../scripts/az2tf.py -s 2de839a0-37f9-4163-a32a-e1bdb8d6eb7e 2>&1 | tee -a import.log
Get Access Token from CLI
Subscription: 2de839a0-37f9-4163-a32a-e1bdb8d6eb7e
Found subscription 2de839a0-37f9-4163-a32a-e1bdb8d6eb7e proceeding ...
# azurerm_resource_group 7
# azurerm_management_lock 0
# azurerm_user_assigned_identity 0
# azurerm_availability_set 0
# azurerm_route_table 0
# azurerm_application_security_group 0
# azurerm_network_security_group 0
# azurerm_virtual_network 4
# azurerm_subnet 4
# azurerm_virtual_network_peering 4
# azurerm_key_vault 0
# azurerm_managed_disk 3
# azurerm_storage_account 0
# azurerm_public_ip 0
# azurerm_traffic_manager_profile 0
# azurerm_traffic_manager_endpoint 0
# azurerm_network_interface 3
# azurerm_dns_zone 0
# azurerm_lb 0
# azurerm_lb_nat_rule 0
# azurerm_lb_nat_pool 0
# azurerm_lb_backend_address_pool 0
# azurerm_lb_probe 0
# azurerm_lb_rule 0
# azurerm_application_gateway 0
# azurerm_local_network_gateway 0
# azurerm_virtual_network_gateway 0
# azurerm_virtual_network_gateway_connection 0
# azurerm_express_route_circuit 0
# azurerm_express_route_circuit_authorization 0
# azurerm_express_route_circuit_peering 0
# azurerm_container_registry 0
# azurerm_kubernetes_cluster 0
# azurerm_recovery_services_vault 0
# azurerm_virtual_machine 3
# azurerm_virtual_machine_extension 3
# azurerm_virtual_machine_scale_set 0
# azurerm_automation_account 0
# azurerm_log_analytics_workspace 0
# azurerm_log_analytics_solution 0
# azurerm_image 0
# azurerm_shared_image_gallery 0
# azurerm_snapshot 0
# azurerm_network_watcher 1
# azurerm_cosmosdb_account 0
# azurerm_sql_server 0
# azurerm_sql_database 0
# azurerm_databricks_workspace 0
# azurerm_app_service_plan 0
# azurerm_app_service 0
# azurerm_function_app 0
# azurerm_logic_app_workflow 0
# azurerm_api_management 0
# azurerm_monitor_autoscale_setting 0
terraform init
There are some problems with the configuration, described below.

The Terraform configuration must be valid before initialization so that
Terraform can determine which modules and providers need to be installed.

Error: Error parsing /root/py-az2tf/generated/tf.2de839a0-37f9-4163-a32a-e1bdb8d6eb7e/azurerm_virtual_machine_extension.hub-vnet-rg__hub-vm__OmsAgentForLinux.tf: At 11:12: Unknown token: 11:12 IDENT jsonencode


Error: Error parsing /root/py-az2tf/generated/tf.2de839a0-37f9-4163-a32a-e1bdb8d6eb7e/azurerm_virtual_machine_extension.hub-vnet-rg__hub-vm__OmsAgentForLinux.tf: At 11:12: Unknown token: 11:12 IDENT jsonencode
Error with terraform init

Problem with ExpressRoute Private Peering

Hello,

The script hangs on a type conversion error at several steps, I'm summing it up here :

azurerm_virtual_network_gateway_connection.py, line 127 & 128 -> TypeError: cannot concatenate 'str' and 'int' objects
azurerm_express_route_circuit_peering.py, line 78 -> TypeError: cannot concatenate 'str' and 'list' objects

Each time solved by using str function in the print statement (might not be the solution but in order to move one step further it helps).

Another one easily fixed in the latter, line 74, it should be :
if pt == "MicrosoftPeering" or pt == "AzurePrivatePeering":
instead of
if pt == "MicrosoftPeering" or "pt" == "AzurePrivatePeering":

After that, it fails validation :

Error: Argument or block definition required

on azurerm_express_route_circuit_peering.network-prod-rg__AzurePrivatePeering.tf line 13, in resource "azurerm_express_route_circuit_peering" "network-prod-rg__AzurePrivatePeering":

An argument or block definition is required here.

The tf file (real info obfuscated obviously):

resource azurerm_express_route_circuit_peering network-prod-rg__AzurePrivatePeering {
resource_group_name = "some-rg"
peering_type = "AzurePrivatePeering"
express_route_circuit_name = "some-circuit"
primary_peer_address_prefix = "xxxxxx/30"
secondary_peer_address_prefix = "xxxxxx/30"
vlan_id = "xx"
peer_asn = "xxxx"
microsoft_peering_config {
advertised_public_prefixes = "[]"
}

Maybe more a terraform issue, I haven't been able to find a reference for AzurePrivatePeering.

Tx

file name too long

IOError: [Errno 36] File name too long: u'azurerm_network_security_group.citrix-xd-0feb107a-80db-493a-8ea0-3da8bca85a47-kebbz__Citrix-Deny-All-a3pgu-0feb107a-80db-493a-8ea0-3da8bca85a47.tf'
IOError: [Errno 36] File name too long: u'azurerm_network_security_group.citrix-xd-0feb107a-80db-493a-8ea0-3da8bca85a47-kebbz__Citrix-Deny-All-a3pgu-0feb107a-80db-493a-8ea0-3da8bca85a47.tf'
Error in az2tf.py

Any reasonable way to bypass this? thank you.

Error in az2tf.py

Thanks for the tool!! I am new to terraform and was referred here. I am attempting to use this tool in the Azure Government sector specifically usdodeast and I ran into a python error.
ENV details:
OS: CentOS 7.6

Package Versions:
azure-cli v2.0.71
Terraform v0.12.7
Python v2.7.5
export ARM_ENVIRONMENT=usgovernment

python2.7 ../../scripts/az2tf.py -s <subscriptionID> 2>&1 | tee -a import.log
Traceback (most recent call last):
  File "../../scripts/az2tf.py", line 4, in <module>
    import requests
ImportError: No module named requests
ImportError: No module named requests
Error in az2tf.py

Invalid escape sequence

I am getting the following error. It looks like it doesn't know how to properly treat backslashes in naming conventions.

Message:

Error: Invalid escape sequence

on azurerm_virtual_network.daze2-network-rg__dAZE2-Dev-vnet.tf line 17, in resource "azurerm_virtual_network" "daze2-network-rg__dAZE2-Dev-vnet":
17: "AppTaxonomy"="ITIS\Infrastructure\Dev"

The symbol "I" is not a valid escape sequence selector.

Invalid multi-line string

Package Versions:
azure-cli 2.0.72
Terraform v0.12.9
Python 2.7.15+

Terraform Resource Type Filter = 
Get Subscription Policies & RBAC = no
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = no
Debug = no
 
python2.7 ../../scripts/az2tf.py -s 8c2a2cbd-6bdc-4094-bfa1-8ca3b7f2c7ea -g wavy-whatsapp 2>&1 | tee -a import.log
resource group=wavy-whatsapp
Get Access Token from CLI
Subscription: 8c2a2cbd-6bdc-4094-bfa1-8ca3b7f2c7ea
Found subscription 8c2a2cbd-6bdc-4094-bfa1-8ca3b7f2c7ea proceeding ...
Found Resource Groupwavy-whatsapp
# azurerm_resource_group 4
# azurerm_management_lock 0
# azurerm_user_assigned_identity 1
rgname=mc_wavy-whatsapp_wavy-aks-whatsapp-single_eastus2 crg=wavy-whatsapp
# azurerm_availability_set 0
# azurerm_route_table 0
# azurerm_application_security_group 0
# azurerm_network_security_group 2
# azurerm_virtual_network 1
# azurerm_subnet 1
# azurerm_virtual_network_peering 1
# azurerm_key_vault 0
# azurerm_managed_disk 0
# azurerm_storage_account 2
# azurerm_public_ip 2
# azurerm_traffic_manager_profile 0
# azurerm_traffic_manager_endpoint 0
# azurerm_network_interface 0
# azurerm_dns_zone 0
# azurerm_lb 2
# azurerm_lb_nat_rule 2
# azurerm_lb_nat_pool 2
# azurerm_lb_backend_address_pool 2
# azurerm_lb_probe 2
# azurerm_lb_rule 2
# azurerm_application_gateway 1
# azurerm_local_network_gateway 0
# azurerm_virtual_network_gateway 0
# azurerm_virtual_network_gateway_connection 0
# azurerm_express_route_circuit 0
# azurerm_express_route_circuit_authorization 0
# azurerm_express_route_circuit_peering 0
# azurerm_container_registry 0
# azurerm_kubernetes_cluster 1
# azurerm_recovery_services_vault 0
# azurerm_virtual_machine 0
# azurerm_virtual_machine_extension 0
# azurerm_virtual_machine_scale_set 1
# azurerm_automation_account 0
# azurerm_log_analytics_workspace 1
# azurerm_log_analytics_solution 1
# azurerm_image 0
# azurerm_shared_image_gallery 0
# azurerm_snapshot 0
# azurerm_network_watcher 2
# azurerm_cosmosdb_account 0
# azurerm_sql_server 0
# azurerm_sql_database 0
# azurerm_databricks_workspace 0
# azurerm_app_service_plan 0
# azurerm_app_service 0
# azurerm_function_app 0
# azurerm_logic_app_workflow 0
# azurerm_api_management 0
# azurerm_monitor_autoscale_setting 0
terraform init
There are some problems with the configuration, described below.

The Terraform configuration must be valid before initialization so that
Terraform can determine which modules and providers need to be installed.

Error: Invalid multi-line string

  on azurerm_kubernetes_cluster.wavy-whatsapp__wavy-aks-whatsapp-single.tf line 11, in resource "azurerm_kubernetes_cluster" "wavy-whatsapp__wavy-aks-whatsapp-single":
  11: 
  12: 

Quoted strings may not be split over multiple lines. To produce a multi-line
string, either use the \n escape to represent a newline character or use the
"heredoc" multi-line template syntax.


Error: Unterminated template string

  on azurerm_kubernetes_cluster.wavy-whatsapp__wavy-aks-whatsapp-single.tf line 11, in resource "azurerm_kubernetes_cluster" "wavy-whatsapp__wavy-aks-whatsapp-single":
  11: 
  12: 

No closing marker was found for the string.

Error: Invalid multi-line string
Error: Unterminated template string
Error with terraform init

azurerm_express_route_circuit_peering error "UnboundLocalError: local variable 'fr' referenced before assignment"

az cli 2.0.74
Terraform 0.12.9
OS: WSL2 - Ubuntu 18.04
command used: ./az2tf.sh -s 8cfbd600-1193-40e4-8a27-xxxxxxxxx -d yes -f yes -v yes

Description: The script fails when it reaches the express route stage.


# azurerm_express_route_circuit_peering 1
{
    "sku": {
        "tier": "Premium",
        "name": "Premium_MeteredData",
        "family": "MeteredData"
    },
    "name": "xx_to_Azure_EAST_PROD2",
    "id": "/subscriptions/oood600-1193-40e4-8a27-xxxxxxxx/resourceGroups/ExpressRouteUSeast/providers/Microsoft.Network/expressRouteCircuits/xto_Azure_EAST_PROD2",
    "etag": "W/\"d53cc9b8-7434-49cf-8aa4-eac50404856f\"",
    "location": "eastus",
    "type": "Microsoft.Network/expressRouteCircuits",
    "properties": {
        "provisioningState": "Succeeded",
        "circuitProvisioningState": "Enabled",
        "authorizations": [],
        "serviceProviderProvisioningState": "NotProvisioned",
        "gatewayManagerEtag": "",
        "serviceProviderProperties": {
            "serviceProviderName": "Verizon",
            "bandwidthInMbps": 100,
            "peeringLocation": "Washington DC"
        },
        "allowClassicOperations": false,
        "serviceKey": "xxxxxxx-afb8-7ffb9b290723",
        "peerings": [],
        "resourceGuid": "xxxxxxxxxxxx-a98a-d31d3413615b"
    }
}
Traceback (most recent call last):
  File "../../scripts/az2tf.py", line 345, in <module>
    azurerm_express_route_circuit_peering.azurerm_express_route_circuit_peering(crf,cde,crg,headers,requests,sub,json,az2tfmess)
  File "/mnt/c/github/py-az2tf/scripts/azurerm_express_route_circuit_peering.py", line 91, in azurerm_express_route_circuit_peering          fr.write('}\n')
UnboundLocalError: local variable 'fr' referenced before assignment
UnboundLocalError: local variable 'fr' referenced before assignment
Error in az2tf.py

Python2 may be an unsafe alias?

Thanks for the badass tool!

I was able to easily work around this by creating an alias, but just a note that on my machine, python2 doesn't resolve to anything, while python resolves to v2.7 and python3 resolves to v3.7.3. Not sure it is safe to assume python2 exists with the variety of ways python could be installed/configured on MacOS (Homebrew, Apple Python, etc.).

pyc1="python2 ../../scripts/resources.py -s $mysub "

Note in resource "azurerm_management_lock"

I have

data "azurerm_subscription" "current" {}

resource "azurerm_management_lock" "subscription-level" {
...
notes = "Items can't be deleted in the "Group" Subscription"
}

which results in An argument definition must end with a newline.

Support for other Azure Clouds

Attempted to use this with Azure China, but received errors that it couldn't find the tenant or subscription specified. Dove into the code a bit, and looks like the API URL is hard-coded as https://management.azure.com/... in several places. Would probably be good to map this url value to an input parameter looking for "AzureCloud", "AzureChinaCloud", "AzureUSGovernment", or "AzureGermanCloud" - matching az cli.

Error unicode when running az2tf.sh -v yes

HI
When running az2tf.sh -v yes hitting the following error

azurerm_resource_group 16

azurerm_management_lock 13

azurerm_user_assigned_identity 0

azurerm_availability_set 0

azurerm_route_table 1

azurerm_application_security_group 0

azurerm_network_security_group 8

azurerm_virtual_network 4

azurerm_subnet 4

azurerm_virtual_network_peering 4

azurerm_key_vault 5

azurerm_managed_disk 46

Traceback (most recent call last):
File "../../scripts/az2tf.py", line 298, in
azurerm_managed_disk.azurerm_managed_disk(crf,cde,crg,headers,requests,sub,json,az2tfmess)
File "/home/dooret/py-az2tf/scripts/azurerm_managed_disk.py", line 135, in azurerm_managed_disk
fr.write('\t "' + key + '"="' + tval + '"\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 31: ordinal not in range(128)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 31: ordinal not in range(128)
Error in az2tf.py

Exception on local network gateway objects.

While running "./az2tf.sh -s xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -v yes". I receive the following exception.

# azurerm_local_network_gateway 4
Traceback (most recent call last):
  File "../../scripts/az2tf.py", line 326, in <module>
    azurerm_local_network_gateway.azurerm_local_network_gateway(crf,cde,crg,headers,requests,sub,json,az2tfmess)
  File "/home/kyle/py-az2tf/scripts/azurerm_local_network_gateway.py", line 70, in azurerm_local_network_gateway
    fr.write('\t\t asn = "' + asn + '"\n')
TypeError: cannot concatenate 'str' and 'int' objects
TypeError: cannot concatenate 'str' and 'int' objects
Error in az2tf.py

az2tf.sh Python Error

Ran this command after cloning the repo and installing the pre-req's: ./az2tf.sh -s '[redactedSubID]' -v yes

Received this Python error:

Subscription ID = [redactedSubID]
Azure Resource Group Filter =
Terraform Resource Type Filter =
Get Subscription Policies & RBAC = no
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = yes
Debug = no

python2.7 ../../scripts/az2tf.py -s [redactedSubID] 2>&1 | tee -a import.log
Traceback (most recent call last):
  File "../../scripts/az2tf.py", line 4, in <module>
    import requests
ImportError: No module named requests
ImportError: No module named requests
Error in az2tf.py

Traffic manager endpoint issue with app service as type

Had an issue with exporting an environment with a traffic manager endpoint using app service as an endpoint:

Error: Reference to undeclared resource

on azurerm_traffic_manager_endpoint.access2__DMSQA.tf line 11, in resource "azurerm_traffic_manager_endpoint" "access2__DMSQA":
11: target_resource_id = azurerm_public_ip.access2__access2qa.id

A managed resource "azurerm_public_ip" "access2__access2qa" has not been
declared in the root module.

When I manually export that resource I get a different target resource id:

target_resource_id = "/subscriptions/{SubID}/resourceGroups/{resource group}/providers/Microsoft.Web/sites/{app service}"

Tool isnt working

I tried to run the tool but this isnt working. This problem is from very long time almost from the month of march.
It would be great if anyone can fix it

azurerm_virtual_network_gateway_connection issue

Hi everyone

I do get the following error:

azurerm_virtual_network_gateway_connection

4
Traceback (most recent call last):
File "../../scripts/az2tf.py", line 367, in
azurerm_virtual_network_gateway_connection.azurerm_virtual_network_gateway_connection(crf,cde,crg,headers,requests,sub,json,az2tfmess,cldurl)
File "/home/philippe/py-az2tf-master/scripts/azurerm_virtual_network_gateway_connection.py", line 104, in azurerm_virtual_network_gateway_connection
fr.write('\t peer_virtual_network_gateway_id = azurerm_virtual_network_gateway.' + peerrg +'__' + peernam + '.id\n')
UnboundLocalError: local variable 'peerrg' referenced before assignment
UnboundLocalError: local variable 'peerrg' referenced before assignment
Error in az2tf.py

Cheers Philippe

IndexError: list index out of range

I got this error after triyng ./az2tf.sh -s “id-sub” -v yes

Traceback (most recent call last):
  File "../../scripts/az2tf.py", line 382, in <module>
azurerm_virtual_machine_extension.azurerm_virtual_machine_extension(crf,cde,crg,headers,requests,sub,json,az2tfmess,cldurl)
  File "/py-az2tf/scripts/azurerm_virtual_machine_extension.py", line 52, in azurerm_virtual_machine_extension
    ename=azr2[j]["name"]
IndexError: list index out of range
IndexError: list index out of range
Error in az2tf.py

The generated folder was created with many state .ft files but when I tried to type the next command ./az2tf.sh -s “[id_de_la_subscripcion_azure]” -f yes just it gots crashed

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", line 160, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", line 57, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/local/lib/python3.6/socket.py", line 745, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Try again
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 603, in urlopen
    chunked=chunked)
  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 344, in _make_request
    self._validate_conn(conn)
  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 843, in _validate_conn
    conn.connect()
  File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", line 316, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", line 169, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x7f24e11c3d30>: Failed to establish a new connection: [Errno -3] Try again

During handling of the above exception, another exception occurred:

Error naming slots resources

Hi again Andy!!
I found and issue with the new functionality added to import app service slots, it seems to work well but when you write the name of the slot you don't write the app service's name so the output name of the slot is always the same for every app service, so after the first loop I got an error and its imposible to obtain the slots for every app service just I got just one app service completed, the importation ends normally but the output shows errors, when I look into the generated folder I saw the next files:

├── azurerm_app_service.yak__gx-yak-ms-accounting-firm.tf
├── azurerm_app_service.yak__gx-yak-ms-journal-entries.tf
├── azurerm_app_service.yak__gx-yak-ms-ledger-accounts.tf
├── azurerm_app_service.yak__gx-yak-ms-mig-coi.tf
├── azurerm_app_service.yak__gx-yak-ms-reports.tf
├── azurerm_app_service_slot.yak__dev.tf
├── azurerm_app_service_slot.yak__staging.tf
├── azurerm_app_service_slot.yak__test.tf

The correct name I think could be something like this:

├── azurerm_app_service.yak__gx-yak-ms-accounting-firm.tf
├── azurerm_app_service.yak__gx-yak-ms-journal-entries.tf
├── azurerm_app_service.yak__gx-yak-ms-ledger-accounts.tf
├── azurerm_app_service.yak__gx-yak-ms-mig-coi.tf
├── azurerm_app_service.yak__gx-yak-ms-reports.tf
├── azurerm_app_service_slot.yak__gx-yak-ms-accounting-firm_dev.tf
├── azurerm_app_service_slot.yak__gx-yak-ms-accounting-firm_staging.tf
├── azurerm_app_service_slot.yak__gx-yak-ms-accounting-firm_test.tf
├── azurerm_app_service.yak__gx-yak-ms-journal-entries_dev.tf
├── azurerm_app_service.yak__gx-yak-ms-journal-entries_staging.tf
├── azurerm_app_service.yak__gx-yak-ms-journal-entries_test.tf
├── azurerm_app_service.yak__gx-yak-ms-ledger-accounts_dev.tf
├── azurerm_app_service.yak__gx-yak-ms-ledger-accounts_staging.tf
├── azurerm_app_service.yak__gx-yak-ms-ledger-accounts_test.tf
...
...
...

Event Hub support

First, thanks a lot for this tool.

Is there any plan to generate Terraform configuration files from Azure Event Hubs?

Thanks in advance

Still active?

As far as I can tell the dev branch hasn't been updated in about 11 months. Has anyone had any success using this tool lately? Is this project now dead? Has it been superseded?

Python error

Thanks for this great tool. I'm just starting to learn Terraform and have used this tool to create TF files for some resources already provisioned into our tenant by a previous employee. I'm trying to run it today on some PaaS applications, it could be that this error is related to an unsupported resource but I don't understand the python code enough yet to know! This is being run on the Terraform marketplace image, created today and AZ2TF was freshly cloned onto it.

python2.7 ../../scripts/az2tf.py -s 2>&1 | tee -a import.log
Get Access Token from CLI
Subscription:
Found subscription proceeding ...

azurerm_resource_group 8

azurerm_management_lock 2

Traceback (most recent call last):
File "../../scripts/az2tf.py", line 277, in
azurerm_management_lock.azurerm_management_lock(crf,cde,crg,headers,requests,sub,json,az2tfmess)
File "/home/stsadmin/py-az2tf/scripts/azurerm_management_lock.py", line 67, in azurerm_management_lock
fr.write('\t notes = "'+ notes + '"\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 74: ordinal not in range(128)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 74: ordinal not in range(128)
Error in az2tf.py

TypeError: cannot concatenate 'str' and 'NoneType' objects Error in az2tf.py

azurerm_resource_group 32

azurerm_management_lock 4

azurerm_user_assigned_identity 0

azurerm_availability_set 6

azurerm_route_table 1

azurerm_application_security_group 0

azurerm_network_security_group 16

azurerm_virtual_network 5

azurerm_subnet 5

azurerm_virtual_network_peering 5

azurerm_key_vault 2

azurerm_managed_disk 61

azurerm_storage_account 25

azurerm_public_ip 10

azurerm_traffic_manager_profile 0

azurerm_traffic_manager_endpoint 0

azurerm_network_interface 30

azurerm_dns_zone 0

azurerm_lb 3

azurerm_lb_nat_rule 3

azurerm_lb_nat_pool 3

azurerm_lb_backend_address_pool 3

azurerm_lb_probe 3

azurerm_lb_rule 3

azurerm_application_gateway 2

Traceback (most recent call last):
File "../../scripts/az2tf.py", line 333, in
azurerm_application_gateway.azurerm_application_gateway(crf,cde,crg,headers,requests,sub,json,az2tfmess)
File "/home/platforms/az2tf/py-az2tf/scripts/azurerm_application_gateway.py", line 199, in azurerm_application_gateway
fr.write('\t host_name = "' + bhn + '"\n')
TypeError: cannot concatenate 'str' and 'NoneType' objects
TypeError: cannot concatenate 'str' and 'NoneType' objects
Error in az2tf.py

Invalid multi-line string error

Hi

GOt Invalid multi-line string error when executing az2tf script for a subscription. Please find attached import log for the same executed with debug output.
import.log

Thanx

Error

Hi,
Am getting an error when trying to execute az2tf.sh script to generate tto terraform files.
Pasting the error below. I have just used this command. " ./az2tf.sh -s ".

ERROR BELOW:-

Traceback (most recent call last):
File "../../scripts/az2tf.py", line 385, in
azurerm_virtual_machine_scale_set.azurerm_virtual_machine_scale_set(crf,cde,crg,headers,requests,sub,json,az2tfmess,cldurl)
File "/usr/csuser/clouddrive/tf/az2tf/py-az2tf/scripts/azurerm_virtual_machine_scale_set.py", line 65, in azurerm_virtual_machine_scale_set
osvhd = azr[i]["properties"]["virtualMachineProfile"]["osProfile"]["linuxConfiguration"]["ssh"]["publicKeys"][0]["keyData"]
IndexError: list index out of range
IndexError: list index out of range
Error in az2tf.py

Please check and revert.
THanx

Azurerm 2.0 fails to validate

Azurerm2.0 requires extra field to be present in provider section

provider "azurerm" {
    version = ">= 1.40.0"
}

vs

provider "azurerm" {
    version = ">= 2.0.0"
    features {
    }
}

Validation fails without that.

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "azurerm" (hashicorp/azurerm) 2.0.0...

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
terraform validate

Error: "features": required field is not set


Error Validating

Generated message points to old repo

The file was generated by message is pointing to the wrong repo

# File generated by az2tf see: https://github.com/andyt530/az2tf

should be

# File generated by py-az2tf see: https://github.com/andyt530/py-az2tf

(Thanks for the awesome tool btw!)

Consider supporting Terraform 12.x

Great job -- I was not expecting to find anyone masochistic enough to start on this, but lo and behold, there you were :)

In my excitement to race ahead, I overlooked your version 11.11 requirement (latest is 11.14 as of this writing, I'll assume you just mean 11.x) and ran it with 12.x installed. It actually worked until it got to validate, and the only thing it complained about were the tags I'd assigned to my resources:

Error: Unsupported block type

  on azurerm_resource_group__ccma-qa-resources.tf line 4, in resource "azurerm_resource_group" "ccma-qa-resources":
   4:   tags {

Blocks of type "tags" are not expected here. Did you mean to define argument
"tags"? If so, use the equals sign to assign it a value.

This doesn't seem like a huge issue - any chance of realigning the rebirth of this project in pyhton with a v12 dependency so as to not get left in the sunset? If not, that's okay - but perhaps you could direct me as to where I should look to hack this in myself to emit v12 compatible tag schema?

Python cannot find "requests" module

I downloaded the repo, unzipped to an empty directory, CDed to the directory that had the az2tf.sh script, and issued the following command:

./az2tf.sh -s mysubsciptionid -g mygroupdname -v yes

I got:
Subscription ID = myssubscriptionid
Azure Resource Group Filter = mygroupsname
Terraform Resource Type Filter =
Get Subscription Policies & RBAC = no
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = yes
Debug = no

python2.7 ../../scripts/az2tf.py -s 3fde759f-01ac-48dd-b16b-885608b2be16 -g wase 2>&1 | tee -a import.log
Traceback (most recent call last):
File "../../scripts/az2tf.py", line 4, in
import requests
ImportError: No module named requests
ImportError: No module named requests
Error in az2tf.py

az2tf replaces names by uuid

When importing my setup, az2tf replaces some names by some uuid:

  ~ resource "azurerm_role_definition" "roledefinitions__fd...f3" {
        assignable_scopes = [
            "/",
        ]
        description       = "Can read the attestation provider properties"
        id                = "/subscriptions/c0...4fc/providers/Microsoft.Authorization/roleDefinitions/fd...f3"
      ~ name              = "Attestation Reader" -> "fd1bd22b-8476-40bc-a0bc-69b95687b9f3"

Ubuntu-18.04-Missing-Resource-Invalid-block-definition

Seems to be an issue with some of the terraform files when doing a validate.

Ubuntu-18.04
Terraform v0.12.9
azure-cli 2.0.73

The resource Type and Name are missing been surrounded by ""

Azure Automation accounts - Multiple

  • Error: Missing name for resource

    • azurerm_automation_account
    • All resource blocks must have 2 labels (type, name).
  • Error: Invalid block definition

    • azurerm_automation_account
    • Either a quoted string block label or an opening brace ("{") is expected here.

azurerm_log_analytics_solution - Multiple

  • Error: Missing name for resource

    • azurerm_log_analytics_solution
    • All resource blocks must have 2 labels (type, name).
  • Error: Invalid block definition

    • azurerm_log_analytics_solution
    • Either a quoted string block label or an opening brace ("{") is expected here.

azurerm_managed_disk - Multiple

  • Error: Missing name for resource
    -azurerm_managed_disk

    • All resource blocks must have 2 labels (type, name).
  • Error: Invalid block definition

    • azurerm_managed_disk
    • Either a quoted string block label or an opening brace ("{") is expected here.

azurerm_network_interface - Multiple

  • Error: Missing name for resource
    -azurerm_network_interface

    • All resource blocks must have 2 labels (type, name).
  • Error: Invalid block definition

    • azurerm_network_interface
    • Either a quoted string block label or an opening brace ("{") is expected here.

Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Invalid resource name
Error: Invalid resource name
Error: Invalid resource name
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Invalid resource name
Error: Invalid resource name
Error: Invalid resource name
Error: Invalid resource name
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error: Missing name for resource
Error: Invalid block definition
Error with terraform init

unable to run

running this from Windows 10 1903 using the Azure CLI I get the following error, verified Python 2.7 exists

bash: az: command not found

Subscription ID = Redacted
Azure Resource Group Filter =
Terraform Resource Type Filter =
Get Subscription Policies & RBAC = no
Extract Key Vault Secrets to .tf files (insecure) = no
Fast Forward = no
Validate Only = yes
Debug = no

python2.7 ../../scripts/az2tf.py -s SubScription>&1 | tee -a import.log
bash: python2.7: command not found

Unable to get around this issue.

Output Errors creating .tf files

the module azurerm_storage_account does not include the argument "default_value = Allow/Deny" when a network restriction is set to an account Causes immediate validation errors.

Deprication warnings exist as well with the following errors:

Warning: "zone_type": [DEPRECATED] Use the azurerm_private_dns_zone resource instead.
Warning: "network_security_group_id": [DEPRECATED] Use the azurerm_subnet_network_security_group_association` resource instead.

Works wonerfully outside of that, thank you!

az2tf can't handle apostrophes

Hi,

great tool, thanks!

There seems to be a problem when handling apostrophes (can't vs cant):

~ description       = "Can view CDN profiles and their endpoints, but can’t make changes." -> "Can view CDN profiles and their endpoints, but cant make changes."

no *state*.sh

chmod: cannot access 'state.sh': No such file or directory state cleaned ls: cannot access '**stateimp.sh': No such file or directory imports completed Terraform fmt ... azure.tf Terraform Plan ... Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.