github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/azure/database.go (about)

     1  // Copyright 2019 The Terraformer Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package azure
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  	"strings"
    21  
    22  	"github.com/Azure/azure-sdk-for-go/services/mariadb/mgmt/2018-06-01/mariadb"
    23  	"github.com/Azure/azure-sdk-for-go/services/mysql/mgmt/2017-12-01/mysql"
    24  	"github.com/Azure/azure-sdk-for-go/services/postgresql/mgmt/2017-12-01/postgresql"
    25  	"github.com/Azure/azure-sdk-for-go/services/preview/sql/mgmt/2017-03-01-preview/sql"
    26  	"github.com/Azure/go-autorest/autorest"
    27  	"github.com/GoogleCloudPlatform/terraformer/terraformutils"
    28  	"github.com/hashicorp/go-azure-helpers/authentication"
    29  )
    30  
    31  type DatabasesGenerator struct {
    32  	AzureService
    33  }
    34  
    35  func (g *DatabasesGenerator) getMariaDBServers() ([]mariadb.Server, error) {
    36  	ctx := context.Background()
    37  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
    38  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
    39  
    40  	Client := mariadb.NewServersClient(SubscriptionID)
    41  	Client.Authorizer = Authorizer
    42  
    43  	var (
    44  		Servers mariadb.ServerListResult
    45  		err     error
    46  	)
    47  	if rg := g.Args["resource_group"].(string); rg != "" {
    48  		Servers, err = Client.ListByResourceGroup(ctx, rg)
    49  	} else {
    50  		Servers, err = Client.List(ctx)
    51  	}
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  
    56  	return *Servers.Value, nil
    57  }
    58  
    59  func (g *DatabasesGenerator) createMariaDBServerResources(servers []mariadb.Server) ([]terraformutils.Resource, error) {
    60  	var resources []terraformutils.Resource
    61  
    62  	for _, server := range servers {
    63  		resources = append(resources, terraformutils.NewResource(
    64  			*server.ID,
    65  			*server.Name,
    66  			"azurerm_mariadb_server",
    67  			g.ProviderName,
    68  			map[string]string{},
    69  			[]string{},
    70  			map[string]interface{}{
    71  				"administrator_login_password": "",
    72  			}))
    73  	}
    74  
    75  	return resources, nil
    76  }
    77  
    78  func (g *DatabasesGenerator) createMariaDBConfigurationResources(servers []mariadb.Server) ([]terraformutils.Resource, error) {
    79  	var resources []terraformutils.Resource
    80  	ctx := context.Background()
    81  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
    82  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
    83  
    84  	Client := mariadb.NewConfigurationsClient(SubscriptionID)
    85  	Client.Authorizer = Authorizer
    86  
    87  	for _, server := range servers {
    88  		id, err := ParseAzureResourceID(*server.ID)
    89  		if err != nil {
    90  			return nil, err
    91  		}
    92  		configs, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
    93  		if err != nil {
    94  			return nil, err
    95  		}
    96  
    97  		for _, config := range *configs.Value {
    98  			resources = append(resources, terraformutils.NewSimpleResource(
    99  				*config.ID,
   100  				*config.Name+"-"+*server.Name,
   101  				"azurerm_mariadb_configuration",
   102  				g.ProviderName,
   103  				[]string{"value"}))
   104  		}
   105  	}
   106  
   107  	return resources, nil
   108  }
   109  
   110  func (g *DatabasesGenerator) createMariaDBDatabaseResources(servers []mariadb.Server) ([]terraformutils.Resource, error) {
   111  	var resources []terraformutils.Resource
   112  	ctx := context.Background()
   113  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   114  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   115  
   116  	Client := mariadb.NewDatabasesClient(SubscriptionID)
   117  	Client.Authorizer = Authorizer
   118  
   119  	for _, server := range servers {
   120  		id, err := ParseAzureResourceID(*server.ID)
   121  		if err != nil {
   122  			return nil, err
   123  		}
   124  		databases, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   125  		if err != nil {
   126  			return nil, err
   127  		}
   128  
   129  		for _, database := range *databases.Value {
   130  			resources = append(resources, terraformutils.NewSimpleResource(
   131  				*database.ID,
   132  				*database.Name+"-"+*server.Name,
   133  				"azurerm_mariadb_database",
   134  				g.ProviderName,
   135  				[]string{}))
   136  		}
   137  	}
   138  
   139  	return resources, nil
   140  }
   141  
   142  func (g *DatabasesGenerator) createMariaDBFirewallRuleResources(servers []mariadb.Server) ([]terraformutils.Resource, error) {
   143  	var resources []terraformutils.Resource
   144  	ctx := context.Background()
   145  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   146  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   147  
   148  	Client := mariadb.NewFirewallRulesClient(SubscriptionID)
   149  	Client.Authorizer = Authorizer
   150  	for _, server := range servers {
   151  		id, err := ParseAzureResourceID(*server.ID)
   152  		if err != nil {
   153  			return nil, err
   154  		}
   155  
   156  		rules, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   157  		if err != nil {
   158  			return nil, err
   159  		}
   160  		for _, rule := range *rules.Value {
   161  			resources = append(resources, terraformutils.NewSimpleResource(
   162  				*rule.ID,
   163  				*rule.Name,
   164  				"azurerm_mariadb_firewall_rule",
   165  				g.ProviderName,
   166  				[]string{}))
   167  		}
   168  	}
   169  
   170  	return resources, nil
   171  }
   172  
   173  func (g *DatabasesGenerator) createMariaDBVirtualNetworkRuleResources(servers []mariadb.Server) ([]terraformutils.Resource, error) {
   174  	var resources []terraformutils.Resource
   175  	ctx := context.Background()
   176  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   177  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   178  
   179  	Client := mariadb.NewVirtualNetworkRulesClient(SubscriptionID)
   180  	Client.Authorizer = Authorizer
   181  
   182  	for _, server := range servers {
   183  		id, err := ParseAzureResourceID(*server.ID)
   184  		if err != nil {
   185  			return nil, err
   186  		}
   187  		iter, err := Client.ListByServerComplete(ctx, id.ResourceGroup, *server.Name)
   188  		if err != nil {
   189  			return nil, err
   190  		}
   191  		for iter.NotDone() {
   192  			rule := iter.Value()
   193  			resources = append(resources, terraformutils.NewSimpleResource(
   194  				*rule.ID,
   195  				*rule.Name,
   196  				"azurerm_mariadb_virtual_network_rule",
   197  				g.ProviderName,
   198  				[]string{}))
   199  
   200  			if err := iter.NextWithContext(ctx); err != nil {
   201  				return nil, err
   202  			}
   203  		}
   204  	}
   205  	return resources, nil
   206  }
   207  
   208  func (g *DatabasesGenerator) getMySQLServers() ([]mysql.Server, error) {
   209  	ctx := context.Background()
   210  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   211  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   212  
   213  	Client := mysql.NewServersClient(SubscriptionID)
   214  	Client.Authorizer = Authorizer
   215  
   216  	var (
   217  		Servers mysql.ServerListResult
   218  		err     error
   219  	)
   220  
   221  	if rg := g.Args["resource_group"].(string); rg != "" {
   222  		Servers, err = Client.ListByResourceGroup(ctx, rg)
   223  	} else {
   224  		Servers, err = Client.List(ctx)
   225  	}
   226  	if err != nil {
   227  		return nil, err
   228  	}
   229  
   230  	return *Servers.Value, nil
   231  }
   232  
   233  func (g *DatabasesGenerator) createMySQLServerResources(servers []mysql.Server) ([]terraformutils.Resource, error) {
   234  	var resources []terraformutils.Resource
   235  
   236  	for _, server := range servers {
   237  		resources = append(resources, terraformutils.NewResource(
   238  			*server.ID,
   239  			*server.Name,
   240  			"azurerm_mysql_server",
   241  			g.ProviderName,
   242  			map[string]string{},
   243  			[]string{},
   244  			map[string]interface{}{
   245  				"administrator_login_password": "",
   246  			}))
   247  	}
   248  
   249  	return resources, nil
   250  }
   251  
   252  func (g *DatabasesGenerator) createMySQLConfigurationResources(servers []mysql.Server) ([]terraformutils.Resource, error) {
   253  	var resources []terraformutils.Resource
   254  	ctx := context.Background()
   255  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   256  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   257  
   258  	Client := mysql.NewConfigurationsClient(SubscriptionID)
   259  	Client.Authorizer = Authorizer
   260  
   261  	for _, server := range servers {
   262  		id, err := ParseAzureResourceID(*server.ID)
   263  		if err != nil {
   264  			return nil, err
   265  		}
   266  
   267  		configs, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   268  		if err != nil {
   269  			return nil, err
   270  		}
   271  		for _, config := range *configs.Value {
   272  			resources = append(resources, terraformutils.NewSimpleResource(
   273  				*config.ID,
   274  				*config.Name+"-"+*server.Name,
   275  				"azurerm_mysql_configuration",
   276  				g.ProviderName,
   277  				[]string{"value"}))
   278  		}
   279  	}
   280  
   281  	return resources, nil
   282  }
   283  
   284  func (g *DatabasesGenerator) createMySQLDatabaseResources(servers []mysql.Server) ([]terraformutils.Resource, error) {
   285  	var resources []terraformutils.Resource
   286  	ctx := context.Background()
   287  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   288  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   289  
   290  	Client := mysql.NewDatabasesClient(SubscriptionID)
   291  	Client.Authorizer = Authorizer
   292  
   293  	for _, server := range servers {
   294  		id, err := ParseAzureResourceID(*server.ID)
   295  		if err != nil {
   296  			return nil, err
   297  		}
   298  		databases, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   299  		if err != nil {
   300  			return nil, err
   301  		}
   302  
   303  		for _, database := range *databases.Value {
   304  			resources = append(resources, terraformutils.NewSimpleResource(
   305  				*database.ID,
   306  				*database.Name+"-"+*server.Name,
   307  				"azurerm_mysql_database",
   308  				g.ProviderName,
   309  				[]string{}))
   310  		}
   311  	}
   312  	return resources, nil
   313  }
   314  
   315  func (g *DatabasesGenerator) createMySQLFirewallRuleResources(servers []mysql.Server) ([]terraformutils.Resource, error) {
   316  	var resources []terraformutils.Resource
   317  	ctx := context.Background()
   318  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   319  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   320  
   321  	Client := mysql.NewFirewallRulesClient(SubscriptionID)
   322  	Client.Authorizer = Authorizer
   323  
   324  	for _, server := range servers {
   325  		id, err := ParseAzureResourceID(*server.ID)
   326  		if err != nil {
   327  			return nil, err
   328  		}
   329  		rules, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   330  		if err != nil {
   331  			return nil, err
   332  		}
   333  
   334  		for _, rule := range *rules.Value {
   335  			resources = append(resources, terraformutils.NewSimpleResource(
   336  				*rule.ID,
   337  				*rule.Name,
   338  				"azurerm_mysql_firewall_rule",
   339  				g.ProviderName,
   340  				[]string{}))
   341  		}
   342  	}
   343  
   344  	return resources, nil
   345  }
   346  
   347  func (g *DatabasesGenerator) createMySQLVirtualNetworkRuleResources(servers []mysql.Server) ([]terraformutils.Resource, error) {
   348  	var resources []terraformutils.Resource
   349  	ctx := context.Background()
   350  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   351  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   352  
   353  	Client := mysql.NewVirtualNetworkRulesClient(SubscriptionID)
   354  	Client.Authorizer = Authorizer
   355  
   356  	for _, server := range servers {
   357  		id, err := ParseAzureResourceID(*server.ID)
   358  		if err != nil {
   359  			return nil, err
   360  		}
   361  
   362  		iter, err := Client.ListByServerComplete(ctx, id.ResourceGroup, *server.Name)
   363  		if err != nil {
   364  			return nil, err
   365  		}
   366  
   367  		for iter.NotDone() {
   368  			rule := iter.Value()
   369  			resources = append(resources, terraformutils.NewSimpleResource(
   370  				*rule.ID,
   371  				*rule.Name,
   372  				"azurerm_mysql_virtual_network_rule",
   373  				g.ProviderName,
   374  				[]string{}))
   375  
   376  			if err := iter.NextWithContext(ctx); err != nil {
   377  				return nil, err
   378  			}
   379  		}
   380  	}
   381  
   382  	return resources, nil
   383  }
   384  
   385  func (g *DatabasesGenerator) getPostgreSQLServers() ([]postgresql.Server, error) {
   386  	ctx := context.Background()
   387  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   388  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   389  
   390  	Client := postgresql.NewServersClient(SubscriptionID)
   391  	Client.Authorizer = Authorizer
   392  
   393  	var (
   394  		Servers postgresql.ServerListResult
   395  		err     error
   396  	)
   397  
   398  	if rg := g.Args["resource_group"].(string); rg != "" {
   399  		Servers, err = Client.ListByResourceGroup(ctx, rg)
   400  	} else {
   401  		Servers, err = Client.List(ctx)
   402  	}
   403  
   404  	if err != nil {
   405  		return nil, err
   406  	}
   407  
   408  	return *Servers.Value, nil
   409  }
   410  
   411  func (g *DatabasesGenerator) createPostgreSQLServerResources(servers []postgresql.Server) ([]terraformutils.Resource, error) {
   412  	var resources []terraformutils.Resource
   413  
   414  	for _, server := range servers {
   415  		resources = append(resources, terraformutils.NewResource(
   416  			*server.ID,
   417  			*server.Name,
   418  			"azurerm_postgresql_server",
   419  			g.ProviderName,
   420  			map[string]string{},
   421  			[]string{},
   422  			map[string]interface{}{
   423  				"administrator_login_password": "",
   424  			}))
   425  	}
   426  
   427  	return resources, nil
   428  }
   429  
   430  func (g *DatabasesGenerator) createPostgreSQLDatabaseResources(servers []postgresql.Server) ([]terraformutils.Resource, error) {
   431  	var resources []terraformutils.Resource
   432  	ctx := context.Background()
   433  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   434  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   435  
   436  	Client := postgresql.NewDatabasesClient(SubscriptionID)
   437  	Client.Authorizer = Authorizer
   438  
   439  	for _, server := range servers {
   440  		id, err := ParseAzureResourceID(*server.ID)
   441  		if err != nil {
   442  			return nil, err
   443  		}
   444  		databases, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   445  		if err != nil {
   446  			return nil, err
   447  		}
   448  
   449  		for _, database := range *databases.Value {
   450  			resources = append(resources, terraformutils.NewSimpleResource(
   451  				*database.ID,
   452  				*database.Name+"-"+*server.Name,
   453  				"azurerm_postgresql_database",
   454  				g.ProviderName,
   455  				[]string{}))
   456  		}
   457  	}
   458  	return resources, nil
   459  }
   460  
   461  func (g *DatabasesGenerator) createPostgreSQLConfigurationResources(servers []postgresql.Server) ([]terraformutils.Resource, error) {
   462  	var resources []terraformutils.Resource
   463  	ctx := context.Background()
   464  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   465  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   466  	Client := postgresql.NewConfigurationsClient(SubscriptionID)
   467  	Client.Authorizer = Authorizer
   468  
   469  	for _, server := range servers {
   470  		id, err := ParseAzureResourceID(*server.ID)
   471  		if err != nil {
   472  			return nil, err
   473  		}
   474  		configs, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   475  		if err != nil {
   476  			return nil, err
   477  		}
   478  
   479  		for _, config := range *configs.Value {
   480  			resources = append(resources, terraformutils.NewSimpleResource(
   481  				*config.ID,
   482  				*config.Name+"-"+*server.Name,
   483  				"azurerm_postgresql_configuration",
   484  				g.ProviderName,
   485  				[]string{"value"}))
   486  		}
   487  	}
   488  	return resources, nil
   489  }
   490  
   491  func (g *DatabasesGenerator) createPostgreSQLFirewallRuleResources(servers []postgresql.Server) ([]terraformutils.Resource, error) {
   492  	var resources []terraformutils.Resource
   493  	ctx := context.Background()
   494  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   495  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   496  
   497  	Client := postgresql.NewFirewallRulesClient(SubscriptionID)
   498  	Client.Authorizer = Authorizer
   499  
   500  	for _, server := range servers {
   501  		id, err := ParseAzureResourceID(*server.ID)
   502  		if err != nil {
   503  			return nil, err
   504  		}
   505  		rules, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   506  		if err != nil {
   507  			return nil, err
   508  		}
   509  
   510  		for _, rule := range *rules.Value {
   511  			resources = append(resources, terraformutils.NewSimpleResource(
   512  				*rule.ID,
   513  				*rule.Name,
   514  				"azurerm_postgresql_firewall_rule",
   515  				g.ProviderName,
   516  				[]string{}))
   517  		}
   518  	}
   519  	return resources, nil
   520  }
   521  
   522  func (g *DatabasesGenerator) createPostgreSQLVirtualNetworkRuleResources(servers []postgresql.Server) ([]terraformutils.Resource, error) {
   523  	var resources []terraformutils.Resource
   524  	ctx := context.Background()
   525  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   526  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   527  
   528  	Client := postgresql.NewVirtualNetworkRulesClient(SubscriptionID)
   529  	Client.Authorizer = Authorizer
   530  
   531  	for _, server := range servers {
   532  		id, err := ParseAzureResourceID(*server.ID)
   533  		if err != nil {
   534  			return nil, err
   535  		}
   536  		rulePages, err := Client.ListByServerComplete(ctx, id.ResourceGroup, *server.Name)
   537  		if err != nil {
   538  			return nil, err
   539  		}
   540  
   541  		for rulePages.NotDone() {
   542  			rule := rulePages.Value()
   543  			resources = append(resources, terraformutils.NewSimpleResource(
   544  				*rule.ID,
   545  				*rule.Name,
   546  				"azurerm_postgresql_virtual_network_rule",
   547  				g.ProviderName,
   548  				[]string{}))
   549  		}
   550  	}
   551  	return resources, nil
   552  }
   553  
   554  func (g *DatabasesGenerator) getSQLServers() ([]sql.Server, error) {
   555  	var servers []sql.Server
   556  	ctx := context.Background()
   557  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   558  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   559  
   560  	Client := sql.NewServersClient(SubscriptionID)
   561  	Client.Authorizer = Authorizer
   562  
   563  	var (
   564  		ServerPages sql.ServerListResultPage
   565  		err         error
   566  	)
   567  
   568  	if rg := g.Args["resource_group"].(string); rg != "" {
   569  		ServerPages, err = Client.ListByResourceGroup(ctx, rg)
   570  	} else {
   571  		ServerPages, err = Client.List(ctx)
   572  	}
   573  	if err != nil {
   574  		return nil, err
   575  	}
   576  	for ServerPages.NotDone() {
   577  		servers = append(servers, ServerPages.Values()...)
   578  		if err := ServerPages.NextWithContext(ctx); err != nil {
   579  			return nil, err
   580  		}
   581  	}
   582  
   583  	return servers, nil
   584  }
   585  
   586  func (g *DatabasesGenerator) createSQLServerResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   587  	var resources []terraformutils.Resource
   588  
   589  	for _, server := range servers {
   590  		resources = append(resources, terraformutils.NewResource(
   591  			*server.ID,
   592  			*server.Name,
   593  			"azurerm_sql_server",
   594  			g.ProviderName,
   595  			map[string]string{},
   596  			[]string{},
   597  			map[string]interface{}{
   598  				"administrator_login_password": "",
   599  			}))
   600  	}
   601  
   602  	return resources, nil
   603  }
   604  
   605  func (g *DatabasesGenerator) createSQLDatabaseResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   606  	var resources []terraformutils.Resource
   607  	ctx := context.Background()
   608  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   609  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   610  
   611  	Client := sql.NewDatabasesClient(SubscriptionID)
   612  	Client.Authorizer = Authorizer
   613  
   614  	for _, server := range servers {
   615  		id, err := ParseAzureResourceID(*server.ID)
   616  		if err != nil {
   617  			return nil, err
   618  		}
   619  		databases, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name, "", "")
   620  		if err != nil {
   621  			return nil, err
   622  		}
   623  
   624  		for _, database := range *databases.Value {
   625  			resources = append(resources, terraformutils.NewSimpleResource(
   626  				*database.ID,
   627  				*database.Name+"-"+*server.Name,
   628  				"azurerm_sql_database",
   629  				g.ProviderName,
   630  				[]string{}))
   631  		}
   632  	}
   633  	return resources, nil
   634  }
   635  
   636  func (g *DatabasesGenerator) createSQLFirewallRuleResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   637  	var resources []terraformutils.Resource
   638  	ctx := context.Background()
   639  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   640  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   641  
   642  	Client := sql.NewFirewallRulesClient(SubscriptionID)
   643  	Client.Authorizer = Authorizer
   644  
   645  	for _, server := range servers {
   646  		id, err := ParseAzureResourceID(*server.ID)
   647  		if err != nil {
   648  			return nil, err
   649  		}
   650  		rules, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   651  		if err != nil {
   652  			return nil, err
   653  		}
   654  
   655  		for _, rule := range *rules.Value {
   656  			resources = append(resources, terraformutils.NewSimpleResource(
   657  				*rule.ID,
   658  				*rule.Name,
   659  				"azurerm_sql_firewall_rule",
   660  				g.ProviderName,
   661  				[]string{}))
   662  		}
   663  	}
   664  	return resources, nil
   665  }
   666  
   667  func (g *DatabasesGenerator) createSQLVirtualNetworkRuleResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   668  	var resources []terraformutils.Resource
   669  	ctx := context.Background()
   670  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   671  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   672  
   673  	Client := sql.NewVirtualNetworkRulesClient(SubscriptionID)
   674  	Client.Authorizer = Authorizer
   675  
   676  	for _, server := range servers {
   677  		id, err := ParseAzureResourceID(*server.ID)
   678  		if err != nil {
   679  			return nil, err
   680  		}
   681  		ruleIter, err := Client.ListByServerComplete(ctx, id.ResourceGroup, *server.Name)
   682  		if err != nil {
   683  			return nil, err
   684  		}
   685  
   686  		for ruleIter.NotDone() {
   687  			rule := ruleIter.Value()
   688  			resources = append(resources, terraformutils.NewSimpleResource(
   689  				*rule.ID,
   690  				*rule.Name,
   691  				"azurerm_sql_virtual_network_rule",
   692  				g.ProviderName,
   693  				[]string{}))
   694  		}
   695  		if err := ruleIter.NextWithContext(ctx); err != nil {
   696  			return nil, err
   697  		}
   698  	}
   699  	return resources, nil
   700  }
   701  
   702  func (g *DatabasesGenerator) createSQLElasticPoolResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   703  	var resources []terraformutils.Resource
   704  	ctx := context.Background()
   705  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   706  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   707  
   708  	Client := sql.NewElasticPoolsClient(SubscriptionID)
   709  	Client.Authorizer = Authorizer
   710  
   711  	for _, server := range servers {
   712  		id, err := ParseAzureResourceID(*server.ID)
   713  		if err != nil {
   714  			return nil, err
   715  		}
   716  		pools, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   717  		if err != nil {
   718  			return nil, err
   719  		}
   720  
   721  		for _, pool := range *pools.Value {
   722  			resources = append(resources, terraformutils.NewSimpleResource(
   723  				*pool.ID,
   724  				*pool.Name,
   725  				"azurerm_sql_elasticpool",
   726  				g.ProviderName,
   727  				[]string{}))
   728  		}
   729  	}
   730  	return resources, nil
   731  }
   732  
   733  func (g *DatabasesGenerator) createSQLFailoverResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   734  	var resources []terraformutils.Resource
   735  	ctx := context.Background()
   736  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   737  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   738  
   739  	Client := sql.NewFailoverGroupsClient(SubscriptionID)
   740  	Client.Authorizer = Authorizer
   741  
   742  	for _, server := range servers {
   743  		id, err := ParseAzureResourceID(*server.ID)
   744  		if err != nil {
   745  			return nil, err
   746  		}
   747  
   748  		iter, err := Client.ListByServerComplete(ctx, id.ResourceGroup, *server.Name)
   749  		if err != nil {
   750  			return nil, err
   751  		}
   752  
   753  		for iter.NotDone() {
   754  			failoverGroup := iter.Value()
   755  
   756  			resources = append(resources, terraformutils.NewSimpleResource(
   757  				*failoverGroup.ID,
   758  				*failoverGroup.Name,
   759  				"azurerm_sql_failover_group",
   760  				g.ProviderName,
   761  				[]string{}))
   762  		}
   763  	}
   764  	return resources, nil
   765  }
   766  
   767  func (g *DatabasesGenerator) createSQLADAdministratorResources(servers []sql.Server) ([]terraformutils.Resource, error) {
   768  	var resources []terraformutils.Resource
   769  	ctx := context.Background()
   770  	SubscriptionID := g.Args["config"].(authentication.Config).SubscriptionID
   771  	Authorizer := g.Args["authorizer"].(autorest.Authorizer)
   772  
   773  	Client := sql.NewServerAzureADAdministratorsClient(SubscriptionID)
   774  	Client.Authorizer = Authorizer
   775  
   776  	for _, server := range servers {
   777  		id, err := ParseAzureResourceID(*server.ID)
   778  		if err != nil {
   779  			return nil, err
   780  		}
   781  
   782  		administrators, err := Client.ListByServer(ctx, id.ResourceGroup, *server.Name)
   783  		if err != nil {
   784  			return nil, err
   785  		}
   786  
   787  		for _, administrator := range *administrators.Value {
   788  			resources = append(resources, terraformutils.NewSimpleResource(
   789  				*administrator.ID,
   790  				*administrator.Name,
   791  				"azurerm_sql_active_directory_administrator",
   792  				g.ProviderName,
   793  				[]string{}))
   794  		}
   795  	}
   796  	return resources, nil
   797  }
   798  
   799  func (g *DatabasesGenerator) InitResources() error {
   800  	mariadbServers, err := g.getMariaDBServers()
   801  	if err != nil {
   802  		return err
   803  	}
   804  
   805  	mysqlServers, err := g.getMySQLServers()
   806  	if err != nil {
   807  		return err
   808  	}
   809  
   810  	postgresqlServers, err := g.getPostgreSQLServers()
   811  	if err != nil {
   812  		return err
   813  	}
   814  
   815  	sqlServers, err := g.getSQLServers()
   816  	if err != nil {
   817  		return err
   818  	}
   819  
   820  	mariadbFunctions := []func([]mariadb.Server) ([]terraformutils.Resource, error){
   821  		g.createMariaDBServerResources,
   822  		g.createMariaDBDatabaseResources,
   823  		g.createMariaDBConfigurationResources,
   824  		g.createMariaDBFirewallRuleResources,
   825  		g.createMariaDBVirtualNetworkRuleResources,
   826  	}
   827  
   828  	mysqlFunctions := []func([]mysql.Server) ([]terraformutils.Resource, error){
   829  		g.createMySQLServerResources,
   830  		g.createMySQLDatabaseResources,
   831  		g.createMySQLConfigurationResources,
   832  		g.createMySQLFirewallRuleResources,
   833  		g.createMySQLVirtualNetworkRuleResources,
   834  	}
   835  
   836  	postgresqlFunctions := []func([]postgresql.Server) ([]terraformutils.Resource, error){
   837  		g.createPostgreSQLServerResources,
   838  		g.createPostgreSQLDatabaseResources,
   839  		g.createPostgreSQLConfigurationResources,
   840  		g.createPostgreSQLFirewallRuleResources,
   841  		g.createPostgreSQLVirtualNetworkRuleResources,
   842  	}
   843  
   844  	sqlFunctions := []func([]sql.Server) ([]terraformutils.Resource, error){
   845  		g.createSQLServerResources,
   846  		g.createSQLDatabaseResources,
   847  		g.createSQLADAdministratorResources,
   848  		g.createSQLElasticPoolResources,
   849  		g.createSQLFailoverResources,
   850  		g.createSQLFirewallRuleResources,
   851  		g.createSQLVirtualNetworkRuleResources,
   852  	}
   853  
   854  	for _, f := range mariadbFunctions {
   855  		resources, err := f(mariadbServers)
   856  		if err != nil {
   857  			return err
   858  		}
   859  		g.Resources = append(g.Resources, resources...)
   860  	}
   861  
   862  	for _, f := range mysqlFunctions {
   863  		resources, err := f(mysqlServers)
   864  		if err != nil {
   865  			return err
   866  		}
   867  		g.Resources = append(g.Resources, resources...)
   868  	}
   869  
   870  	for _, f := range postgresqlFunctions {
   871  		resources, err := f(postgresqlServers)
   872  		if err != nil {
   873  			return err
   874  		}
   875  		g.Resources = append(g.Resources, resources...)
   876  	}
   877  
   878  	for _, f := range sqlFunctions {
   879  		resources, err := f(sqlServers)
   880  		if err != nil {
   881  			return err
   882  		}
   883  		g.Resources = append(g.Resources, resources...)
   884  	}
   885  
   886  	return nil
   887  }
   888  
   889  func (g *DatabasesGenerator) PostConvertHook() error {
   890  	dbEngines := []string{
   891  		"mariadb",
   892  		"mysql",
   893  		"postgresql",
   894  		"sql",
   895  	}
   896  
   897  	for _, engineName := range dbEngines {
   898  		for _, resource := range g.Resources {
   899  			dbServerResourceType := fmt.Sprintf("azurerm_%s_server", engineName)
   900  			if resource.InstanceInfo.Type == dbServerResourceType {
   901  				dbName := resource.Item["name"]
   902  				for rIdx, r := range g.Resources {
   903  					if r.InstanceInfo.Type != dbServerResourceType &&
   904  						strings.Contains(r.InstanceInfo.Type, engineName) &&
   905  						r.Item["server_name"] == dbName {
   906  						g.Resources[rIdx].Item["server_name"] = fmt.Sprintf("${%s.%s}", resource.InstanceInfo.Id, "name")
   907  					}
   908  				}
   909  			}
   910  		}
   911  	}
   912  
   913  	return nil
   914  }