Friday, April 24, 2015

Find out Exchange or NSP Exchage Route providers in Azure PowerShell

########check if there is an active azure account#########

function Handle-AzureAccount () {

    try {

        $val=Test-AzureName –Service "MyNameService1" -errorvariable MyErr -erroraction Stop

    } catch {

        Add-AzureAccount

    }

}

 

########end check if there is an active azure account#########

 

 

Import-Module 'C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Azure.psd1'

Import-Module 'C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\ExpressRoute\ExpressRoute.psd1'

 

Handle-AzureAccount

 

$providers=Get-AzureDedicatedCircuitServiceProvider

 

#NSP providers Type="Telco" or Exchange providers Type="IXP"

for ($count=0; $count -lt $providers.Count; $count++){

    if ($providers[$count].Type -eq "Telco") {

        Write-Host "Name:" $providers[$count].Name

        Write-Host "Locations:" $providers[$count].DedicatedCircuitLocations

        $bandwidths=$providers[$count].DedicatedCircuitBandwidths

        for ($bdthCount=0;$bdthCount -lt $bandwidths.Count; $bdthCount++){

            Write-Host "Label:" $bandwidths[$bdthCount].Label "Bandwidth:" $bandwidths[$bdthCount].Bandwidth

        }

     }

}

 

Monday, April 20, 2015

Solve (cloud & network deployment pattern) a Parking Garage problem


Series:
·        Solve (Design OO model) a Parking Garage problem
·        Solve (UML representation OO model) a Parking Garage problem
·        Solve (app pattern) a Parking Garage problem
·        Solve (cloud & network deployment pattern) a Parking Garage problem

Solutions for Cloud is still evolving. But at the same time Cloud is old enough to document popular patterns and best practices.


Availability, Resiliency, and Fault Tolerance” among others are critical. For detail characteristics refer the above posts.

https://msdn.microsoft.com/en-us/library/dn600223.aspx captures some of the cloud design patterns. Retry pattern advises how to handle “Fault Tolerance.”

Health Endpoint Monitoring pattern assists in monitoring services which could be used to accomplish HA of the application.

Leader Election pattern guides about how to elect a leader for either communication or orchestrate a coordinated activity. NoSQL DBs leverage some of this technique. E.g. MongoDB/CountDB/Cassandara has cross data center data replication (which is transparent to user except the configuration.)

For HA:

·        The Application needs to be deployed in more than one region in Cloud.

·        It is inevitable.

·        HA across Cloud Provider is desirable too.

·        But it is not trivial to implement HA. Challenges such as User data sync/shrad/etc are imminent



Sunday, April 19, 2015

Solve (app pattern) a Parking Garage problem

Series:
·        Solve (Design OO model) a Parking Garage problem
·        Solve (UML representation OO model) a Parking Garage problem
·        Solve (app pattern) a Parking Garage problem
·        Solve (cloud & network deployment pattern) a Parking Garage problem

The architecture n-tier pattern in terms of presentation, business, and integration tiers for web application as identified in J2EE patterns could architect the application.

The document is publicly available at http://www.corej2eepatterns.com/

 

We are going to illustrate one Use Case i.e. Customer checking if there is an Available Parking Space. Please note that Customer is going to check the availability via a web app.

 

One could develop the webapp using the J2EE patterns. One could leverage one of the available frameworks such as Struts, Spring MVC, etc.

 

Here is the sequence diagram:

Simplified version.


There are numerous variations of this requirement such as the response type depends on the request content-type. For e.g. output response could be json, xml, etc. based on application/xml, etc. A framework could help already such as Spring’s MVC with Jackson core json package. Adapter pattern handles comes to rescue here.

 

Another scenario is introducing other kind of filters such as authentication. This could be accomplished by chain of responsibilities pattern.

 

Please note that AoP could help the above two scenarios.

 

Start simple there are lot to do.

Saturday, April 18, 2015

Solve (UML representation OO model) a Parking Garage problem

Series:
·        Solve (Design OO model) a Parking Garage problem
·        Solve (UML representation OO model) a Parking Garage problem
·        Solve (app pattern) a Parking Garage problem
·        Solve (cloud & network deployment pattern) a Parking Garage problem

We are going to create Structure Diagrams (Class, Object, Package), and Behavioral Diagrams (State, Sequence, Use Case) for the Parking Garage problem. Please let us follow KISS principle J We are not going to capture all the diagrams for the problem.

We will use n-tier application architecture.

Class diagram:


Use Case diagram:


Sequence diagram:

For Check Availability Use Case.


Package diagram:

The main packages of an n-tier architecture. There are util, etc. packages that is not captured here to keep the diagram simple.


 

State diagram:

There are two possible state



 

Friday, April 17, 2015

Solve (Design OO model) a Parking Garage problem

Series:
·        Solve (Design OO model) a Parking Garage problem
·        Solve (UML representation OO model) a Parking Garage problem
·        Solve (app pattern) a Parking Garage problem
·        Solve (cloud & network deployment pattern) a Parking Garage problem

Problem statement:

We are going to design the object model, a webapp, and a cloud deployment diagram to determine availability of parking space in a Parking garage using the design and architecture patterns.

A parking garage is a multi-level structure. It consists of parking levels which further comprises of parking space. A vehicle can be parked in one parking space. Each level and the garage have a Display Box. The Display Box shows if there available space or full.

This is a going to be a multi-part series. The current one will focus on Object Model. (It is a simplistic model for demonstration purpose only and the model.)

Let us design the OO model. We will use GoF design patterns.

 

Structural patterns:

·        Garage Object composes ParkingLevel Objects which further composes ParkingSpace Objects (composite.)

·        DisplayBox Object can have independent life thus DisplayBox Object has association relationship.

·        There are many ParkingSpace Objects which differs by insignificantly from one another (Flyweight)

Creational patterns:

·        There can be only one Garage Object (Singleton)

·        There can be only predefined level of ParkingLevel and ParkingSpace (Factory)

·        (Advance) We can have proxy Garage Objects if we want to centrally manage multiple Garages (proxy) – we are going to exclude this one for simplicity.        

Behavioral patterns:

·        We are going to instantiate objects out from classes (template)

·        We need to maintain state of the ParkingSpace Objects (state)

·        We need to iterate over ParkingSpaces for reasons such as finding out availability (iterator)

o   Alternatively we could have used Observer pattern to find out availability of parking spaces in a ParkingLevel and ultimately in a Gargage.

·        We need to aggregate ParkingSpace Objects(visitor)

·        We need to find out available space, reserve, etc. Garage Object it to rely on ParkingLevel which in turn relies on ParkingSpace (chain of responsibilities)

o   Alternatively we could have use Command pattern for delegation

Monday, April 6, 2015

Create a Demo env. in Azure using PowerShell (Create storage account, Cloud Service, VMS (in Availablity Set), load balanced set for HTTP, vnet, subnet; collect latest ubuntu image; assign static ip; stop vms; remove vms, subnet, vnet.)


Create a demo environment for the below deployment diagram:


###################Disclaimer########################################




# The script is provided ASIS. Feel free to modify as per your need #

#####################################################################
 
 

 
############################### USer Manual #####################

#The environment mentioned in the script has the followings:

#1. storage account: LRS

#2. Cloud Service (public url))

#3. Two VMS

# 3a. Picks up the latest stable Ubunutu images

# 3b. Sets up SSH on specific ports

#4. Availability Set

#5. Load balanced set for HTTP

#6. vnet and subnet

#7. assign static IP

#8. select default subscription and storage

#

#The script is idempotent...Run as many times you like...

#The script doesnt handle Transient Failures. Run multiple times as a workaround.

#

#Scripts prompts for:

#1. Set up an environment (*)

#2. Print Details of the environment

#3. Test High Availability of the environment

#4. Stop computation of the environment

#5. Tear Down the environment

#6. Perform all the above sequentially.

#(*) a web farm (2 web servies) in availability set, with load balanced set, in a cloud service, in a vnet, accessible over ssh.

############################### End USer Manual #####################
 
 

 
#####################Pre-requisite########

# 1. An Azure subscription

# 2. PowerShell

# 3. Putty or any SSH client

#####################End Pre-requisite########
 
 
clear screen




 
#global preference

#$ErrorActionPreference = "Stop"
 
 
$nl=[Environment]::NewLine




 
$bgcolor="Gray"

$fgcolor="Cyan"




 
###############################Set your variables##################################

# Set variables:
 
 
$prefixVariable='<initials>' #put in your initials

$cosVaraible='mycos' #put in company's initial

$workingDir='c:\dev\demo'




###############################(Optional) Set your variables##################################
 
 
$location = 'West US'

$adminname = 'MppUsWest1admin'

$adminpassword = 'MppUsWest1'

$ipaddressVnetRange='10.10.0.0/8'

$ipaddressSubNetRange='10.10.0.0/11'

$vm1IPAddress='10.10.0.2'

$vm2IPAddress='10.10.0.3'

$vm1SSHPublicPort='5001'

$vm2SSHPublicPort='5002'

$storageAccountType='Standard_LRS' #Standard_ZRS, Standard_GRS, Standard_RAGRS




###############################Set your variables##################################
 
 

 
$storageAccountName = "$prefixVariable$cosVaraible-test-storage"

$cloudsvcName = "$prefixVariable$cosVaraible-testapp-cs"

$vm1name = "$prefixVariable$cosVaraible-testapp-web-vm1"

$vm2name = "$prefixVariable$cosVaraible-testapp-web-vm2"

$vnetname = "$prefixVariable$cosVaraible-mycostest-vnet"

$subnetname = "$prefixVariable$cosVaraible-testapp-web-subnet"

$cloudappFQDN='.cloudapp.net'

$availabilitySetName="$prefixVariable$cosVaraible-myapptest-web-as"

$bkpFilePrefix="bkp$prefixVariable$cosVaraible"

$wipFilePrefix = "wip$prefixVariable$cosVaraible"




 
#vnet config string
 
 
$vnetString='<VirtualNetworkSite name="variable-vnetname" Location="variable-location">




<AddressSpace>

<AddressPrefix>variable-ipaddressvnetrange</AddressPrefix>

</AddressSpace>

<Subnets>

<Subnet name="variable-subnetname">

<AddressPrefix>variable-ipaddresssubnetrange</AddressPrefix>

</Subnet>

</Subnets>
 
 
</VirtualNetworkSite>';

$vnetString=$vnetString -replace "variable-vnetname", "$vnetname"

$vnetString=$vnetString -replace "variable-subnetname", "$subnetname"

$vnetString=$vnetString -replace "variable-ipaddressvnetrange", "$ipaddressVnetRange"

$vnetString=$vnetString -replace "variable-ipaddresssubnetrange", "$ipaddressSubNetRange"

$vnetString=$vnetString -replace "variable-location", "$location"




 
$vnetSampleString = '<?xml version="1.0" encoding="utf-8"?>




<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="ttp://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">

<VirtualNetworkConfiguration>

<Dns />

<VirtualNetworkSites>

<VirtualNetworkSite name="dpmycos-mycostest-vnet" Location="West US">

<AddressSpace>

<AddressPrefix>10.10.0.0/8</AddressPrefix>

</AddressSpace>

<Subnets>

<Subnet name="dpmycos-testapp-web-subnet">

<AddressPrefix>10.10.0.0/11</AddressPrefix>

</Subnet>

</Subnets>

</VirtualNetworkSite>

</VirtualNetworkSites>

</VirtualNetworkConfiguration>

</NetworkConfiguration>'
 
 



 
###################Display message########################
 
 
function Display-Message ($message, $message2) {

Display-Message_NoLineBreak $message, $message2

$nl



}
 
function Display-ErrorMessage ($myError) {

Write-Host "Error: $myError" -BackgroundColor Red -ForegroundColor $fgcolor

#Show-ErrorDetails

$Error.Clear();

$nl



}
 
function Display-Message_NoLineBreak ($message, $message2) {

if ($message2 -ne $null) {

Write-Host $message $message2 -BackgroundColor DarkBlue -ForegroundColor $fgcolor

} else {

Write-Host $message $message2 -BackgroundColor $bgcolor -ForegroundColor $fgcolor



}

}
 
####################End of Display message################
 
 

 
################Show Error Details#########################
 
 
function Show-ErrorDetails {

param (

$ErrorRecord = $Error[0]



)


 
$ErrorRecord | Format-List * -Force

$ErrorRecord.InvocationInfo | Format-List *

$Exception = $ErrorRecord.Exception

for ($depth=0; $Exception -ne $null; $depth++)



{
 
"$depth" * 80

$Exception | Format-List -Force *

$Exception = $Exception.InnerException



}

}
 
################end of Show-ErrorDetails###################
 
 

 
#################create VM##########################
 
 
function Create-VM ($sshport, $vmname, $ubuntuImageName, $adminpassword, $adminname, $subnetname, $vmIPAddress, $cloudsvcName, $vnetname, $location) {

Display-Message_NoLineBreak "Going to create vm:"

Display-Message_NoLineBreak "vmname: $vmname"

Display-Message_NoLineBreak "ubuntuImageName: $ubuntuImageName"

Display-Message_NoLineBreak "adminpassword: $adminpassword"

Display-Message_NoLineBreak "adminname: $adminname"

Display-Message_NoLineBreak "subnetname: $subnetname"

Display-Message_NoLineBreak "vmIPAddress: $vmIPAddress"

Display-Message_NoLineBreak "cloudsvcName: $cloudsvcName"

Display-Message_NoLineBreak "vnetname: $vnetname"

Display-Message_NoLineBreak "location: $location"

Display-Message_NoLineBreak "sshport: $sshport"

Pause

$vmObject=New-AzureVMConfig -Name "$vmname" -InstanceSize "Small" -ImageName "$ubuntuImageName" |`

Add-AzureProvisioningConfig -Linux -Password "$adminpassword" -LinuxUser "$adminname" -NoSSHEndPoint|`

Set-AzureSubnet -SubnetNames "$subnetname" |`

Set-AzureStaticVNetIP -IPAddress "$vmIPAddress" |`

Add-AzureEndpoint -LocalPort 22 -Name SSH -Protocol tcp -PublicPort "$sshport" | `

New-AzureVM –ServiceName "$cloudsvcName" -WaitForBoot -VNetName "$vnetname" -Location "$location"

return $vmObject



}
 
#################end of create VM###################
 
 

 
#################display usage of Ubuntu###########
 
 
function Display-UbuntuMessage () {

Display-Message_NoLineBreak 'After you connect to Ubuntu'

Display-Message_NoLineBreak '1. Accept the cert'

Display-Message_NoLineBreak '2. login'

Display-Message_NoLineBreak '3. sudo su -'

Display-Message_NoLineBreak '4. apt-get install apache2'

Display-Message_NoLineBreak '4a. Answer Y when prompted to continue'

Display-Message_NoLineBreak '5. ps -ef | grep apache'

Display-Message_NoLineBreak '6 echo `hostname` >> /var/www/index.html'

Display-Message_NoLineBreak '7. curl localhost'

Display-Message_NoLineBreak '8. validate some html content is displayed'



}
 
#################end display usage of Ubuntu###########
 
 

 
##################Collect User Response################
 
 
function Collect-UserResponse ($message) {

Display-ErrorMessage $message

Read-Host 'Press <Enter> to continue or Ctrl+C to Abort'



}
 
##################end of Collecting User Response######
 
 

 
##################collect latest Ubuntu image##########
 
 
function Collect-UbuntuImage() {

Display-Message "Going to collect the latest Ubuntu Stock Image Name..."

$latestUbuntuImage=Get-AzureVMImage | Select-Object * | Where-Object {$_.ImageName -like "*Ubuntu*LTS*"} | Where-Object {$_.ImageName -notlike "*Daily*"} | ort-Object {$_.PublishedDate} -Descending | Select-Object -First 1

$ubuntuImageName=$latestUbuntuImage.ImageName

Display-Message "Going to use the following Ubunut Stock Image: $ubuntuImageName"

return $ubuntuImageName



}
 
##################end of collect latest Ubuntu image###
 
 

 
##################handle vm creation workflow#########
 
 
function Handle-VMCreateWorkFlow ($sshport, $vmname, $ubuntuImageName, $adminpassword, $adminname, $subnetname, $vmIPAddress, $cloudsvcName, $vnetname, $location) {

try



{
 
$isError=$false

$vmObject=Get-AzureVM -ServiceName $cloudsvcName -Name $vmname

if (($vmObject) -ne $null) {

Collect-UserResponse "$vmname alread exists!!!"

$isError = $true



}


 
if (!$isError) {

$vmObject=Create-VM $sshport $vmname $ubuntuImageName $adminpassword $adminname $subnetname $vmIPAddress $cloudsvcName $vnetname $location




 
Display-Message "$vmname created: $vmObject"

Display-Message "Connect to Host:$cloudsvcName$cloudappFQDN on Port $sshport using $adminname/$adminpassword in Putty"

Display-UbuntuMessage

Read-Host 'Press <Enter> to continue....'



}
 
return $vmObject



}
 
catch



{
 
Display-ErrorMessage $Error

Collect-UserResponse "Error in creating $vmname...."



}

}
 
##################end of handle vm creation workflow###
 
 

 
##################handle Availability Set workflow##########
 
 
function Handle-AvailabilitySetCreateWorkFlow ($vmName) {

$vmObject=Get-AzureVM -ServiceName $cloudsvcName -Name $vmName

$vmAvailabilitySetName=$vmObject.AvailabilitySetName

if ($vmAvailabilitySetName -eq $null) {

Display-Message "Going to create availability set $availabilitySetName and attach VM $vmObject"

Set-AzureAvailabilitySet -AvailabilitySetName $availabilitySetName -VM $vmObject | Update-AzureVM

Display-Message "Availability set $availabilitySetName for VM $vmObject is all set."

} else {

Collect-UserResponse "$vmName is already all set with Avaialbility Set!!!"



}



}
 
##################end of handle Availability Set Workflow###
 
 

 
##########set vm Http end point#############
 
 
function Handle-HttpVMEndPoint ($vmName) {

$vmObject=get-azurevm -ServiceName $cloudsvcName -Name $vmname

$vmEP=Get-AzureEndpoint -VM $vmObject -Name HttpIn

if ($vmEP -eq $null) {

Display-Message "Going to set HttpIn port 80 on $vmName"

#Add-AzureEndpoint -LocalPort 80 -Name HttpIn -Protocol tcp -VM $vmObject -PublicPort 80| Update-AzureVM

Add-AzureEndpoint -DefaultProbe -LBSetName HttpLBSet -LocalPort 80 -Name HttpIn -Protocol tcp -VM $vmObject -PublicPort 80 | Update-AzureVM

Display-Message "HttpIn port 80 set on $vmName"

} else {

Collect-UserResponse "$vmName with HttpIn(Port 80) already exposed!!!"



}

}
 
##########end set vm Http end point#########
 
 

 
####################Prompt for a folder to be selected#########
 
 
function Pick-Working-Folder($message='Select a folder (work folder)', $path = "c:\") {

$object = New-Object -comObject Shell.Application




 
$folder = $object.BrowseForFolder(0, $message, 0, $path)

#if ($folder -ne $null) {

# $folder.self.Path

#}

return $folder.self.Path



}
 
####################end Prompt for a folder to be selected#########
 
 

 
#####################Handle V-Net Creation#########################
 
 
function Handle-VNet-Create ()



{
 
#Display-Message "(Sample)Full contnet of a vnet config file only with one VNet: $vnetSampleString"

Display-Message "NEw Vnet congiguration snippet: $vnetString"




 
#prompt for Working directory

$workingDirExist=Test-Path $workingDir

if (!$workingDirExist) {

$workingDir=Pick-Working-Folder



}
 
Display-Message "Working directory: $workingDir"

$timestamp=Get-Date -Format 'yyyy-MM-dd-HH-mm-s'

#$timestamp='xyz'

$exportFileName="$workingDir\$bkpFilePrefix$timestamp.xml"

$wipFileName="$workingDir\$wipFilePrefix$timestamp.xml"

#download current vnet config file and save it with a date and timestamp

Display-Message "Going to download the current vnet configuration..."

Get-AzureVNetConfig -ExportToFile $exportFileName

Display-Message "Existing vnet configuration saved on $exportFileName."

copy $exportFileName $wipFileName




 
#check to see if the config already exists

$createVnet = $false

$vnetConfigFileText=$null




 
$wipFileNameExist=Test-Path $wipFileName

$wipFileContent=Get-Content $wipFileName

$oneVNetExists=Get-Content $wipFileName | Select-String "<VirtualNetworkSites>"

$vnetAlreadyExists=Get-Content $wipFileName | Select-String $vnetname

$whatblock=$null

if (!$wipFileNameExist -or $wipFileContent.Length -eq 0){

$whatblock="file doesn't exist"

#no file exists

$vnetConfigFileText='<?xml version="1.0" encoding="utf-8"?>




<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="ttp://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">

<VirtualNetworkConfiguration>

<Dns />

<VirtualNetworkSites>'
 
 
$vnetConfigFileText="$vnetConfigFileText

$vnetString"

$vnetConfigFileText="$vnetConfigFileText




</VirtualNetworkSites>

</VirtualNetworkConfiguration>

</NetworkConfiguration>"
 
 
} elseif ($oneVNetExists -eq $null) {

$whatblock="No wrapper exist"

#if only the wrapper exists; a variant of if file nothing exists

$vnetStringToAdd="<VirtualNetworkSites>

$vnetString




</VirtualNetworkSites>

</VirtualNetworkConfiguration>

"
 
 
$vnetConfigFileText = [IO.File]::ReadAllText($wipFileName)

$vnetConfigFileText=$vnetConfigFileText -replace " </VirtualNetworkConfiguration>", "$vnetStringToAdd"

} elseif($vnetAlreadyExists -eq $null) {

$whatblock="add only $vnetname"

#edit the file and add the vnet config string

$vnetStringToAdd="$vnetString




</VirtualNetworkSites>"
 
 
$vnetConfigFileText = [IO.File]::ReadAllText($wipFileName)

$vnetConfigFileText=$vnetConfigFileText -replace "</VirtualNetworkSites>", "$vnetStringToAdd"





}


 
if ($whatblock -ne $null -or $whatblock.Length -ne 0) {

Display-Message "Final content of vnet confir file: $vnetConfigFileText"

Set-Content $wipFileName $vnetConfigFileText




 
#set vnet and subnect

Display-Message "Going to set the network config for $vnetname $subnetname..."

Set-AzureVNetConfig -ConfigurationPath $wipFileName

Display-Message "$vnetname with $subnetname is all set now."

} else {

Collect-UserResponse "VNet $vnetname already exists!!!"



}
 
Display-Message "End of Vnet creation function."



}
 
#####################End Handle V-Net Creation#########################
 
 

 
#####################Handle V-Net Removal#########################
 
 
function Handle-VNet-Remove ()



{
 
#download current vnet file

$timestamp=Get-Date -Format 'yyyy-MM-dd-HH-mm-s'

#$timestamp='xyz'

$exportFileName="$workingDir\$bkpFilePrefix$timestamp.xml"

$wipFileName="$workingDir\$wipFilePrefix$timestamp.xml"

#download current vnet config file and save it with a date and timestamp

Display-Message "Going to download the current vnet configuration..."

Get-AzureVNetConfig -ExportToFile $exportFileName

Display-Message "Existing vnet configuration saved on $exportFileName."

copy $exportFileName $wipFileName

$wipFileContent=Get-Content $wipFileName

#edit and remove the config string

$vnetConfigFileText = [IO.File]::ReadAllText($wipFileName)

Display-Message "vnetString: $vnetString"

Pause




 
[xml]$vnetConfigNodes = Get-Content $exportFileName

$vns=$vnetConfigNodes.NetworkConfiguration.VirtualNetworkConfiguration.VirtualNetworkSites.VirtualNetworkSite

foreach ($var in $vns) { if ($var.name -eq "$vnetname") {$vnetConfigNodes.NetworkConfiguration.VirtualNetworkConfiguration.VirtualNetworkSites.RemoveChild($var)}}

$vnetConfigNodes.Save($wipFileName)




 
#set vnet

Display-Message "Going to remove the network config for $vnetname $subnetname..."

Set-AzureVNetConfig -ConfigurationPath $wipFileName

Display-Message "$vnetname with $subnetname is removed now."




 
Display-Message "End of Vnet removal"



}
 
#####################End Handle V-Net Removal#########################
 
 

 
###############setup environment############
 
 
function Setup-Environment () {

try



{
 
#check if storage account exist

$isError = $false

if ((Test-AzureName -Storage $storageAccountName)) {

Collect-UserResponse "Storage Account already exists!!!"

$isError = $true



}


 
if (!$isError) {

#create storage account

Display-Message "Going to create storage account... $storageAccountName"

$myStorageAccount=New-AzureStorageAccount -StorageAccountName $storageAccountName -Location $location -Type $storageAccountType

Display-Message "Storage Account created: " $myStorageAccount.OperationStatus



}


 
#set default subscription and the storage account

Display-Message "Going to set the default Subscription"

Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccountName $storageAccountName

Display-Message "Default Subscription and Storage Account set"

#print the subscription

Display-Message "Going to print azure subscription."

Get-AzureSubscription

Pause




 
#Handle V-Net creation

Handle-VNet-Create






 
#check if cloud service already exists

if ((Test-AzureName -Service $cloudsvcName)) {

Collect-UserResponse "Cloud Service already exists!!!"

$isError = $true



}


 
if (!$isError) {

#create a cloud service

Display-Message "Going to create the cloud service $cloudsvcName..."

New-AzureService -Location $location -ServiceName $cloudsvcName -Description "$cloudsvcName Test"

Display-Message "Cloud service $cloudsvcName created."



}


 
#collect the latest Ubuntu image

Display-Message "Going to collect the latest Ubuntu Stock Image Name..."

$latestUbuntuImage=Get-AzureVMImage | Select-Object * | Where-Object {$_.ImageName -like "*Ubuntu*LTS*"} | Where-Object {$_.ImageName -notlike "*Daily*"} ort-Object {$_.PublishedDate} -Descending | Select-Object -First 1

$ubuntuImageName=$latestUbuntuImage.ImageName

Display-Message "Going to use the following Ubunut Stock Image: $ubuntuImageName"

#$ubuntuImageName=Collect-UbuntuImage

#Display-Message "ubuntuImageName: $ubuntuImageName"

Pause




 
#create VM1

$vm1=Handle-VMCreateWorkFlow $vm1SSHPublicPort $vm1name $ubuntuImageName $adminpassword $adminname $subnetname $vm1IPAddress $cloudsvcName $vnetname $location




 
#create VM2

$vm2=Handle-VMCreateWorkFlow $vm2SSHPublicPort $vm2name $ubuntuImageName $adminpassword $adminname $subnetname $vm2IPAddress $cloudsvcName $vnetname $location




 
#create/set availability set for vm1

Handle-AvailabilitySetCreateWorkFlow $vm1name

#create/set availability set for vm2

Handle-AvailabilitySetCreateWorkFlow $vm2name




 
#set HTTP End point for VM1

Handle-HttpVMEndPoint $vm1name

#set HTTP End point for VM2

Handle-HttpVMEndPoint $vm2name



}
 
catch



{
 
Display-ErrorMessage $Error



}
 
Display-Message "End of module Setup-Environment."



}
 
###############end up setup environment############
 
 

 
###############Test module#####################
 
 
function Test-Environment() {

try {

#Get VM1

$vm1=Get-AzureVM -ServiceName $cloudsvcName -Name $vm1name

if ($vm1.instanceStatus -ne "ReadyRole") {

$vmInstanceStatus=$vm1.instanceStatus

Display-Message "Current Status of $vm1name is $vmInstanceStatus. Thus starting the vm..."

Start-AzureVM -ServiceName $cloudsvcName -Name $vm1name

Display-Message "$vm1name started."



}
 
#Get VM2

$vm2=Get-AzureVM -ServiceName $cloudsvcName -Name $vm2name

if ($vm2.instanceStatus -ne "ReadyRole") {

$vmInstanceStatus=$vm2.instanceStatus

Display-Message "Current Status of $vm2name is $vmInstanceStatus. Thus starting the vm..."

Start-AzureVM -ServiceName $cloudsvcName -Name $vm2name

Display-Message "$vm2name started."



}


 
#open browser

Display-Message "Going to Launch IE and browse to http://$cloudsvcName$cloudappFQDN?v=123..."

$ie = new-object -comobject "InternetExplorer.Application"

$ie.visible = $true

$ie.navigate("http://$cloudsvcName$cloudappFQDN\?v=123")

Display-Message "Browser launched to http://$cloudsvcName$cloudappFQDN?v=123..."

$useresponseVMUsed=Read-Host 'Select which VM do you see: vm1(1) vm2(2) followed by <Enter> [default vm1(1)]'

if ($useresponseVMUsed -eq $null -or $useresponseVMUsed.Length -eq 0) {

$useresponseVMUsed="1"



}
 
$vmtostop=$vm1name

if ($useresponseVMUsed -eq "2") {

$vmtostop=$vm2name



}
 
Display-Message "Going to stop $vmtostop..."

Stop-AzureVM -ServiceName $cloudsvcName -Name $vmtostop

Display-Message "$vmtostop stopped."




 
Display-Message "Refresh the page again in the Browser"



}
 
catch



{
 
Display-ErrorMessage $Error



}
 
Display-Message "End of module Test-Environment."



}
 
###############end of Test module#####################
 
 

 
################stop vm module###########################
 
 
function Stop-Environment() {

Display-Message "Going to stop the VMs..."

Stop-AzureVM -ServiceName $cloudsvcName -Name * -Force

Display-Message "All VMs for the $cloudsvcName stopped."

Display-Message "End of module Stop-Environment."



}
 
################end stop vm module#######################
 
 

 
################tear down the setup##########################
 
 
function Tear-Environment() {

#remove VMs

Display-Message "Going to remove $vm1name..."

Remove-AzureVM -ServiceName $cloudsvcName $vm1name -DeleteVHD -Verbose

Display-Message "Removed $vm1name."

Pause

Display-Message "Going to remove $vm2name..."

Remove-AzureVM -ServiceName $cloudsvcName $vm2name -DeleteVHD -Verbose

Display-Message "Removed $vm2name."

Pause

#remove storage account

Display-Message "Going to remove storage account $storageAccountName..."

Remove-AzureStorageAccount -StorageAccountName $storageAccountName -Verbose

Display-Message "Removed $storageAccountName."

Pause

#remove cloud service

Display-Message "Going to remove Cloud Service $cloudsvcName..."

Remove-AzureService -ServiceName $cloudsvcName -Force -Verbose

Display-Message "Removed $storageAccountName."

Pause




 
#remove VNet

Handle-VNet-Remove

Pause

Display-Message "End of module TearDown-Environment."



}
 
################end tear down the setup######################
 
 

 
################print Environment####################
 
 
function Print-Environment() {

Display-Message_NoLineBreak "Storage Account Name:" $storageAccountName

Display-Message_NoLineBreak "Default Subscription:" $subscriptionName

Display-Message_NoLineBreak "Cloud Service/Public dns name: $cloudsvcName$cloudappFQDN"

Display-Message_NoLineBreak "VM1 SSH access $cloudsvcName$cloudappFQDN : $vm1SSHPublicPort"

Display-Message_NoLineBreak "VM2 SSH access $cloudsvcName$cloudappFQDN : $vm2SSHPublicPort"

Display-Message_NoLineBreak "VM1 name: $vm1name"

Display-Message_NoLineBreak "VM2 name: $vm2name"

Display-Message_NoLineBreak "Availability Set name: $availabilitySetName"

Display-Message_NoLineBreak "Vnet name: $vnetname"

Display-Message_NoLineBreak "Subnet name: $subnetname"

Display-Message "End of module Print-Environment."



}
 
################end print Environment####################
 
 

 
#######check if there is an active azure account#########
 
 
function Handle-AzureAccount () {

$currentAzureAccount=Get-AzureAccount

if ($currentAzureAccount -eq $null) {

Add-AzureAccount



}

}
 
########end check if there is an active azure account#########
 
 



 
#add your account
 
 
Display-Message "Going to add account..."




Handle-AzureAccount
 
 
Display-Message "Added account."






 
#ensure that you are in service management mode
 
 
Display-Message "Going to switch to service management mode..."

Switch-AzureMode -Name AzureServiceManagement

Display-Message "Switched to service management mode."






 
###########Find default subscription##########
 
 
$subscriptionName = ""

foreach ($sub in Get-AzureSubscription)



{
 
if ($sub.IsDefault -eq "True")



{
 
$subscriptionName = $sub.SubscriptionName



}

}
 
Display-Message "Default Subscription:" $subscriptionName




Pause
 
 
################################
 
 



 
#cleanse the storage account name
 
 
$storageAccountName = [Regex]::Replace($storageAccountName.ToLower(), '[^(a-z0-9)]', '')

Display-Message "Storage Account Name:" $storageAccountName




 
#modularize it.
 
 
$collectModule=Read-Host 'Select Setup(1), Print (2), Test(3), Stop VMs (4), Tear Down (5), or All (6) followed by <Enter> [default All(6)]'

if ($collectModule -eq $null -or $collectModule.Length -eq 0) {

$collectModule="6"



}
 
Display-Message "You have selected $collectModule"




 
$confirmStatus=Read-Host 'Are you sure you want to continue Yes(1)/No(2) followed by <Enter> [default No(2)]'

if ($confirmStatus -eq $null -or $confirmStatus.Length -eq 0) {

$confirmStatus="2"



}


 
if ($confirmStatus -eq "2") {

Display-Message "Good Bye!!!"

break;



}


 
switch($collectModule) {

1 {Setup-Environment

break



}
 
2 {Print-Environment

break



}
 
3 {Test-Environment

break



}
 
4 {Stop-Environment

break



}
 
5 {Tear-Environment

break



}
 
6 {

Setup-Environment

Print-Environment

Pause

Test-Environment

Pause

Stop-Environment

Pause

Tear-Environment

break



}
 
default {"Invalid module"}



}