The Azure Stack TP3 Deployment Experience

Friday , 3, March 2017 3 Comments

This is a bit of a non-blog, as the TP3 deployment experience is utterly joyous. It deployed first try for me, taking around four hours from start to completion, with no errors logged. I happened to screenshot the process, so here it is in all its glory 🙂

In order to deploy the PoC, I followed the documentation at https://docs.microsoft.com/en-us/azure/azure-stack/azure-stack-deploy

Download and run the PoC Downloader. It’s highly recommended that you tick the ‘Download the Windows Server 2016 EVAL (ISO)’ box so you can get something added to the marketplace once it’s deployed.

-Z Azure Stack POC Downloader Download the Azure Stack Proof of Concept (POC) Notice Privacy Notice Microsoft automatically collects usage and performance data over the internet ("Data"). This feature is on by default. You can turn off this feature by following the instructions http://go_microsott.com/fwIink/?LinkID=699582_ For more information about Data collection please see Microsoft Azure Stack POC Privacy Statement at http://go.microsoft.com/fwIink/?LinkID=692023_ 1. Read the deployment prerequisites 2. Choose a build @ Technical Preview (release build) version 20170225.2 C) Technical Preview (in-development build) What's the difference? 3. Optional: Windows Server 2016 EVAL Download the Windows Server 2016 EVAL (ISO) Once Azure Stock has been deployed, this ISO can be used to add an image to the Azure Stack Marketplace. Note: This Windows Server Evaluation image may only be used with Microsoft Azure Stack Proof of Concept and is subject to the Microsoft Azure Stack Proof of Concept license terms. 4. Browse to where you want to save the build Space required: 15.07 Ga Download 5. Cancel

The PoC Downloader will download the PoC.

Azure Stack POC Downloader Download the Azure Stack Proof of Concept (POC) The download is in progress. Downloading Microsoft Azure Stack POC (release build) version 20170225.2. Transferred: 9.27 GB Remaining: 5.8 Ga Estimated time left: Cancel Details... Privacy Notice Pause

You will need to have at least 85GB of storage to extract the downloaded files, which you can extract by clicking the ‘Run’ button once download has completed.

Azure Stack POC Downloader Download the Azure Stack Proof of Concept (POC) Privacy Notice The download has completed and was saved here. Close the window to exit, or click Run to run the Azure Stack POC self-extractor. The Azure Stack POC self-extractor will guide you through the next steps of the installation process. Run

The extractor extracts a VHDX file from which we will boot and run a whole Azure Stack environment. One file to worry about – so simple, even I can’t mess it up.

Setup - Microsoft Azure Stack POC Please vvait while Setup extracts Microsoft Azure Stack POC on your computer. Extracting files. C : user a tor DesktopVvIicr o so ft Azure Stack POC CloudBuiIder. vhdx

Setup - Microsoft Azure Stack POC Completing the Microsoft Azure Stack POC Setup Wizard Setup has finished extracting Microsoft Azure Stack POC on your compu ter Click Finish to exit Setup.

Once extracted, copy the CloudBuilder.vhdx file to the root of your host’s C: drive.

The documented PowerShell below will download preparatory files you need, so blindly copy it into PowerShell ISE and run it 🙂

 

# Variables
$Uri = 'https://raw.githubusercontent.com/Azure/AzureStack-Tools/master/Deployment/'
$LocalPath = 'c:\AzureStack_SupportFiles'

# Create folder
New-Item $LocalPath -type directory

# Download files
( 'BootMenuNoKVM.ps1', 'PrepareBootFromVHD.ps1', 'Unattend.xml', 'unattend_NoKVM.xml') | foreach { Invoke-WebRequest ($uri + $_) -OutFile ($LocalPath + '\' + $_) }

The next step is the same as TP2, run the PrepareBootFromVHD PowerShell script to set the BCDBoot entry to allow the host to reboot into the CloudBuilder VHDX. Apply an Unattend file if you don’t have console access to the host. Or don’t, I’m not your boss.

Administrator: Windows PowerSheII PS C: DIR Di rectory: C: \ Azu restack_SupportFi les Mode LastWriteTime 01/03/2017 01/03/2017 01/03/2017 01/03/2017 17 17 17 17 Length 2611 8698 1684 3788 Name BootMenuNoKVM. PSI PrepareBootF romVHD. PSI Unattend . xml unattend NOKVM. xml PS . \prepareBootFromVHD. PSI -CloudBui1derDi skpath "c: oudBui1der. vhdx" -Applyunattend password for the local administrator account of the Azure Stack host. g password will be configured for the local administrator Requi res 6 characters minimum: account of the Azure Stack host: rea Ing new boot entry for Cloud8ui1der. vhdx Running command: bcdboot I : \windows Boot files successfully created. updating descri ption for the boot entry Descri pti on: Wi ndows Server 2016 Devi ce: partiti on—I: bcdedit /set " {default}" description "Azure Stack" The operation completed successfully. Confi rm Are you sure you want to perform this action? performing the operation "Enable the Local shutdown (AS-Base) " [Y] Yes [A] Yes to All [N] NO [L] NO to All access rights and Suspend [?] Help restart the (default is computer. " on target "local host

Once you’ve rebooted into the CloudBuilder VHDX and logged in using the password you provided when applying the Unattend file, run through the same steps as you would have in TP2.

If not using DHCP, set a static IP on the host.

If you’re anywhere other than UTC-8, set a time server.

Rename the host.

Reboot.

Disable all NICs other than the NIC that provides internet connectivity.

Actually I haven’t validated the last step – it was necessary in TP1 and TP2, but I’m pretty certain I saw the deployment script checking for the correct NIC to use while it was installing. Let’s check…

326 327 328 329 330 331 Car ray) Sn etwor kConfi gur ati on if (Sn etwor kConfi gur ati on . Count Get - NetlPConfi gur ation 1) -gt . NetAdapter . Status - EQ thr ow SLocaI i zedData. Mor eThanOneNi cEnabI ed

Yep, DeploySingleNode.ps1, lines 326 to 331 – only one NIC is allowed to be enabled still, so let’s disable all the other NICs.

Network Connections Control Panel Organize NICI Disabled Network and Internet Disabled Network Connections Search Network Connecti Network Intel(R) Gigabit X520/13iO rNDC NIC4 Disabled Intel(R) Gigabit X520/13iO rND... Intel(R) Ethernet IOG4PX520/13SO.„ SLOT 2 Di sabled Mellanox ConnectX-3 Pro Etherne... Intel(R) Ethernet IOG4PX520/13SO... SLOT 2 2 Disabled Mellanox ConnectX-3 Pro Etherne...

Ok! So in this environment I’ve not got DHCP available so we need to set a Static IP, for this lab I’m using 10.20.39.124. Here are the steps to kick off deployment from an elevated PowerShell window. NOTE: Do not use PowerShell ISE for this – if you do, it may lead to fuckery.

cd C:\CloudDeployment\Setup

$adminpass = ConvertTo-SecureString “Local Admin Password” -AsPlainText -Force

$aadpass = ConvertTo-SecureString “Azure AD Account Password” -AsPlainText -Force

$aadcred = New-Object System.Management.Automation.PSCredential (“AAD account email address“, $aadpass)

.\InstallAzureStackPOC.ps1 -AdminPassword $adminpass -InfraAzureDirectoryTenantAdminCredential $aadcred -NatIPv4Subnet 10.20.39.0/24 -NatIPv4Address 10.20.39.124 -NatIPv4DefaultGateway 10.20.39.1 -TimeServer sometimeserver

This is a slight change from TP2, with -AADCredential being renamed to -InfraAzureDirectoryTenantAdminCredential, which just rolls off the tongue :/

Deployment kicks off, and you pretty much wait for four hours. This is also a slight change from TP1 and TP2, with the ‘Cross Fingers and Pray to the Old Gods and the New’ step now being notably absent as everything just works.

Administrator: Windows PowerSheII RARNING: T e names o some 1 mporte comman s rom t e 110 u •e Fa r 1 cR1ngApp11cat10ns Inc •u e unapprove ver s t at ight make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with Action ' Depl oyment ' Running action plan.. Phase O - Confi gure physical machine and external networking Step O - Deploy and confi gure physical machines, 8GP and NAT Task Cloud - Depl oyment- Phas eo- Depl oy8ar etal And8GPAndNAT Running action Action ' Depl oyment-PhaseO-DepI And8GPAndNAT ' Running action plan. 1000000000000 (DE?) Validate Physical Machi nes step 0.12 - Validating the hardware and OS confi guration on the physical nodes . Task CI - Validate Running interface t e Ver ose parameter. For a 1 st approve ver s , type Get-Ver . 3 1 2017 ARNING: The names of some imported commands from the module 'ACS8cdr' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module connand again with the Verbose parameter. For a list of approved verbs, type Get-Verb. - 3/1/2017 ARNING: The names of some imported commands from the module 'ACS' include unapproved verbs that might make then less discoverable. To find the connands with unapproved verbs, run the Import-Module conmand again with the Verbose parameter. For a list of approved verbs, type Get-Verb. - 3/1/2017 ARNING: The names of some imported connands from the module '800tArtifactsHeIper' include unapproved verbs that might ake them less discoverable. To find the commands with unapproved verbs, run the Import-Module connand again with the erbose parameter. For a list of approved verbs, type Get-Verb. — 3/1/2017 5 : 44: 46 ARNING: The names of some imported commands from the module 'JeaHeIper' include unapproved verbs that might make them less discoverable. To find the connands with unapproved verbs, run the Import-Module conmand again with the Verbose parameter. For a list of approved verbs, type Get-Verb. — 3/1/2017 5 : 44: 46 ARNING: The names of some imported connands from the module 'UpdatePhysicaIMachineHeIper' include unapproved verbs hat might make then less discoverable. To find the commands with unapproved verbs, run the Import-Module connand again with the Verbose parameter. For a list of approved verbs, type Get-Verb. — 3/1/2017 5 : 44: 46 ARNING: The names of some imported commands from the module 'UpdateNC' include unapproved verbs that might make them less discoverable. To find the connands with unapproved verbs, run the Import-Module conmand again with the Verbose parameter. For a list of approved verbs, type Get-Verb. — 3/1/2017 5 : 44: 46 ARNING: The names of some imported connands from the module 'PhysicalMachines' include unapproved verbs that might ake them less discoverable. To find the commands with unapproved verbs, run the Import-Module connand again with the erbose parameter. For a list of approved verbs, type Get-Verb. — 3/1/2017 5 : 44: 46 ER80SE : ER80SE : ER80SE : ER80SE : ARNING: ER80SE : ER80SE : Setting IP addresses. — 3/1/2017 5 : 44: 46 Normalizing MAC address '24-6E-96-02-46-2C' . — 3/1/2017 5 : 44: 46 Choosing an address from 'Management' in range '192.168. 200. 65/24' . — 3/1/2017 5 : 44: 46 Find out which NICs are able to connect on each node. - 3/1/2017 Ping to 192.168.100.4 failed Status: TimedOut - 3/1/2017 PM - AS-HOST storagel - 3/1/2017 PM + AS-FOST Deployment - 3/1/2017 5:45 PM
Action ' Depl oyment ' Running action plan. . Step O - phase O - Configure physical machine and external networking Deploy and configure physical machines, BGP and NAT Task Cloud Dep 1 oyment -phas eO-Dep 1 oyBareMeta1 AndBGPAndNAT Running action Action ' Depl oyment-phaseO-Dep1 oyBareMeta1AndBGPAndNAT ' Running action plan. Coooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo Step 0.20 (S TO) Configure Storage Cluster Create storage cluster, create a storage pool and file server. Task Cloud \ Infrastructure\storage Depl oyment Runni ng NARNING: The names of NARNING: The names of Import-Module command NARNING: The names of NARNING: The names of NARNING: The names of NARNING: The names of Import-Module command NARNING: The names of Import-Module command NARNING: The names of NARNING: The names of interface some imported commands from the module 'FabricRingApp1ications ' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 PM some imported commands from the module 'ACSB10b ' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 PM some imported commands from the module 'FabricRingApp1ications ' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM some imported commands from the module 'FabricRingApp1ications ' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM some imported commands from the module 'FabricRingApp1ications ' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM some imported commands from the module 'ACSBcdr' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM some imported commands from the module 'ACS' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM some imported commands from the module 'BootArtifactsHe1per' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 PM some imported commands from the module 'JeaHe1per' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM NARNING: The names of some imported commands from the module 'Updatephysica1MachineHe1per' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM NARNING: The names of some imported commands from the module 'UpdateNC' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM NARNING: The names of some imported commands from the module 'physicalMachines ' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs , run the Import-Module command again with the Verbose parameter. For a list of approved verbs, type Get-verb. 3/1/2017 6:27 PM COMPL : COMPL : STARTING : STARTING : NARNING: NARNING: NARNING: COMPL : COMPL : STARTING : STARTING : COMPL : COMPL : STARTING : STARTING : NARNING: NARNING: NARNING: Task Confi gure Step 0.17 (DEP) Confi gure physi cal Machi ne Step 0.18 - (DEP) Confi gure physi cal Machi ne Task [AS-HOST] : [AS-HOST] : [AS-HOST] : Task updateHostComponent C CPDTVMSwi tch] publ i cswi tch] C CPDTVMSwi tch] publ i cswi tch] C CPDTVMSwi tch] publ i cswi tch] updateHostComponent Net Net Net adapters adapters adapters are are are down : down : down : 3/1/2017 PM 3/1/2017 6: PM 3/1/2017 PM Step 0.18 - (DEP) Confi gure physi cal Machi ne Step 0.19 - (FBI) Confi gure powershell JEA for Storage. Task Cloud \ Fabri c\JEA — Confi gure Task - Confi gure Step 0.19 - (FBI) Confi gure powershell JEA for Storage. Step 0.20 - (S TO) Confi gure Storage Cluster Task Depl oyment Cluster validation completed, but had a few tests either unselected/ cancelled/ deemed not applicable. Refer to the validation report for more information 3/1/2017 PM There were issues while creating the clustered role that may prevent it from starting. For more information view the report file below. 3/1/2017 PM Report file location: C: Cluster Wizard S—cluster on 2017 .03. 01 At 18. 33. 06. htm 3/1/2017 PM
Administrator: Windows PowerSheII VERBOSE : Inter ace: Runmng 1 nter ace Ml grate c asses ECEsee RI nq ECEsee RI ng .psml, ECEsee R 1 rig : Ml grate 3 1 2017 PM ARNING: The names of some imported commands from the module 'ECE incl ude unapproved verbs that mi ght make them less di scoverable. Import-Module command again with the verbose parameter. For a list of approved verbs, type Get-verb. - 3/1/2017 PM TO find the commands with unapproved verbs , run the ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ARNING : ERBOSE : ERBOSE: ERBOSE : ERBOSE : ARNING : ERBOSE: ERBOSE : ERBOSE : ERBOSE : ERBOSE: ERBOSE : ERBOSE : ERBOSE : ERBOSE: ERBOSE : ERBOSE : ERBOSE : ERBOSE: ERBOSE : ERBOSE : ERBOSE : ERBOSE: COMPLETE : ERBOSE : COMPLETE : ERBOSE : STARTING : ERBOSE • ERBOSE : STARTING : ERBOSE : ERBOSE : ERBOSE : ERBOSE : ERBOSE : Loading module from path oyment\ECEngi oudEngine.cmd1ets.d11 ' - 3/1/2017 PM Importing cmdlet 'set-Ecesecret' . - 3/1/2017 PM Importing cmdlet 'Get-Ececonfi guration' . - 3/1/2017 PM Importing cmdlet 'Get-Actionprogress ' - 3/1/2017 PM Importing cmdlet 'Get-JsonTemp1ate' . - 3/1/2017 PM Importing cmdlet 'Invoke-EceAction ' - 3/1/2017 PM Importing cmdlet ' Joi n-R01eTemp1ate ' - 3/1/2017 PM Importing cmdlet 'Import-Ececustome rconfiguration ' - 3/1/2017 PM - 3/1/2017 PM Importing cmdlet 'set-RoleDefinition ' Attempting to retrieve BareMeta1Admin credential ... - 3/1/2017 10:24:55 PM unable to retri eve BareMeta1Admin credential . It may not exist. - 3/1/2017 PM Exception calling "Getcredential " with "1" argument (s) : contains no elements' sequence Attempting to retrieve AADAdmin credential .. - 3/1/2017 Attempting to retrieve AADAzureT0ken credential ... - 3/1/2017 PM Attempting to retrieve AzureBri dgeuser credential ... - 3/1/2017 PM unable to retri eve AzureBridgeuser credential . It may not exist. - 3/1/2017 10:24:55 PM Exception calling "Getcredential " with "1" argument (s) : sequence contains no elements' Attempting to retrieve LocalAdmin credential ... - 3/1/2017 10:24:55 PM Attempting to retrieve MgmtLoca1Admin credential ... - 3/1/2017 10:24:55 PM Attempting to retrieve CAcertifi cateuser credential . - 3/1/2017 10:24:55 PM - 3)i/2017 10:24:55 PM Attempting to retrieve Domai nAdmin credential ... Attempting to retrieve Fabric credential ... - 3/1/2017 10:24:55 PM Attempting to retrieve sq 1 service credential ... - 3/1/2017 10:24:55 PM Migrating cloudDefinition to ECEservi ce... - 3/1/2017 10:24:55 PM - 3/1/2017 PM - 3/1/2017 10:24:55 PM Initializing remote powershell session on MAS-ERCS01.AzureStack.Loca1 with common functions. - 3/1/2017 10:24:57 PM Loading infra vm helpers . PSI) to session on MAS-ERCS01.AzureStack.Loca1 - 3/1/2017 10:24:57 PM Migration of cl oudDefinition to ECEservnce completed successfully. - 3/1/2017 10:25:10 PM Migrating ECELite to AD VMS. . . - 3/1/2017 10:25:10 PM copying cloudDep10yment Files to AD VM... - 3/1/2017 10:25:10 PM comed cloudDep10yment Files to AD VM. - 3/1/2017 10:25:31 PM Hydrating ECELite with runtime values... - 3/1/2017 10:25:31 PM Migration of ECELite to AD VMS completed succesfully! - 3/1/2017 10:25:33 PM Interface: Interface Mi grate completed. - 3/1/2017 10:25:33 PM Task cl oud\Fabri c\seedRi ngservi ces\ECEseedRi ng Mi grate Task: Task completed. - 3/1/2017 10:25:33 PM PHASE. 3.1 -C FBI) Migrate confi guration to ECE service on seedRing step 241 - step: Status of step '241 - PHASE. 3.1 -(FBI) Migrate configuration to ECE service on seedRing' is 'success ' prepare for future host reboots step 251 - prepare for future host reboots - 3/1/2017 10:25:33 PM Running step 251 - - 3/1/2017 10:25:33 PM Running interface 'startup' of role 'cl . Attempt #1. Task cl - startup Interface: path to module: C: psml - 3/1/2017 10:25:33 PM Interface: Running interface startup psml, poc:startup) - 3/1/2017 10:25:33 PM Deleting onstartup scheduled task. - 3/1/2017 10:25:42 PM - 3/1/2017 10:25:33 PM setting restart callback as: Import—Module c: oudDepI oyment\ECEngi ne\Ente rpri secl oudEngi ne . psdI Invoke-EceAction -Rolepath Cloud -ActionType Startup —verbose -ErrorAction conti nue Invoke-EceAction -Rolepath Cloud -Action Type Startup —verbose -ErrorAction conti nue Invoke-EceAction -Rolepath Cloud -ActionType Startup —verbose -ErrorAction conti nue ' 3/1/2017 10:25:43 PM Reaistering the callback for powershell . exe with argument: '-Executionpolicy Remotesigned -NOEXit -command Import-Module .\CIoudDepIoyment .psdl Import-M0duTe c: oudDepI pers . psmI Import-Module c: oudDepI oyment\ECEngi ne\Enterpri secl oudEngi ne . psdI Invoke-EceAction -Rolepath Cloud -Act non Type Startup —verbose -ErrorAction conti nue Invoke-EceAction -Rolepath Cloud -ActionType Startup —verbose -ErrorAction conti nue Invoke-EceAction -Rolepath Cloud -ActionType Startup —verbose -ErrorAction conti nue ' Registering the scheduled task named ' coldstartMachine under the user ' AzurestackAdmin' . ERBOSE : ERBOSE : COMPLETE : ERBOSE : COMPLETE : ERBOSE : ERBOSE : COMPLETE : - 3/1/2017 10:25:43 PM - 3/1/2017 10:25:43 PM Interface: Interface Startup completed . - 3/1/2017 10:25:43 PM Task cl - startup Task: Task completed. - 3/1/2017 10:25:43 PM prepare for future host reboots step 251 - Step: Status of step '251 — prepare for future host reboots' is 'success ' - 3/1/2017 10:25:43 PM Action: Action plan Action ' Depl oyment ' ' Depl oyment' compl eted . - 3/1/2017 10:25:43 PM ps c: oudDep1 PS c: oudDepI ps c: oudDepI PS c: oudDepI 10:27 PM 3/1/2017

Change the default password expiry to 180 days as per the documentation:

 

Set-ADDefaultDomainPasswordPolicy -MaxPasswordAge 180.00:00:00 -Identity azurestack.local
And that's it! Azure Stack TP3 deployed and ready to rock and roll!

Edit dashboard New Region Management Plans U pd ates Provider Settings Locations Marketplace Subscriptions Resource Explorer Portal settings Virtual machine scale s... Availability sets Storage accounts Images Marketplace Managem... Import/export jobs Snapshots More services > Dashboard V + New dashboard Get started Share Fullscreen Clone Updates Delete Feedback Marketplace Alerts Critical Warning Virtual Machines Provision Windows and Linux virtual machines in minutes App Service Create web and mobile apps for any platform and device SQL Database Managed relational database-as-a-service Storage Durable, highly available and massively scalable storage Resource Providers NAME Key Vault Network Capacity Storage Updates Compute STATUS SQL Region Management f) REGION local CRITICAL WARNING CURRENT VERSION 1.0.170225.2 LAST CHECKED PM STATE U pToDate ALERTS Unknown Unknown Unknown Unknown 10:54 PM 3/1/2017

3 thoughts on “ : The Azure Stack TP3 Deployment Experience”
  • […] Azure Stack TP3 deployment experiences (Azure Stack) […]

  • […] Read this Azure Stack blog post (Azure Stack) […]

  • Leave a Reply

    %d bloggers like this: