package com.sequenceiq.cloudbreak.cloud.azure.client; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import com.microsoft.azure.AzureEnvironment; import com.microsoft.azure.PagedList; import com.microsoft.azure.credentials.ApplicationTokenCredentials; import com.microsoft.azure.management.Azure; import com.microsoft.azure.management.compute.AvailabilitySet; import com.microsoft.azure.management.compute.PowerState; import com.microsoft.azure.management.compute.VirtualMachine; import com.microsoft.azure.management.compute.VirtualMachineInstanceView; import com.microsoft.azure.management.network.LoadBalancer; import com.microsoft.azure.management.network.NetworkInterface; import com.microsoft.azure.management.network.NetworkInterfaces; import com.microsoft.azure.management.network.NetworkSecurityGroup; import com.microsoft.azure.management.network.PublicIPAddress; import com.microsoft.azure.management.network.Subnet; import com.microsoft.azure.management.resources.Deployment; import com.microsoft.azure.management.resources.DeploymentMode; import com.microsoft.azure.management.resources.DeploymentOperations; import com.microsoft.azure.management.resources.Deployments; import com.microsoft.azure.management.resources.ResourceGroup; import com.microsoft.azure.management.resources.ResourceGroups; import com.microsoft.azure.management.storage.ProvisioningState; import com.microsoft.azure.management.storage.SkuName; import com.microsoft.azure.management.storage.StorageAccount; import com.microsoft.azure.management.storage.StorageAccountKey; import com.microsoft.azure.management.storage.StorageAccounts; import com.microsoft.azure.storage.CloudStorageAccount; import com.microsoft.azure.storage.blob.BlobContainerPermissions; import com.microsoft.azure.storage.blob.BlobContainerPublicAccessType; import com.microsoft.azure.storage.blob.CloudBlobClient; import com.microsoft.azure.storage.blob.CloudBlobContainer; import com.microsoft.azure.storage.blob.CloudBlockBlob; import com.microsoft.azure.storage.blob.CloudPageBlob; import com.microsoft.azure.storage.blob.CopyState; import com.microsoft.azure.storage.blob.ListBlobItem; import com.microsoft.rest.LogLevel; public class AzureClient { private Azure azure; private String tenantId; private String clientId; private String secretKey; private String subscriptionId; public AzureClient(String tenantId, String clientId, String secretKey, String subscriptionId) throws IOException { this.tenantId = tenantId; this.clientId = clientId; this.secretKey = secretKey; this.subscriptionId = subscriptionId; connect(); } private void connect() throws IOException { ApplicationTokenCredentials creds = new ApplicationTokenCredentials(clientId, tenantId, secretKey, AzureEnvironment.AZURE) .withDefaultSubscriptionId(subscriptionId); azure = Azure .configure() .withLogLevel(LogLevel.BASIC) .authenticate(creds) .withSubscription(subscriptionId); } public ResourceGroup getResourceGroup(String name) { return azure.resourceGroups().getByName(name); } public ResourceGroups getResourceGroups() { return azure.resourceGroups(); } public boolean resourceGroupExists(String name) { return getResourceGroups().checkExistence(name); } public void deleteResourceGroup(String name) { azure.resourceGroups().deleteByName(name); } public ResourceGroup createResourceGroup(String name, String region) { return azure.resourceGroups().define(name) .withRegion(region) .create(); } public Deployment createTemplateDeployment(String resourceGroupName, String deploymentName, String templateContent, String parameterContent) throws IOException { return azure.deployments().define(deploymentName) .withExistingResourceGroup(resourceGroupName) .withTemplate(templateContent) .withParameters(parameterContent) .withMode(DeploymentMode.INCREMENTAL) .create(); } public void deleteTemplateDeployment(String resourceGroupName, String deploymentName) { azure.deployments().deleteByResourceGroup(resourceGroupName, deploymentName); } public Deployment getTemplateDeployment(String resourceGroupName, String deploymentName) { return azure.deployments().getByResourceGroup(resourceGroupName, deploymentName); } public DeploymentOperations getTemplateDeploymentOperations(String resourceGroupName, String deploymentName) { return azure.deployments().getByResourceGroup(resourceGroupName, deploymentName).deploymentOperations(); } public void cancelTemplateDeployments(String resourceGroupName, String deploymentName) { azure.deployments().getByResourceGroup(resourceGroupName, deploymentName).cancel(); } public Deployments getTemplateDeployments(String resourceGroupName) { return azure.deployments(); } public StorageAccounts getStorageAccounts() { return azure.storageAccounts(); } public PagedList<StorageAccount> getStorageAccountsForResourceGroup(String resourceGroup) { return azure.storageAccounts().listByResourceGroup(resourceGroup); } public void deleteStorageAccount(String resourceGroup, String storageName) { azure.storageAccounts().deleteByResourceGroup(resourceGroup, storageName); } public StorageAccount createStorageAccount(String resourceGroup, String storageName, String storageLocation, SkuName accType) { return azure.storageAccounts() .define(storageName) .withRegion(storageLocation) .withExistingResourceGroup(resourceGroup) .withSku(accType) .create(); } public List<StorageAccountKey> getStorageAccountKeys(String resourceGroup, String storageName) { return getStorageAccountByGroup(resourceGroup, storageName).getKeys(); } public ProvisioningState getStorageStatus(String resourceGroup, String storageName) { return getStorageAccountByGroup(resourceGroup, storageName).provisioningState(); } public StorageAccount getStorageAccountByGroup(String resourceGroup, String storageName) { return azure.storageAccounts().getByResourceGroup(resourceGroup, storageName); } public void deleteContainerInStorage(String resourceGroup, String storageName, String containerName) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); container.deleteIfExists(); } public void deleteBlobInStorageContainer(String resourceGroup, String storageName, String containerName, String blobName) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); CloudBlockBlob blob = container.getBlockBlobReference(blobName); blob.deleteIfExists(); } public void createContainerInStorage(String resourceGroup, String storageName, String containerName) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); container.createIfNotExists(); setPublicPermissionOnContainer(resourceGroup, storageName, containerName); } public void setPublicPermissionOnContainer(String resourceGroup, String storageName, String containerName) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER); container.uploadPermissions(containerPermissions); } public String copyImageBlobInStorageContainer(String resourceGroup, String storageName, String containerName, String sourceBlob) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); CloudPageBlob cloudPageBlob = container.getPageBlobReference(sourceBlob.substring(sourceBlob.lastIndexOf("/") + 1)); return cloudPageBlob.startCopy(new URI(sourceBlob)); } public CopyState getCopyStatus(String resourceGroup, String storageName, String containerName, String sourceBlob) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); CloudPageBlob cloudPageBlob = container.getPageBlobReference(sourceBlob.substring(sourceBlob.lastIndexOf("/") + 1)); container.downloadAttributes(); cloudPageBlob.downloadAttributes(); return cloudPageBlob.getCopyState(); } public List<ListBlobItem> listBlobInStorage(String resourceGroup, String storageName, String containerName) throws Exception { CloudBlobContainer container = getBlobContainer(resourceGroup, storageName, containerName); List<ListBlobItem> targetCollection = new ArrayList<ListBlobItem>(); container.listBlobs().iterator().forEachRemaining(targetCollection::add); return targetCollection; } public CloudBlobContainer getBlobContainer(String resourceGroup, String storageName, String containerName) throws Exception { List<StorageAccountKey> keys = getStorageAccountKeys(resourceGroup, storageName); String storageConnectionString = String.format("DefaultEndpointsProtocol=http;AccountName=%s;AccountKey=%s", storageName, keys.get(0).value()); CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString); CloudBlobClient blobClient = storageAccount.createCloudBlobClient(); CloudBlobContainer container = blobClient.getContainerReference(containerName); return container; } public PagedList<VirtualMachine> getVirtualMachines(String resourceGroup) { return azure.virtualMachines().listByResourceGroup(resourceGroup); } public VirtualMachine getVirtualMachine(String resourceGroup, String vmName) { return azure.virtualMachines().getByResourceGroup(resourceGroup, vmName); } public PowerState getVirtualMachinePowerState(String resourceGroup, String vmName) { return getVirtualMachine(resourceGroup, vmName).powerState(); } public VirtualMachineInstanceView getVirtualMachineInstanceView(String resourceGroup, String vmName) { return getVirtualMachine(resourceGroup, vmName).instanceView(); } public Integer getFaultDomainNumber(String resourceGroup, String vmName) { return getVirtualMachineInstanceView(resourceGroup, vmName).platformFaultDomain(); } public Integer getUpdateDomainNumber(String resourceGroup, String vmName) { return getVirtualMachineInstanceView(resourceGroup, vmName).platformUpdateDomain(); } public AvailabilitySet getAvailabilitySet(String resourceGroup, String asName) { return azure.availabilitySets().getByResourceGroup(resourceGroup, asName); } public void deleteAvailabilitySet(String resourceGroup, String asName) { azure.availabilitySets().deleteByResourceGroup(resourceGroup, asName); } public void deallocateVirtualMachine(String resourceGroup, String vmName) { azure.virtualMachines().deallocate(resourceGroup, vmName); } public void deleteVirtualMachine(String resourceGroup, String vmName) { String id = getVirtualMachine(resourceGroup, vmName).id(); azure.virtualMachines().deleteById(id); } public void startVirtualMachine(String resourceGroup, String vmName) { azure.virtualMachines().start(resourceGroup, vmName); } public void stopVirtualMachine(String resourceGroup, String vmName) { azure.virtualMachines().powerOff(resourceGroup, vmName); } public void deletePublicIpAddressByName(String resourceGroup, String ipName) { String id = getPublicIpAddress(resourceGroup, ipName).id(); azure.publicIPAddresses().deleteById(id); } public void deletePublicIpAddressById(String ipId) { azure.publicIPAddresses().deleteById(ipId); } public PublicIPAddress getPublicIpAddress(String resourceGroup, String ipName) { return azure.publicIPAddresses().getByResourceGroup(resourceGroup, ipName); } public PagedList<PublicIPAddress> getPublicIpAddresses(String resourceGroup) { return azure.publicIPAddresses().listByResourceGroup(resourceGroup); } public PublicIPAddress getPublicIpAddressById(String ipId) { return azure.publicIPAddresses().getById(ipId); } public void deleteNetworkInterface(String resourceGroup, String networkInterfaceName) { azure.networkInterfaces().deleteByResourceGroup(resourceGroup, networkInterfaceName); } public NetworkInterface getNetworkInterface(String resourceGroup, String networkInterfaceName) { return azure.networkInterfaces().getByResourceGroup(resourceGroup, networkInterfaceName); } public NetworkInterface getNetworkInterfaceById(String networkInterfaceId) { return azure.networkInterfaces().getById(networkInterfaceId); } public NetworkInterfaces getNetworkInterfaces(String resourceGroup) { return azure.networkInterfaces(); } public Subnet getSubnetProperties(String resourceGroup, String virtualNetwork, String subnet) { return azure.networks().getByResourceGroup(resourceGroup, virtualNetwork).subnets().get(subnet); } public NetworkSecurityGroup getSecurityGroupProperties(String resourceGroup, String securityGroup) { return azure.networkSecurityGroups().getByResourceGroup(resourceGroup, securityGroup); } public LoadBalancer getLoadBalancer(String name, String loadBalancerName) { return azure.loadBalancers().getByResourceGroup(name, loadBalancerName); } public List<String> getLoadBalancerIps(String name, String loadBalancerName) { List<String> ipList = new ArrayList<String>(); List<String> publicIpAddressIds = getLoadBalancer(name, loadBalancerName).publicIPAddressIds(); for (String publicIpAddressId : publicIpAddressIds) { PublicIPAddress publicIpAddress = getPublicIpAddressById(publicIpAddressId); ipList.add(publicIpAddress.ipAddress()); } return ipList; } }