Guest User

Untitled

a guest
Jul 11th, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import * as azure from "@pulumi/azure";
  2. import * as azuread from "@pulumi/azuread";
  3. import * as random from "@pulumi/random";
  4. import { AzureSqlServerResult, AzurePrincipalResult, AzureAdGroupResult } from "../AzureResources";
  5. import { Subscription, SubscriptionResources } from "../Subscription";
  6. import PulumiIdentity from "../PulumiIdentity";
  7. import { createApplicationWithPassword } from "..";
  8.  
  9. export type SqlServerReference = {
  10.     Name: string;
  11. } & Partial<SqlServer>;
  12.  
  13. export type SqlServer = {
  14.     Name: string;
  15.     ResourceGroupName: string;
  16.     Location: string;
  17.     ServerAdminName: string;
  18.     ServerAdminSecretName: string;
  19.     AzureAdminGroup: string;
  20.     AzureAdminName: string;
  21.     AzureAdminSecretName: string;
  22.     AzureAdminLogin: string;
  23. };
  24.  
  25. export const SqlServerDefaults = {
  26.     ServerAdminName: (name: string) => `${name}-admin`,
  27.     ServerAdminSecretName: (name: string) => `Db-${name}-ServerAdminPassword`,
  28.     AzureAdminName: (name: string) => `${name}-admin`,
  29.     AzureAdminSecretName: (name: string) => `Db-${name}-AzureAdminPassword`,
  30.     AzureAdminLogin: "sql-admin",
  31.     AzureAdminGroup: (name: string) => `SQL-Admins-${name}`,
  32. };
  33.  
  34. export type SqlServerResourceArgs = {
  35.     SqlServerArgs: {
  36.         name: string;
  37.         resourceGroupName: string;
  38.         location: string;
  39.         fullyQualifiedDomainName: string;
  40.     };
  41.     AdminGroupArgs: {
  42.         name: string;
  43.     }
  44.     SqlServerAdminArgs: {
  45.         displayName: string;
  46.     };
  47. };
  48.  
  49. export type SqlServerResources = {
  50.     SqlServer: AzureSqlServerResult;
  51.     AdminGroup: AzureAdGroupResult;
  52.     SqlServerAdmin: AzurePrincipalResult;
  53. } & SqlServer;
  54.  
  55. export type SqlServerResult = SqlServer & SqlServerResourceArgs & SqlServerResources;
  56.  
  57. const getSqlServerArgs = (args: SqlServerReference, subscription: Subscription): SqlServer & SqlServerResourceArgs => {
  58.  
  59.     let params: SqlServer = {
  60.         Name: args.Name,
  61.         ResourceGroupName: args.ResourceGroupName || subscription.ResourceGroupName,
  62.         Location: args.Location || subscription.DefaultLocation,
  63.         ServerAdminName: args.ServerAdminName || SqlServerDefaults.ServerAdminName(args.Name),
  64.         ServerAdminSecretName: args.ServerAdminSecretName || SqlServerDefaults.ServerAdminSecretName(args.Name),
  65.         AzureAdminGroup: args.AzureAdminGroup || SqlServerDefaults.AzureAdminGroup(args.Name),
  66.         AzureAdminName: args.AzureAdminName || SqlServerDefaults.AzureAdminName(args.Name),
  67.         AzureAdminSecretName: args.AzureAdminSecretName || SqlServerDefaults.AzureAdminSecretName(args.Name),
  68.         AzureAdminLogin: args.AzureAdminLogin || SqlServerDefaults.AzureAdminLogin
  69.     };
  70.  
  71.     return ({
  72.         ...params,
  73.         SqlServerArgs: {
  74.             name: params.Name,
  75.             resourceGroupName: params.ResourceGroupName,
  76.             location: params.Location,
  77.             fullyQualifiedDomainName: `${params.Name}.database.windows.net`
  78.         },
  79.         AdminGroupArgs: {
  80.             name: params.AzureAdminGroup
  81.         },
  82.         SqlServerAdminArgs: {
  83.             displayName: params.AzureAdminName
  84.         }
  85.     });
  86. };
  87.  
  88. export const getSqlServer = async (subscription: SubscriptionResources, database: SqlServerReference): Promise<SqlServerResult> => new Promise(async (resolve) => {
  89.  
  90.     let args = getSqlServerArgs(database, subscription);
  91.  
  92.     let principal = await azure.ad.getServicePrincipal(args.SqlServerAdminArgs);
  93.     let group = await azuread.getGroup(args.AdminGroupArgs);
  94.  
  95.     resolve({
  96.         ...args,
  97.         SqlServer: args.SqlServerArgs,
  98.         AdminGroup: group,
  99.         SqlServerAdmin: principal
  100.     });
  101. });
  102.  
  103. export const createSqlServer = async (subscription: SubscriptionResources, database: SqlServerReference): Promise<SqlServerResult> => new Promise(async (resolve) => {
  104.  
  105.     let args = getSqlServerArgs(database, subscription);
  106.  
  107.     const serverPassword = new random.RandomString(`Database-${args.Name}-Server-Password-Random`, { length: 64 });
  108.     new azure.keyvault.Secret(args.ServerAdminSecretName, {
  109.         name: args.ServerAdminSecretName,
  110.         contentType: "DB Server Admin Password",
  111.         keyVaultId: subscription.KeyVault.id,
  112.         value: serverPassword.result
  113.     });
  114.  
  115.     const sqlServer = new azure.sql.SqlServer(args.Name, {
  116.         name: args.Name,
  117.         resourceGroupName: args.ResourceGroupName,
  118.         location: args.Location,
  119.         version: "12.0",
  120.         administratorLogin: args.ServerAdminName,
  121.         administratorLoginPassword: serverPassword.result
  122.     });
  123.  
  124.     const group = new azuread.Group(args.AzureAdminGroup, args.AdminGroupArgs);
  125.  
  126.     const password = new random.RandomString(`Database-${args.Name}-Admin-Password-Random`, { length: 64 });
  127.     const principal = createApplicationWithPassword(args.AzureAdminName, password.result);
  128.     new azure.keyvault.Secret(args.AzureAdminSecretName, {
  129.         name: args.AzureAdminSecretName,
  130.         contentType: "DB Azure Admin Password",
  131.         keyVaultId: subscription.KeyVault.id,
  132.         value: principal.ServicePrincipalPassword.value
  133.     });
  134.  
  135.     new azure.sql.ActiveDirectoryAdministrator(args.AzureAdminGroup, {
  136.         login: args.AzureAdminGroup,
  137.         tenantId: PulumiIdentity.TenantId,
  138.         serverName: sqlServer.name,
  139.         resourceGroupName: sqlServer.resourceGroupName,
  140.         objectId: group.id
  141.     });
  142.  
  143.     new azure.sql.FirewallRule("sql-AllowAzureAccess", {
  144.         name: "sql-AllowAzureAccess",
  145.         serverName: sqlServer.name,
  146.         resourceGroupName: sqlServer.resourceGroupName,
  147.         startIpAddress: "0.0.0.0",
  148.         endIpAddress: "0.0.0.0"
  149.     });
  150.  
  151.     resolve({
  152.         ...args,
  153.         SqlServer: sqlServer,
  154.         AdminGroup: group,
  155.         SqlServerAdmin: principal.ServicePrincipal
  156.     })
  157. });
Advertisement
Add Comment
Please, Sign In to add comment