?????SLA ????? Azure SQL ????????? 9 ?????

继上周公告之后,很高兴向大家宣布更多好消息,作为我们更广泛的数据平台的一部分, 我们将在 Azure 上提供丰富的在线数据服务。9 月,我们将针对 Azure SQL 数据库推出新的服务等级。Azure SQL 数据库是我们的数据库即服务,能使客户的云应用程序获得更高性价比和业务连续性。在预览版期间,我们积极倾听并回应客户反馈,以优化我们的产品,从而为正式发布做好准备。根据反馈,我们正在对之前宣布的服务等级价格实施降价,引入了新的性能级别和按小时计费方式。此外,我们将提供增强的服务级别协议 (SLA),可用性高达 99.99%。

新的 Azure SQL 数据库服务等级

我们在 4 月份已宣布基本级(预览版)、标准级(预览版)和高级(预览版)。这些等级旨在提供一组定义资源,这些资源可提供可预测的性能以满足轻量级到重量级事务型应用程序的需求,并确保应用程序的性能不受其他客户应用程序和工作负荷的影响。新等级还提供了一系列业务连续性功能和更大的数据库规格,最高可达 500 GB。自 4 月份以来,我们在新产品中不断推出附加功能改进升级体验提高性能,性能提高甚至达 5 倍。现在我们将分享一些其他更改,这些更改是您的反馈的直接结果。详细信息如下。

  • 高级和标准级降价: 最终价格将比以前公布的定价最高节省 50%。更新后的价格将帮助更多客户受益于更高的性能和更好的业务连续性。
  • 新的 S0 性能级别: 在标准级服务等级中,我们将提供新的 S0 性能级别。这一全新的低成本门槛将使更多客户能够受益于标准级服务等级的功能。性能级别提供了定义的吞吐量级别,其可根据性能需求轻松调高或调低。
  • 按小时计费: Azure SQL 数据库的新服务等级将转为按小时计费。这将基于需求模式为客户在服务等级和性能级别之间转换提供更大的灵活性,以获得更加经济高效的可靠性能。

 此外,随着客户将更多关键业务工作负荷迁移到云,我们明白高可用性至关重要,因此,我们怀着激动的心情宣布 Azure SQL 数据库的新服务等级将包含增强的 SLA,其可用性高达 99.99%

此外,在预览版期间,我们从 ISV 获得了一些反馈,他们拥有大量具有不同性能需求的数据库,因此,需要能够跨这些数据库灵活共享性能资源,而不是单独管理数据库资源。例如,一些 SaaS ISV 可能为每个客户都准备一个单独的 SQL 数据库,由于每个数据库的活动不同,因此,他们希望跨这些客户数据库管理具有明确预算的资源池。我们正努力在未来服务更新中的新服务等级中实现这一点。如果您是一个具有类似情况的 ISV,请单击此处注册以了解更多信息。

下面总结了服务等级和更新后的价格:

  • 基本级: 专为带轻量级事务型工作负荷的应用程序设计。
  • 标准级:这是针对云设计的业务应用程序入门的首选选项。它提供了中等水平的性能和业务连续性功能。
  • 高级: 专为任务关键型数据库设计,可提供最高的性能级别以及对高级业务连续性功能的访问。

 

基本级

标准级

高级

正常运行时间 SLA

 提高到 99.99%*

数据库大小限制

2 GB

250 GB

500 GB

自助式还原

7 天内的任意点

14 天内的任意点

35 天内的任意点

灾难恢复

跨地域还原到备用 Azure 区域

标准级跨地域冗余,备用辅助位置

活动的跨地域冗余,最多 4 个可读辅助位置

性能目标

每小时事务率

每分钟事务率

每秒事务率

数据库吞吐量单位**

基本级: 5

S0 10

S1 20

S2 50

P1 100

P2 200

P3 800

性能级别和月度定价

基本级: $4.99

S0 $15

S1 $30

S2 $75

P1 $465

P2 $930

P3 $3,720

*正常运行时间高达 99.99% SLA 对于 SQL 数据库 Web 版或商业版并不适用,这些版本在正常运行时间为 99.9% 时受支持。

**这代表对 CPU、内存和读写速率的综合衡量。有关详细信息,请单击此处

 新等级定于下个月(2014 年 9 月)正式发布,更新后的定价将于 2014 年 11 月 1 日对全体客户生效。为了支持客户从当前等级过渡,我们将现有 Web 和企业服务等级的淘汰时间延长至 2015 9 月,即新等级正式发布一年之后。在 Web 和企业服务等级淘汰之前,我们将为 ISV 提供可实现多个数据库间池化 DTU 分配的新服务等级,以支持这些 ISV 顺利过渡。

 微软的 Azure 数据服务

Azure 数据服务为客户提供了无与伦比的方式选择,以无缝处理、管理连接所有类型的数据。这些即将推出的服务更新将帮助客户更轻松地实现其性能需求以及利用云的经济优势。不管您是否在 Azure 虚拟机中利用 SQL Server 控制和管理数据库,或者充分利用我们托管的相关数据库即服务(Azure SQL 数据库),我们都会为您提供所需的可用性和性能。

 我们鼓励您立即试用这些产品,为 9 月新服务等级的正式发布做好准备。立即开始免费试用!

 本文翻译自:http://azure.microsoft.com/blog/2014/08/26/new-azure-sql-database-service-tiers-generally-available-in-september-with-reduced-pricing-and-enhanced-sla/

SharePoint Online Information Architecture Considerations

The geek in me would love to have a developer cure-all to ensure a successful SharePoint deployment (ok…provisioning comes really close). In reality, success is based largely on great Organizational Change Management (OCM) and solid Information Architecture (IA). Even the most mature SharePoint organizations struggle with these activities. This is especially true as they move SharePoint workloads to the multi-tenant cloud of Office 365. In this post, I’ll discuss Information Architecture considerations specific to SharePoint Online. In many ways, the cloud demands re-imagined patterns for Information Architecture in SharePoint. I’ll break down the discussion into four areas…URL Limitations, Capacity Considerations, Templates/Provisioning, and Managed Metadata/Content Types.

NOTE: Information Architecture is a departure from my normal development themed posts, but you will find that Office 365 development patterns can help deliver a stronger IA implementation in SharePoint Online. I will make many references to Office 365 Development Patterns and Practices on GitHub that includes samples to automate and add governance to an IA strategy.

 

What is a Tenant

Before getting started, it would help to define the word “tenant” that is often mentioned in Office 365 and/or SharePoint Online discussions. After frequent confused looks by customers, I no longer assume understanding of this term in context. Office 365 and SharePoint Online are considered a multi-tenant software as a service (MT SaaS). To simplify, you can consider SharePoint a large apartment building Microsoft owns in the cloud. Our customers are the “tenants” in that apartment building. Tenants share the apartment building (SharePoint), but Microsoft does everything possible to avoid tenants from disrupting other tenants. Microsoft has also offered customers dedicated SharePoint hosting. Dedicated hosting gives a customer their own apartment building, but isn’t nearly as economical as multi-tenant. Multi-tenant SharePoint Online is where most innovation investments are being made and where Microsoft hosts its own internal SharePoint workloads (we wouldn’t put you in an apartment we wouldn’t live in ourselves).

URL Limitations

The use of “vanity URLs” is a practice I’ve observed in numerous on-premises SharePoint deployments. Web applications, host-named site collections, and managed paths cater to every end-user URL whim. This epidemic adds challenges to already challenging cloud migrations. SharePoint Online takes a very simple approach to URL organization. Outside of OneDrive for Business, all SharePoint Online sites must fit under a single host-name (https://tenant.sharepoint.com). The table below lists all the host-names in multi-tenant SharePoint Online and their intended use.

Host-Name Description
https://tenant.sharepoint.com Default SharePoint Online host name where most authenticated sites will be provisioned
https://tenant-my.sharepoint.com Reserved for My Site Host and OneDrive for Business sites. Supports manual subsite provisioning but not site collections outside of OneDrive.
https://tenant-admin.sharepoint.com SharePoint Online admin center (think of this as a slim version of Central Administration for SharePoint Online administrators)
https://tenant-public.sharepoint.com Anonymous public site reserved for internet presence (great for small and mid-size organizations but less useful with orgs with existing web presence)

 

You can specify your own custom domain for the public site, but NOT the default internal host-name. I have seen customers implement a number of redirect alternatives to overcome this challenge including DNS mapping, http modules, tiny URL/mapping solutions, etc.

In addition to host-name limitations, you cannot add new managed paths to SharePoint Online. For the default internal host-name you get the root, /search (explicit managed path), /sites (wildcard managed path) and /teams (wildcard managed path). Although there is no right/wrong approach in applying these to SharePoint workloads, the table below outlines a popular approach I think makes a lot of sense:

Property Description
https://tenant.sharepoint.com/ Reserve for corporate intranet or search
https://tenant.sharepoint.com/search/ Reserve for enterprise search center
https://tenant.sharepoint.com/teams/* Reserve for “commodity” sites such as teams, projects, and self-service provisioning
https://tenant.sharepoint.com/sites/* Reserve for divisional, departmental, or specialty sites (ex: Record Center(s), Video Portal, Applications, etc)

 

Capacity Considerations

If you think the limited variety of URL options calls into question the traditional strategy of using more site collections…you are on to something. For on-premises customers, I always recommend the approach “when in doubt, break it out…into separate site collections”. This keeps content databases manageable for disaster recovery and (hopefully) under the recommended 200GB size for collaborative content. However, worrying about content databases and disaster recovery are things of the past for SharePoint Online customers…let us (Microsoft) deal with that. All signs point to re-thinking how you break up sites when moving to SharePoint in the cloud. In addition to URL limitations, multi-tenant enterprise customers are currently limited to 10,000 site collections (excluding OneDrive for Business). That sounds big, but 10,000 can be reached quickly for larger organizations or those with a self-service site collection policy. To make up for these limitations, Microsoft recently announced the ability to scale site collections in SharePoint Online to 1TB. This is significantly beyond the 200GB recommendation for collaborative content on-premises. I don’t have specific guidance on how to break up sites in SharePoint Online as I don’t think there is a one-size fits all solution. However, I will provide some generic guidance and best practices:

  • Keep content grouped within the same site collections where it logically makes sense and that fits within the 1TB capacity limitations of SharePoint Online (including room for future growth)
  • Site collections are the highest level securable container in SharePoint, so consider separate site collections when sites have highly uniquely permissions
  • Keep collaborative content separated from published content (ex: I wouldn’t include the Finance Department’s team sites in the same site collection as their informational/intranet pages available to the entire company)
  • Consider implementing retention/disposition strategy for both site collections and content to keep site collection count/sizes down and to recycle available site collection URLs
  • Just because site collections can grow bigger in the cloud, don’t go overboard with elaborate site hierarchies. This is never a good idea as it makes it very hard to reorganize content in the future

I still like site collection provisioning for “commodity” sites such as teams and project (especially when combined with self-service provisioning). It is just too hard to predict how these types of sites will be used, where they should get provisioned, and how much space they need. What changes in SharePoint Online is the need to consider retention in commodity sites. Yes retention…that great little feature that SharePoint has supported for years, every organization says they need, yet hardly anyone implements. A site collection disposition strategy can great help manage capacity limitations in the cloud. We leverage a site collection disposition strategy internally at Microsoft, but all site collections must have two employee owners to avoid disposition of critical content when an employee switches roles or jobs. Also remember…retention/disposition does not necessarily mean delete. A disposition strategy might be a process to move high-value assets to a record center before deleting the unused collaborative site.

Templates and Provisioning

Templates enable sites to be pre-configured for quick/easy/repeatable provisioning elsewhere. Throughout SharePoint’s history, there have been a number of approaches for provisioning such as site definitions, site templates, web templates, feature stapling, provisioning providers, and more. Site templates and web templates are the only out of the box approach available for patterned provisioning in SharePoint Online. However, neither of these approaches are ideal. For example, site templates only work for subsites and do not support publishing. Web templates can miss out on new functionality “stapled” to sites in the ever-changing SharePoint Online. For a comprehensive list of provisioning techniques and their limitations, I highly recommend Vesa Juvonen’s post on site provisioning techniques.

Instead of site or web templates, it is recommended that SharePoint Online customers adopt a programmatic site provisioning strategy. Programmatically owning the provisioning process for site collections and subsites can achieve almost any desired outcome (including many things impossible in templates). This technique requires a customization, but it is highly documented and promoted by Microsoft and SharePoint Online experts. Most of the popular provisioning patterns are available on the Office 365 Developer Patterns and Practices initiative on GitHub. And solutions have been features on my blog, Vesa’s blog,Channel 9, and most importantly Microsoft’s SharePoint Online solution pack for branding and site provisioning

Since programmatic provisioning has already been thoroughly covered in other publications, I will provide an abstract. The concept is to replace standard provisioning with custom provisioning, including templates, forms, and provisioning execution.

The first step in delivering custom provisioning is defining site configurations. These configurations define the expected outcome from provisioning and are analogous to templates. Configurations can include almost anything, including branding, features, lists/libraries, page configurations, etc. A popular pattern on GitHub uses XML definitions for these “templates”, but the configurations could be stored virtually anywhere the provisioning “app” can read. These provisioning options will likely be presented to the user for selection in custom provisioning form(s) outlined below.

The second component in delivering custom provisioning are custom provisioning forms. These should replace the out of the box provision forms that exist throughout SharePoint Online (ex: /_layouts/15/newsbweb.aspx). SharePoint Online admin center already allows a custom “Start a site” form to be specified on the “Sites” portal of SharePoint Online (see image below). This is often used to enable self-service site collection provisioning. For subsite provisioning, our custom provisioning “app” can hijack the new subsite links throughout SharePoint (using a simple script-injection technique). Both these patterns have been thoroughly documented in Office 365 Developer Patterns and Practices.

Finally, the custom provisioning app needs to provision site collections and subsites based on the selected site configuration and any additional criteria specified in the provisioning form(s). The provisioning process will programmatically create sites and then add/remove components based on selected site configurations. Once the provisioning process is complete, the user can be directed to the newly created site. Again, a number of patterns are already available for download off GitHub, including applying branding, alternate CSS/logos, creating content types, script injections, Yammer integration, page/wikipage manipulation, and much more. However, almost anything is considered fair game in provisioning so long as the Client-Side Object Model (CSOM) supports it.

Managed Metadata and Content Types

Managed Metadata and Content Types can play key roles in a strong IA strategy. In on-premises deployments, these components can be synchronized across site collections, web applications, and even farms using the Managed Metadata Service. Keeping one definitive source for taxonomies and content types can greatly facilitate content search/discovery and policy adherence. Although SharePoint Online supports similar features (including content type syndication), it does not support hybrid synchronization with on-premises definitions. To support a strong enterprise content management strategy, SharePoint Online taxonomies and content types might need extra care to keep term and content type IDs identical to on-premises equivalents. Luckily, the client-side object model can help to achieve this when term sets (taxonomies) and content types are programmatically provisioned in the cloud. In fact, part of the site collection provisioning process might include the provisioning of custom content types (perhaps even setting default field values based on the site properties). It is not recommended you provision content types declaratively as was common in the feature framework. Although this can be done with a declarative sandbox solution in SharePoint Online, programmatic provision is the recommended method (unless the app is part of an app). Office 365 Patterns and Practices on GitHub contains samples for creating content types, synchronizing term sets, and even auto-tagging solutions.

Final Thoughts

This post wasn’t meant to outline prescriptive guidance for information architecture. My goal was to outline some important IA considerations specific to SharePoint Online. I hope the details I’ve outlined helped you understand the unique constraints of multi-tenancy and some patterns for achieving information architecture utopia in SharePoint Online. Remember to checkout the Office 365 Development Patterns and Practices for samples for achieving many of the recommended patterns.

Deploying Virtual Machines in Azure using Service Manager and SMA Part III

This is the 3rd post in a 3-part series on deploying VMs in Azure using System Center Service Manager and Service Management Automation (SMA). In this post we’ll cover using the Service Manager Self-Service Portal to trigger an SMA Runbook which deploys a new VM in Azure.

Part I: Preparing your VM for upload, uploading it to Azure, and configuring Azure

Part II: Deploying your VM in PowerShell and SMA

Part III: Deploying your VM using the Service Manager Self-Service Portal

Summary

In Part I we uploaded a custom image to Azure and in Part II we created an SMA Runbook to deploy a new virtual machine using that image. The steps below will take you through configuring System Center Service Manager to launch an SMA Runbook which will deploy a Virtual Machine in Azure.

Prerequisites

  1. Install the Service Manager Authoring Tool on a workstation
  2. Install Windows Azure PowerShell on the machine where your SMA Runbook will be launched (configured in Part II)
  3. Install the Service Manager Console on the machine where your SMA Runbook will be launched.
  4. Install SMA PowerShell on the Service Manager Management Server where the workflow will be run. You can install this from the Orchestrator installation CD, just launch setup and it’s on the bottom.
  5. Add the workflow account in Service Manager to the smaAdminGroup (local group) on the SMA Server. You can get this account by opening the Service Manager console and going to AdministrationSecurityRun As AccountsWorkflow Account.
  6. Download the Azure Settings File and place it somewhere on the SMA Server. In order for scripts to connect to Azure we need to download an Azure settings file for authentication. You can download this file from the following URL: https://windows.azure.com/download/publishprofile.aspx.
  7. Get all of the parameters needed to execute the SMA Runbook manually through SMA. Part II has steps to get these.

Modify the SMA Runbook

The SMA Runbook we created in Part II will mostly work as-is but we’ll want to make several modifications so it works better with Service Manager. The main modification adds to the end of the script so that it will set the Service Manager activity to Completed. If we don’t do this the Virtual Machine will get deployed but the Service Request will remain In Progress. If you plan on using the SMA Runbook without Service Manager then instead of modifying the existing one you can create a new one.

  • Logon to the Service Management Portal and click on AutomationRunbooks
  • Scroll down to the DeployVMInAzure Runbook and select it
  • Click Author, Draft, and Edit Runbook
  • Replace the script with the one below
workflow DeployVMInAzure { param( $azureSettingsFile, $azureAccountName, $imageName, $vmName, $instanceSize, $adminUserName, $adminPassword, $domain, $domainUserName, $domainPassword, $affinityGroup, $networkName, $azureStorageAccountName, $subnetName, $activityID, $smManagementServer ) #Set Instance Size if ($instanceSize -eq "A0") { $instanceSize = 'ExtraSmall' } elseif ($instanceSize -eq "A1") { $instanceSize = 'Small' } elseif ($instanceSize -eq "A2") { $instanceSize = 'Medium' } elseif ($instanceSize -eq "A3") { $instanceSize = 'Large' } elseif ($instanceSize -eq "A4") { $instanceSize = 'ExtraLarge' } inlinescript { #Import Azure PowerShell Module Import-Module Azure #Remove Existing Azure Sessions Remove-AzureAccount -Name $Using:azureAccountName -Force #Import Azure Settings File Import-AzurePublishSettingsFile -PublishSettingsFile ($Using:azureSettingsFile).Replace("\","") #Set Azure Subscription Get-AzureSubscription | Set-AzureSubscription -currentstorageaccountname $Using:azureStorageAccountName #Increment VM Name $i = 0 foreach ($vm in Get-AzureVM) { if ($vm.InstanceName.Contains($Using:vmName)) { [int]$increment = $vm.InstanceName.SubString($Using:vmName.Length) if ($increment -gt $i) { $i = $increment } } } $i++ $vmName = $Using:vmName + $i #Create New Azure Cloud Service New-AzureService -ServiceName $vmName -AffinityGroup $Using:affinityGroup #Create Azure VM if ($Using:domain) { New-AzureVMConfig -Name $vmName -InstanceSize $Using:instanceSize -ImageName $Using:imageName | Add-AzureProvisioningConfig -WindowsDomain -Password $Using:adminPassword -JoinDomain $Using:domain -Domain $Using:domain -DomainUserName $Using:domainUserName -DomainPassword $Using:domainPassword -AdminUsername $Using:adminUserName | Set-AzureSubnet $Using:subnetName | New-AzureVM -ServiceName $vmName -VNetName $Using:networkName } else { New-AzureVMConfig -Name $vmName -InstanceSize $Using:instanceSize -ImageName $Using:imageName | Add-AzureProvisioningConfig -Windows -AdminUsername $Using:adminUserName -Password $Using:adminPassword | Set-AzureSubnet $Using:subnetName | New-AzureVM -ServiceName $vmName -VNetName $Using:networkName } #Set SM Activity to Completed if ($Using:activityID) { #Connect to SM $smDir = (Get-ItemProperty 'hklm:/software/microsoft/System Center/2010/Service Manager/Setup').InstallDirectory Import-Module ($smDir + "PowershellSystem.Center.Service.Manager.psd1") $sm = New-SCManagementGroupConnection -computerName $Using:smManagementServer #Get SM Class $class = Get-SCClass -name 'Custom.Example.Azure.DeployVM' #Get SM Class Instance $instance = Get-SCClassInstance -class $class -filter ('Id -eq {0}' -f $Using:activityID) #Update Activity to Completed $instance.Status = "ActivityStatusEnum.Completed" Update-SCSMClassInstance -Instance $instance } } }

  • Publish the Runbook

Create a Management Pack in the Authoring Tool

  • Launch the Service Manager Authoring Tool
  • Select FileNew, and name your MP Custom.Example.Azure.xml
  • Under Custom.Example.Azure, right-click on Classes and choose Create other class…
    • For Base class, choose Activity and click OK
    • For Internal name type Custom.Example.Azure.DeployVM and click Create
  • Under your new class, delete the Property_xx property (mine is Property_33)
  • Create the following String properties for you Custom.Example.Azure.DeployVMclass
    • WebServiceEndPoint
    • SMARunbookName
    • azureSettingsFile
    • azureAccountName
    • imageName
    • vmName
    • instanceSize
    • adminUserName
    • adminPassword
    • domain
    • domainUserName
    • domainPassword
    • affinityGroup
    • networkName
    • azureStorageAccountName
    • subnetName
    • smManagementServer
  • Under Custom.Example.Azure, right-click on Workflows and choose Create
    • Under Name type DeployVM and click Next
    • Under Trigger Condition choose Run only when a database object meets specified conditions and click Next
    • Under Trigger Criteria choose the Custom.Example.Azure.DeployVM class, choose When a object of the selected class is updated, and click Additional Criteria
      • Select Changed To and set a Criteria of Status equals In Progress

image

  • Click OK, Create, and Close
  • The Workflow Designer should open along with an Activities Toolbox. Drag the Windows PowerShell Script Activity into the Workflow

image

  • Select the windowsPowerShellScript1 activity and then click on the ellipsis next to Script Body under Details
  • Paste the following script into the Script Body window
Start-SmaRunbook -WebServiceEndpoint $WebServiceEndpoint -Name $SMARunbookName -Parameters @{"azureSettingsFile" = "$azureSettingsFile"; "azureAccountName" = "$azureAccountName"; "imageName" = "$imageName"; "vmName" = "$vmName"; "instanceSize" = "$instanceSize"; "adminUserName" = "$adminUserName"; "adminPassword" = "$adminPassword"; "domain" = "$domain"; "domainUserName" = "$domainUserName"; "domainPassword" = "$domainPassword"; "affinityGroup" = "$affinityGroup"; "networkName" = "$networkName"; "azureStorageAccountName" = "$azureStorageAccountName"; "subnetName" = "$subnetName"; "smManagementServer" = "$smManagementServer"; "activityID" = "$activityID"}

  • Click on Script Properties and Add the following properties to the Activity (Click Use a class property to find the matching class property) and click OK

    • WebServiceEndPoint
    • SMARunbookName
    • azureSettingsFile
    • azureAccountName
    • imageName
    • vmName
    • instanceSize
    • adminUserName
    • adminPassword
    • domain
    • domainUserName
    • domainPassword
    • affinityGroup
    • networkName
    • azureStorageAccountName
    • subnetName
    • smManagementServer
    • activityID (maps to ID)

image

  • Save the Management Pack in the Authoring Tool
  • Copy the DeployVM.dll file from your management pack folder to your Service Manager Management Server folder (Program FilesMicrosoft System Center 2012 R2Service Manager) and restart the Microsoft Monitoring Agent service on the Service Manager Management Server.
  • Restart your Service Manager Console if you had it open

Import the Management Pack in Service Manager

  • Open the Service Manager Console and go to AdministrationManagement Packs
  • Right-click on Management Packs and choose Import
  • Select the Custom.Example.Azure management pack, click Open, Import, and OK

Create a new Template for the Custom.Example.Azure.DeployVM Class

  • Open the Service Manager Console and go to LibraryTemplates
  • Right-click on Templates and select Create Template
    • For Name, type Deploy Azure VM Template
    • For Class, choose Custom.Example.Azure.DeployVM
    • Click OK
  • Fill in the following properties of the form based on the parameters used running the SMA Runbook manually
    • Display Name: Deploy Azure VM
    • Title: Deploy Azure VM
    • WebServiceEndPoint (your SMA Server): https://mysmaserver.contoso.com
    • SMARunbookName: DeployVMInAzure
    • azureSettingsFile: c:tempmyAzureSettings.publishsettings
    • azureAccountName: myAzureAccount@myemailaccount.com
    • imageName: w2012r2base3
    • vmName: rslatenTest
    • instanceSize: A0
    • adminUserName: rslaten
    • adminPassword: P@$$W0Rd1
    • domain: contoso.com
    • domainUserName: rslaten
    • domainPassword: P@$$W0Rd1
    • affinityGroup: Lab
    • networkName: Lab
    • azureStorageAccountName: rslaten
    • subnetName: Subnet-1
    • smManagementServer: sm1.contoso.com
  • Click OK

Create a Service Request Template

  • Open the Service Manager Console and go to LibraryTemplates
  • Right-click on Templates and select Create Template
    • For Name, type Deploy Azure VM Service Request Template
    • For Class, choose Service Request
    • Change the Management Pack to Custom.Example.Azure
    • Click OK
  • Enter a Title: Deploy Azure VM Service Request
  • Click the Activities tab and click the Plus sign
  • Select the Deploy Azure VM Template, click OK, and click OK

Create a Request Offering

In this request offering I’m only going to let the user select the instance size. With additional customization you can, however, allow other selections such as VM Name, Image Name, etc…

  • Open the Service Manager Console and go to LibraryRequest Offerings and click Create Request Offering
  • Click Next and enter Deploy Azure Virtual Machine for the Title
  • Select the Deploy Azure VM Service Request Template and click OK
  • Under User Prompts type Instance Size with a type of Simple List and click Next
  • Under Configure Prompts select Instance Size and click Configure
  • Enter the following list properties for instance size (A0 – A9)

image

  • Click OK
  • Click Next
  • Under Map Prompts select Custom.Example.Azure.DeployVM
  • Map InstanceSize to InstanceSize:ListValue

image

  • Click Next, Click Next
  • Under Publish change Offering Status to Published and click Next
  • Click Create and Close

Create a Service Offering

  • Open the Service Manager Console and go to LibraryService Offerings and click Create Service Offering
  • Click Next, enter Cloud Offerings for Title, Click Next 3 Times
  • Under Request Offering Add the Deploy Azure Virtual Machine request offering, click OK, and click Next
  • Under Publish change the Offering Status to Published and click Next
  • Click Create and Close

The output from the exported Management Pack is below:

<ManagementPack ContentReadable="true" SchemaVersion="2.0" OriginalSchemaVersion="1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <Manifest> <Identity> <ID>Custom.Example.Azure</ID> <Version>1.0.0.0</Version> </Identity> <Name>Custom.Example.Azure</Name> <References> <Reference Alias="System"> <ID>System.Library</ID> <Version>7.5.8501.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="Console"> <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID> <Version>7.5.3079.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca"> <ID>System.WorkItem.Activity.Library</ID> <Version>7.5.3079.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="EnterpriseManagement"> <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Administration</ID> <Version>7.5.3079.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="SystemCenter"> <ID>Microsoft.SystemCenter.Library</ID> <Version>7.0.8433.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="SystemCenter1"> <ID>Microsoft.SystemCenter.Subscriptions</ID> <Version>7.5.3079.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="Core"> <ID>ServiceManager.Core.Library</ID> <Version>7.5.3079.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="Windows"> <ID>Microsoft.Windows.Library</ID> <Version>7.5.8501.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="System_WorkItem_Library"> <ID>System.WorkItem.Library</ID> <Version>7.5.3079.0</Version> <PublicKeyToken>31bf3856ad364e35</PublicKeyToken> </Reference> <Reference Alias="Example"> <ID>Custom.Example.ServiceRequestExtended</ID> <Version>1.0.0.1</Version> <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken> </Reference> </References> </Manifest> <TypeDefinitions> <EntityTypes> <ClassTypes> <ClassType ID="Custom.Example.Azure.DeployVM" Accessibility="Public" Abstract="false" Base="Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItem.Activity" Hosted="false" Singleton="false" Extension="false"> <Property ID="WebServiceEndpoint" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="azureSettingsFile" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="imageName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="vmName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="instanceSize" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="adminUserName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="adminPassword" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="domain" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="domainUserName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="domainPassword" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="affinityGroup" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="networkName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="azureStorageAccountName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="subnetName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="SMARunbookName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="azureAccountName" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> <Property ID="smManagementServer" Type="string" AutoIncrement="false" Key="false" CaseSensitive="false" MaxLength="256" MinLength="0" Required="false" Scale="0" /> </ClassType> </ClassTypes> </EntityTypes> <ModuleTypes> <WriteActionModuleType ID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00.MT" Accessibility="Public" RunAs="Core!Microsoft.SystemCenter.ServiceManager.WorkflowAccount" Batching="false"> <Configuration> <IncludeSchemaTypes> <SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType> </IncludeSchemaTypes> <xsd:element name="WebServiceEndPoint" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="SMARunbookName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="azureSettingsFile" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="imageName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="vmName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="instanceSize" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="adminUserName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="domain" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="domainUserName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="domainPassword" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="affinityGroup" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="networkName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="azureStorageAccountName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="subnetName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="adminPassword" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="azureAccountName" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="smManagementServer" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> <xsd:element name="activityID" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> </Configuration> <OverrideableParameters> <OverrideableParameter ID="WebServiceEndPoint" Selector="$Config/WebServiceEndPoint$" ParameterType="string" /> <OverrideableParameter ID="SMARunbookName" Selector="$Config/SMARunbookName$" ParameterType="string" /> <OverrideableParameter ID="azureSettingsFile" Selector="$Config/azureSettingsFile$" ParameterType="string" /> <OverrideableParameter ID="imageName" Selector="$Config/imageName$" ParameterType="string" /> <OverrideableParameter ID="vmName" Selector="$Config/vmName$" ParameterType="string" /> <OverrideableParameter ID="instanceSize" Selector="$Config/instanceSize$" ParameterType="string" /> <OverrideableParameter ID="adminUserName" Selector="$Config/adminUserName$" ParameterType="string" /> <OverrideableParameter ID="domain" Selector="$Config/domain$" ParameterType="string" /> <OverrideableParameter ID="domainUserName" Selector="$Config/domainUserName$" ParameterType="string" /> <OverrideableParameter ID="domainPassword" Selector="$Config/domainPassword$" ParameterType="string" /> <OverrideableParameter ID="affinityGroup" Selector="$Config/affinityGroup$" ParameterType="string" /> <OverrideableParameter ID="networkName" Selector="$Config/networkName$" ParameterType="string" /> <OverrideableParameter ID="azureStorageAccountName" Selector="$Config/azureStorageAccountName$" ParameterType="string" /> <OverrideableParameter ID="subnetName" Selector="$Config/subnetName$" ParameterType="string" /> <OverrideableParameter ID="adminPassword" Selector="$Config/adminPassword$" ParameterType="string" /> <OverrideableParameter ID="azureAccountName" Selector="$Config/azureAccountName$" ParameterType="string" /> <OverrideableParameter ID="smManagementServer" Selector="$Config/smManagementServer$" ParameterType="string" /> <OverrideableParameter ID="activityID" Selector="$Config/activityID$" ParameterType="string" /> </OverrideableParameters> <ModuleImplementation Isolation="Any"> <Composite> <MemberModules> <WriteAction ID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00.PSWA" TypeID="Windows!Microsoft.Windows.PowerShellWriteAction"> <ScriptName>DoWork.ps1</ScriptName> <ScriptBody>param ( [string]$WebServiceEndPoint,[string]$SMARunbookName,[string]$azureSettingsFile,[string]$imageName,[string]$vmName,[string]$instanceSize,[string]$adminUserName,[string]$domain,[string]$domainUserName,[string]$domainPassword,[string]$affinityGroup,[string]$networkName,[string]$azureStorageAccountName,[string]$subnetName,[string]$adminPassword,[string]$azureAccountName,[string]$smManagementServer,[string]$activityID ) Start-SmaRunbook -WebServiceEndpoint $WebServiceEndpoint -Name $SMARunbookName -Parameters @{"azureSettingsFile" = "$azureSettingsFile"; "azureAccountName" = "$azureAccountName"; "imageName" = "$imageName"; "vmName" = "$vmName"; "instanceSize" = "$instanceSize"; "adminUserName" = "$adminUserName"; "adminPassword" = "$adminPassword"; "domain" = "$domain"; "domainUserName" = "$domainUserName"; "domainPassword" = "$domainPassword"; "affinityGroup" = "$affinityGroup"; "networkName" = "$networkName"; "azureStorageAccountName" = "$azureStorageAccountName"; "subnetName" = "$subnetName"; "smManagementServer" = "$smManagementServer"; "activityID" = "$activityID"}</ScriptBody> <SnapIns /> <Parameters> <Parameter> <Name>WebServiceEndPoint</Name> <Value>$Config/WebServiceEndPoint$</Value> </Parameter> <Parameter> <Name>SMARunbookName</Name> <Value>$Config/SMARunbookName$</Value> </Parameter> <Parameter> <Name>azureSettingsFile</Name> <Value>$Config/azureSettingsFile$</Value> </Parameter> <Parameter> <Name>imageName</Name> <Value>$Config/imageName$</Value> </Parameter> <Parameter> <Name>vmName</Name> <Value>$Config/vmName$</Value> </Parameter> <Parameter> <Name>instanceSize</Name> <Value>$Config/instanceSize$</Value> </Parameter> <Parameter> <Name>adminUserName</Name> <Value>$Config/adminUserName$</Value> </Parameter> <Parameter> <Name>domain</Name> <Value>$Config/domain$</Value> </Parameter> <Parameter> <Name>domainUserName</Name> <Value>$Config/domainUserName$</Value> </Parameter> <Parameter> <Name>domainPassword</Name> <Value>$Config/domainPassword$</Value> </Parameter> <Parameter> <Name>affinityGroup</Name> <Value>$Config/affinityGroup$</Value> </Parameter> <Parameter> <Name>networkName</Name> <Value>$Config/networkName$</Value> </Parameter> <Parameter> <Name>azureStorageAccountName</Name> <Value>$Config/azureStorageAccountName$</Value> </Parameter> <Parameter> <Name>subnetName</Name> <Value>$Config/subnetName$</Value> </Parameter> <Parameter> <Name>adminPassword</Name> <Value>$Config/adminPassword$</Value> </Parameter> <Parameter> <Name>azureAccountName</Name> <Value>$Config/azureAccountName$</Value> </Parameter> <Parameter> <Name>smManagementServer</Name> <Value>$Config/smManagementServer$</Value> </Parameter> <Parameter> <Name>activityID</Name> <Value>$Config/activityID$</Value> </Parameter> </Parameters> <TimeoutSeconds>300</TimeoutSeconds> <StrictErrorHandling>true</StrictErrorHandling> <SerializationDepth>3</SerializationDepth> </WriteAction> </MemberModules> <Composition> <Node ID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00.PSWA" /> </Composition> </Composite> </ModuleImplementation> <InputType>System!System.BaseData</InputType> </WriteActionModuleType> </ModuleTypes> </TypeDefinitions> <Categories> <Category ID="Custom.Example.Azure.Category" Value="Console!Microsoft.EnterpriseManagement.ServiceManager.ManagementPack"> <ManagementPackName>Custom.Example.Azure</ManagementPackName> <ManagementPackVersion>1.0.0.0</ManagementPackVersion> </Category> <Category ID="DeployVMCategory" Target="DeployVM" Value="EnterpriseManagement!Microsoft.EnterpriseManagement.ServiceManager.Rules.WorkflowSubscriptions" /> </Categories> <Monitoring> <Rules> <Rule ID="DeployVM" Enabled="true" Target="SystemCenter!Microsoft.SystemCenter.SubscriptionWorkflowTarget" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100"> <Category>Notification</Category> <DataSources> <DataSource ID="DS" TypeID="SystemCenter1!Microsoft.SystemCenter.CmdbInstanceSubscription.DataSourceModule"> <Subscription> <InstanceSubscription Type="$MPElement[Name='Custom.Example.Azure.DeployVM']$"> <UpdateInstance> <Criteria> <Expression> <SimpleExpression> <ValueExpression> <Property State="Post">$Context/Property[Type='Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItem.Activity']/Status$</Property> </ValueExpression> <Operator>Equal</Operator> <ValueExpression> <Value>{11fc3cef-15e5-bca4-dee0-9c1155ec8d83}</Value> </ValueExpression> </SimpleExpression> </Expression> </Criteria> </UpdateInstance> </InstanceSubscription> <PollingIntervalInSeconds>60</PollingIntervalInSeconds> <BatchSize>100</BatchSize> </Subscription> </DataSource> </DataSources> <WriteActions> <WriteAction ID="WA" TypeID="SystemCenter1!Microsoft.EnterpriseManagement.SystemCenter.Subscription.WindowsWorkflowTaskWriteAction"> <Subscription> <WindowsWorkflowConfiguration> <AssemblyName>DeployVM</AssemblyName> <WorkflowTypeName>WorkflowAuthoring.DeployVM</WorkflowTypeName> <WorkflowParameters> <WorkflowParameter Name="windowsPowerShellScript1_WebServiceEndPoint" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/WebServiceEndpoint$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_azureSettingsFile" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/azureSettingsFile$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_imageName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/imageName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_vmName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/vmName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_instanceSize" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/instanceSize$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_adminUserName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/adminUserName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_domain" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/domain$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_domainUserName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/domainUserName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_domainPassword" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/domainPassword$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_affinityGroup" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/affinityGroup$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_networkName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/networkName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_azureStorageAccountName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/azureStorageAccountName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_subnetName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/subnetName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_SMARunbookName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/SMARunbookName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_adminPassword" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/adminPassword$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_azureAccountName" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/azureAccountName$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_smManagementServer" Type="string">$Data/Property[@ID='$MPElement[Name="Custom.Example.Azure.DeployVM"]/smManagementServer$' and @State='Post']$</WorkflowParameter> <WorkflowParameter Name="windowsPowerShellScript1_activityID" Type="string">$Data/Property[@ID='$MPElement[Name="System_WorkItem_Library!System.WorkItem"]/Id$' and @State='Post']$</WorkflowParameter> </WorkflowParameters> <RetryExceptions /> <RetryDelaySeconds>60</RetryDelaySeconds> <MaximumRunningTimeSeconds>300</MaximumRunningTimeSeconds> </WindowsWorkflowConfiguration> </Subscription> </WriteAction> </WriteActions> </Rule> </Rules> <Tasks> <Task ID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00" Accessibility="Public" Enabled="true" Target="Windows!Microsoft.Windows.Computer" Timeout="300" Remotable="true"> <Category>Notification</Category> <WriteAction ID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00.WA" TypeID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00.MT"> <WebServiceEndPoint /> <SMARunbookName /> <azureSettingsFile /> <imageName /> <vmName /> <instanceSize /> <adminUserName /> <domain /> <domainUserName /> <domainPassword /> <affinityGroup /> <networkName /> <azureStorageAccountName /> <subnetName /> <adminPassword /> <azureAccountName /> <smManagementServer /> <activityID /> </WriteAction> </Task> </Tasks> </Monitoring> <Templates> <ObjectTemplate ID="Template.87826befabdb478da4e836bdb4b93c8e" TypeID="Custom.Example.Azure.DeployVM"> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/WebServiceEndpoint$">https://mysmaserver.contoso.com</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/azureSettingsFile$">c:tempmyAzureSettings.publishsettings</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/imageName$">w2012r2base3</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/vmName$">rslatenTest</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/instanceSize$">A0</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/adminUserName$">rslaten</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/adminPassword$">P@$$W0Rd1</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/domain$">contoso.com</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/domainUserName$">rslaten</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/domainPassword$">P@$$W0Rd1</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/affinityGroup$">Lab</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/networkName$">Lab</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/azureStorageAccountName$">rslaten</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/subnetName$">Subnet-1</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/SMARunbookName$">DeployVMInAzure</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/azureAccountName$">myAzureAccount@myemailaccount.com</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/smManagementServer$">sm1.contoso.com</Property> <Property Path="$Context/Property[Type='Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItem.Activity']/Skip$">False</Property> <Property Path="$Context/Property[Type='System_WorkItem_Library!System.WorkItem']/Title$">Deploy Azure VM</Property> <Property Path="$Context/Property[Type='System!System.Entity']/DisplayName$">Deploy Azure VM</Property> </ObjectTemplate> <ObjectTemplate ID="Template.e0b9b5533a9d4a82b37658e95c03f0f7" TypeID="Example!CustomForm_0c972943_1f64_4cd2_84bc_6a9c7da0c6eb_TypeProjection"> <Object Path="$Context/Path[Relationship='Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItemContainsActivity' TypeConstraint='Custom.Example.Azure.DeployVM']$"> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/WebServiceEndpoint$">https://mysmaserver.contoso.com</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/azureSettingsFile$">c:tempmyAzureSettings.publishsettings</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/imageName$">w2012r2base3</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/vmName$">rslatenTest</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/instanceSize$">A0</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/adminUserName$">rslaten</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/adminPassword$">P@$$W0Rd1</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/domain$">contoso.com</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/domainUserName$">rslaten</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/domainPassword$">P@$$W0Rd1</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/affinityGroup$">Lab</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/networkName$">Lab</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/azureStorageAccountName$">rslaten</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/subnetName$">Subnet-1</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/SMARunbookName$">DeployVMInAzure</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/azureAccountName$">myAzureAccount@myemailaccount.com</Property> <Property Path="$Context/Property[Type='Custom.Example.Azure.DeployVM']/smManagementServer$">sm1.contoso.com</Property> <Property Path="$Context/Property[Type='Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItem.Activity']/SequenceId$">0</Property> <Property Path="$Context/Property[Type='Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItem.Activity']/ChildId$">828</Property> <Property Path="$Context/Property[Type='Alias_952b56e8_dd9f_480c_8f57_1d53f5894aca!System.WorkItem.Activity']/Skip$">False</Property> <Property Path="$Context/Property[Type='System_WorkItem_Library!System.WorkItem']/Title$">Deploy Azure VM</Property> <Property Path="$Context/Property[Type='System!System.Entity']/DisplayName$">Deploy Azure VM</Property> </Object> </ObjectTemplate> </Templates> <LanguagePacks> <LanguagePack ID="ENU" IsDefault="true"> <DisplayStrings> <DisplayString ElementID="Custom.Example.Azure"> <Name>Custom.Example.Azure</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM"> <Name>Custom.Example.Azure.DeployVM</Name> <Description>Specify your class description.</Description> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="WebServiceEndpoint"> <Name>WebServiceEndpoint</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="SMARunbookName"> <Name>SMARunbookName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="azureSettingsFile"> <Name>azureSettingsFile</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="imageName"> <Name>imageName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="vmName"> <Name>vmName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="instanceSize"> <Name>instanceSize</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="adminUserName"> <Name>adminUserName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="adminPassword"> <Name>adminPassword</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="domain"> <Name>domain</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="domainUserName"> <Name>domainUserName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="domainPassword"> <Name>domainPassword</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="affinityGroup"> <Name>affinityGroup</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="networkName"> <Name>networkName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="azureStorageAccountName"> <Name>azureStorageAccountName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="subnetName"> <Name>subnetName</Name> </DisplayString> <DisplayString ElementID="DeployVM"> <Name>DeployVM</Name> </DisplayString> <DisplayString ElementID="DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00"> <Name>DeployVM.WindowsPowerShellScript.6992e768_20fa_4bc1_80fd_1b116ad8bc00</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="azureAccountName"> <Name>azureAccountName</Name> </DisplayString> <DisplayString ElementID="Custom.Example.Azure.DeployVM" SubElementID="smManagementServer"> <Name>smManagementServer</Name> </DisplayString> <DisplayString ElementID="Template.87826befabdb478da4e836bdb4b93c8e"> <Name>Deploy Azure VM Template</Name> </DisplayString> <DisplayString ElementID="Template.e0b9b5533a9d4a82b37658e95c03f0f7"> <Name>Deploy Azure VM Service Request Template</Name> </DisplayString> </DisplayStrings> </LanguagePack> </LanguagePacks> <Extensions> <RequestOffering ID="Offering59cfa70b0f134665821820b78a3f744a" InstanceName="Deploy Azure Virtual Machine" Title="Deploy Azure Virtual Machine" PublishDate="2014-08-23T16:45:46-05:00" Status="System.Offering.StatusEnum.Published" TargetTemplate="Template.e0b9b5533a9d4a82b37658e95c03f0f7" HideGotoRequestButton="false"> <PresentationMappingTemplate> <Sources> <Source Id="00000000-0000-0000-0000-000000000000" Ordinal="0" ReadOnly="false" Optional="false" ControlType="System.SupportingItem.PortalControl"> <ControlConfiguration> <Dependencies /> <AddressableOutputs> <AddressableOutput OutputName="Token: Portal User Name" OutputType="string" /> </AddressableOutputs> </ControlConfiguration> <Targets /> </Source> <Source Id="979c2819-ad73-4319-b5c7-e8b55edc956b" Ordinal="1" Prompt="Instance Size" ReadOnly="false" Optional="false" ControlType="System.SupportingItem.PortalControl.InlineList"> <ControlConfiguration> <Dependencies /> <AddressableOutputs> <AddressableOutput OutputName="ListValue" OutputType="string" /> </AddressableOutputs> <Configuration> <Details> <ListValue DisplayName="A0" IsDefault="true" /> <ListValue DisplayName="A1" IsDefault="false" /> <ListValue DisplayName="A2" IsDefault="false" /> <ListValue DisplayName="A3" IsDefault="false" /> <ListValue DisplayName="A4" IsDefault="false" /> <ListValue DisplayName="A5" IsDefault="false" /> <ListValue DisplayName="A6" IsDefault="false" /> <ListValue DisplayName="A7" IsDefault="false" /> <ListValue DisplayName="A8" IsDefault="false" /> <ListValue DisplayName="A9" IsDefault="false" /> </Details> </Configuration> </ControlConfiguration> <Targets> <Target Path="$Target/Path[Relationship='Activity!System.WorkItemContainsActivity']$?ChildId='828'/instanceSize" OutputName="ListValue" /> </Targets> </Source> </Sources> </PresentationMappingTemplate> </RequestOffering> <ServiceOffering ID="Offeringa5d733744b234dfcb6d41383780ca6a4" InstanceName="Cloud Offerings" Title="Cloud Offerings" PublishDate="2014-08-23T16:46:55-05:00" Status="System.Offering.StatusEnum.Published" Category="System.ServiceOffering.CategoryEnum.General" CultureName="" /> </Extensions> </ManagementPack>

Test the Solution

  • Open the Service Manager Self-Service Portal

image

  • Click on Cloud Offerings, click on Deploy Azure Virtual Machine, and click on Go to request form

image

  • Select the appropriate instance size, click Next, and Submit. Once completed the request should also change to Completed.

image

  • View the completed Runbook in the WAP Portal

image

  • View the new VM in the Azure Portal

image

Hybrid Connections – (Cloud Cover Show 144)

Hybrid Connection est une fonctionnalité récemment mise à disposition dans le service Azure BizTalk . Actuellement en Preview, cette dernière offre un moyen simple de connecter des ressources sur site (on-premise) à des services azure ciblés.

Dans l’épisode 144, le duo d’évangéliste de choc, Nick Harris & Chris Risner, reçoit Santosh Chandwani, un program manager (PM) en charge du développement d’Hybrid Connection.

Santosh effectue un tour d’horizon de cette technologie en prenant soin d’agrémenter la présentation de démos utilisant des scénarios courants (Base de données & Service Web locaux) pour les services suivants :

  • Azure Websites
  • Azure Mobile Services

Comme le résume le diagramme ci-dessous, on retrouve deux intervenants principaux :

  • d’un côté Hybrid Connection qui est le “socle côté azure” qui permet d’interconnecter des ressources réseau à Azure Websites et Azure Mobile Services.
  • et de l’autre Hybrid Connection Manager qui centralise la configuration cliente sur site.

Hybrid Connections

 

Ce service est très peu intrusif sur le plan réseau et nécessite un nombre minimal de port TCP . Pour résumer, les ports d’administrations ainsi que le(s) port(s) de la ressource à partager (Web, TDS, etc.).

Note : l’utilisation de ports TCP statiques est un prérequis, attention donc aux ressources utilisant les ports dynamiques (ex: FTP Passive mode,… ) qui ne sont pas supportées.

Sur le plan de la sécurité, seulq les ressources que vous avez explicitement configurées seront partagées, il n’y a donc pas de risque d’exposer tout votre réseau interne ou des ressources non sélectionées. Pour aller plus loin, il est aussi possible d’appliquer des paramètres de Group Policy. De plus Hybride Connection utilise des Shared Access Signature (SAS) pour sécuriser les connections entre azure et Hybrid Connection Manager.

Utiliser Hybrid Connection (HC) est très simple et facile d’accès. En effet, il suffit en quelques clics de :

  • Créer le service sur le portail Azure dans la section Biztalk (indépendamment des fonctionnalités propres à Biztalk)
  • Définir la configuration réseau
  • Installer Hybrid Connection Manager sur le client sur votre poste cible où se trouve votre ressource à partager
  • Configurer vos services (Website / Mobile Services) pour qu’ils utilisent Hybrid Connection

Et la cerise sur le gâteau, c’est qu’il y a un plan de facturation entièrement gratuit. Il n’y a donc aucune raison de ne pas tester ce formidable produit.

Vous retrouverez les détails étapes par étapes sur les tutoriaux suivants :

 

Liens vers l’épisode : http://channel9.msdn.com/Shows/Cloud+Cover/Episode-144-Hybrid-Connections-with-Santosh-Chandwani

Si vous souhaitez tester cela par vous-mêmes et que vous n’avez pas encore de compte Windows Azure ni d’abonnement MSDN, ouvrez un compte de test gratuit, vous obtiendrez 150 € de ressources pendant 1 mois.

Vous trouverez ci-dessous quelques images de l’épisode avec le timing associé pour cibler les parties qui vous intéressent.

David (@davidcoppet)

Screenshot avec timing

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Introducing Hybrid '-tions<br />
loud<br />
Icl«Harris<br />
Microsoft<br />
o<br />
CC)Ve

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Evolving Enterprise Infrastructure<br />
Azure<br />
SQL<br />
0220<br />
Corporate Network<br />
SQL<br />
20 U

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Evolving Enterprise Infrastructure<br />
SQL<br />
6<br />
Azure<br />
03:35<br />
Corporate Network<br />
SQL<br />
zou<br />
(9

Machine generated alternative text:<br />
Épisode 144: Hybrid Connections With Santosh Chandwani<br />
Key Features<br />
Access to on-premises resources<br />
Connect to SQL Server, Web Services or most Other resources that use TCP or HTT P connectivity<br />
Works With most frameworks<br />
Support for .NET, PHP, Java, Python, Node.js for Websites and Node.js and .NET for Mobile Services*<br />
No need to alter the network perimeter<br />
Doesn't require a VPN gateway or Firewall changes to allow incoming traffic<br />
Applications have access only to the resource that they require<br />
Maintains IT control over resources<br />
Support for Group Policy and Event/Audit Logging providing Admins control and visibility<br />
05:21

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Hybrid Connections<br />
Web Sites<br />
Hybrid Connection<br />
Corporate Network<br />
Microsoft SQL Server<br />
SQL<br />
Other published<br />
resources<br />
Manager<br />
Mobile Services<br />
0840<br />
o

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
- W'qdows<br />
Hybrid ns<br />
Microsoft Azure<br />
Add a hybrid<br />
1243<br />
o

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Lift and Shift<br />
You can move existing web workloads to Azure Websites whilst<br />
still connecting to on-premises data without changing any<br />
code.<br />
17:55

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Flow<br />
Microsoft Azure<br />
Hybri<br />
ostname<br />
& porv<br />
onnection<br />
On Premises<br />
ostnam<br />
& port<br />
Multiple applications can share a Hybrid Connection to access an on-prem resource<br />
licationsonnzureaccessagesource the same way they would if it was running on-premises<br />
1850

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
Mobile . x<br />
NLM'<br />
View<br />
Azure<br />
2408<br />
hybrid connections<br />
developer analytics

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
060 000<br />
Security<br />
Uses Shared Access Signature Authorization<br />
Secure, Simple and Familiar<br />
Separate roles for on-premises connector &<br />
application<br />
Credentials for the on-premises connector & client apps can be rolled independently<br />
Seamless & secure distribution & update of credentials to applications & Hybrid Connection Manager<br />
Application authorization is independent<br />
You can use an authorization mechanism appropriate for the Hybrid Application<br />
ln practice, depends on End-to-End authorization mechanisms supported across cloud/on-premises<br />
27:49

Machine generated alternative text:<br />
Episode 144: Connections With Santosh Chandwani<br />
060 000<br />
Enterprise IT in control<br />
Manage resource access for Hybrid applications<br />
Group Policy controls for allowing access<br />
Administrators can designate resources to which Hybrid Applications have access<br />
Event and Audit logging<br />
IT has insight into resources being accessed<br />
IT can use existing infrastructure investments for monitoring and control<br />
Dashboard on Azure portal<br />
Access to connection health, status<br />
Will provide insights on usage and metrics<br />
31:31<br />
o

??????????? ???? ????????? ? ???? ??????!

Дорогие друзья!

Поскольку это студенческий блог, мы предполагаем, что подавляющее большинство читателей – студенты или школьники. Поэтому очень хотим поздравить вас с профессиональным праздником – днём знаний!

Сентябрь – это отличная пора, когда экзамены еще далеко, и можно постепенно начинать учиться и узнавать много нового и интересного. Чтобы вы могли в полной мере удовлетворить свою жажду к знаниям, мы приготовили для вас замечательную подборку курсов на Microsoft Virtual Academy в новом проекте – MVA Club.

image

Присоединяйтесь к MVA Club, если вы хотите стать профессиональным программистом или администратором. Помните известную пословицу: научить нельзя, можно только научиться. Поэтому действительно хорошим профессионалом вы сможете стать, если будете дополнительно к обязательной программе что-то изучать и делать самостоятельно. В MVA Club есть курсы как для совсем начинающих программистов, так и для уже умеющих программировать, кто хочет научиться делать современные приложения. Ну а новый курс по AppStudio позволит вам создавать контентные приложения вообще без программирования!

Помимо MVA Club, мы приготовили для вас в этом семестре много интересного, и будем по ходу дела вам про это рассказывать. В конце сентября – начале октября мы проведем существенное обновление программы студентов-партнёров (MSP), а также объявим о начале очередного этапа конкурса Imagine Cup.

Кстати, говоря про Imagine Cup и про уходящее лето нельзя не вспомнить про замечательную победу нашей команды на международном финале конкурса. Сейчас ребята находятся в Сиэтле на конференции PAX, и если вас интересует, как они проводят там время – читайте их официальный твиттер.

Мы желаем вам увлекательной учебы и таких же ошеломляющих успехов в жизни! С днем знаний!

Con ayuda de SQL Server como detectar puntos claves que ayudan al performance general de Dynamics AX 2012

Hola,

El performance de nuestros ambientes de Dynamics AX 2012, siempre es un tema que involucra muchas horas de inversión en detallar la causa o cuáles son los puntos que debemos mejorar en base a las Best Practices que Microsoft sugiere. El siguiente blog desarrollado por Glen Turnbull les ayudará con este tema. 

 

http://blogs.msdn.com/b/axsupport/archive/2014/09/01/microsoft-dynamics-ax-general-performance-analysis-scripts.aspx 

 

Espero les sirva…

Unit Testing MDX

I was recently asked if it was possible to do some smoke testing on new deployments of SQL Server Analysis Services cubes. My initial answer was “yes, of course” – then someone asked me to actually do it. It turns out to be as easy as I thought it was but I wasn’t able to find any particular blog posts regarding how to do it so here goes. In order to perform unit tests against a cube, do the following:

  1. Create a new C# (or VB) Unit Test Project
  2. From the SQL Server 2014 (or SQL Server 2012 – but for SQL Server 2012 this is all built into Visual Studio) feature pack download page (http://www.microsoft.com/en-us/download/details.aspx?id=42295) select Download and select the 32 or 64 bit version of ADOMD.NET
  3. Add a reference to the Microsoft.AnalysisServices.AdomdClient.dll (located in C:Program FilesMicrosoft.NETADOMD.NET120)
  4. Add a reference to System.Data
  5. Import the namespace Microsoft.AnalysisServices.Adomd

You’re ready to go. The following is a simple unit test again the TFS Analysis cube:

  1: using System;
  2: using Microsoft.VisualStudio.TestTools.UnitTesting;
  3: using Microsoft.AnalysisServices.AdomdClient;
  4: using System.Diagnostics;
  5: 
  6: namespace dwUnitTests
  7: {
  8:     [TestClass]
  9:     public class UnitTest1
 10:     {
 11:         [TestMethod]
 12:         public void TestMethod1()
 13:         {
 14:             //Create the connection to the cube using integrated authentication
 15:             AdomdConnection connection = new AdomdConnection("Data Source=Olympia;Initial Catalog=Tfs_Analysis");
 16:             //Create the command and initialize it
 17:             AdomdCommand command = new AdomdCommand();
 18:                         
 19:             //Provide the MDX to retrieve data from the cube
 20:             command.CommandText = "SELECT NON EMPTY { [Measures].[Work Item Count] } ON COLUMNS, " 
 21:                 + "NON EMPTY { ([Work Item].[System_WorkItemType].[System_WorkItemType].ALLMEMBERS ) } ON ROWS "
 22:                 + "FROM [Team System]";
 23: 
 24:             //Set the connection for the command
 25:             command.Connection = connection;
 26: 
 27:             //Open a connection to the cube
 28:             connection.Open();
 29: 
 30:             //Retrieve the data
 31:             CellSet cs = command.ExecuteCellSet();
 32: 
 33:             //Close the connection
 34:             connection.Close();
 35: 
 36:             //Validate the data
 37:             Assert.IsTrue(cs.Axes[1].Positions[0].Members[0].Name == "[Work Item].[System_WorkItemType].&[Bug]");
 38:             Assert.IsTrue((int)cs.Cells[0].Value == 3);
 39:             Assert.IsTrue(cs.Axes[1].Positions[1].Members[0].Name == "[Work Item].[System_WorkItemType].&[Product Backlog Item]");
 40:             Assert.IsTrue((int)cs.Cells[1].Value == 1);
 41:             Assert.IsTrue(cs.Axes[1].Positions[2].Members[0].Name == "[Work Item].[System_WorkItemType].&[Task]");
 42:             Assert.IsTrue((int)cs.Cells[2].Value == 4);
 43:             Assert.IsTrue(cs.Axes[1].Positions[3].Members[0].Name == "[Work Item].[System_WorkItemType].&[Test Case]");
 44:             Assert.IsTrue((int)cs.Cells[3].Value == 2);
 45:         }
 46:     }
 47: }
 48: 

A couple of things to make life easier. I don’t write MDX that often and I can never remember the syntax when I have to. I had though that the most difficult part of this would be creating the select statement (line 20). It turns out you can do it without any work at all. To generate the MDX statement:

  • Open SQL Server Management Studio and connect to your cube
  • Browse the cube and create the dataset that you want returned as shown in Figure 1

image

Figure 1 – Browse view of an Analysis Services cube

  • Next, click the Design button on the right side of the toolbar to unselect it which results in the view shown in Figure 2

image

Figure 2 – MDX View to provide the result set shown in Figure 1

  • At this point, just copy the MDX, remove the formatting options (including and everything following the “Cell Properties”) and you’re done!

A word of caution on the Assert statements. I am using Axes and Positions to get the values here because I am using ExecuteCellSet to retrieve the data. There are other methods of retrieving the data so be careful when constructing the assert statements. It took me a bit of trial and error to be able to drill through the object model in debug mode to figure out what I should be testing.

And that’s it – you can now perform quality checks on the results of a cube to ensure that the cube is processing correctly. This probably does not apply to very many people but for those that it does apply to, using proper software development techniques for cube development is every bit as important as using these techniques elsewhere. Maybe more so because end users rely on data from cubes to drive business decisions – if this data is wrong…

Activating Azure without Credit Card utilizing MSDN Subscription

The wait is finally over. Microsoft Azure is generally available in Bangladesh now. You can either try for free trial for one month entitling to $200 Azure credit, but you’d require an international credit/debit card OR dollar endorsed to your local credit card for foreign travel to activate that although you will not be charged until the period is expired or you’ve overspent that $200. However, if credit card is a hassle for you, you have a great option of MSDN Subscription.

If you/your company already has MSDN Subscription OR you’re a Microsoft Student Partner (MSP), you can activate your monthly up to $150 Azure benefit by following simple steps:

1

  • You will be navigated to the following page. Fill in the required information. Once you have completed the mobile verification in Step 2, the sign up button will be activated. Click on “Sign up”

1

  • After clicking on the “Sign up” button you will be navigated to the following page. Wait and refresh at intervals until the subscription is activated. The status will be changed from “Pending” to “Active” when the subscription becomes active.

4

  • Next click on the active subscription – “Visual Studio Ultimate with MSDN”

5

You can use this portal:

  • to set up new services, resources and components
  • to get immediate control of your services, resources and components.
  • to get notifications

Congratulations, your Azure account is all set up and good to go. You can now start creating websites, virtual machines, mobile services, cloud services, SQL Databases and a lot more with Microsoft Azure.

Article courtesy: Anika Sayara