Tuesday, April 26, 2011

Simply SaaS (Part 3)

This is part three of a multi part series where I will talk about what it means to develop and deliver a Software-as-a-Service application. I'll be trying to strike a balance between the technical aspects of bringing an app into the cloud and the advantages of using the SaaS approach as an Independent Software Vendor (ISV). I am NOT an expert in SaaS by any means...I'm writing this to educate myself and hopefully any reader that has the same curiosity. Your mileage may vary.


In the last post we talked about a sample SaaS application to be developed, discussed getting started with our development framework (SaaSGrid Express), and covered setting up our deployment infrastructure (Amazon EC2). With this post we will take a look at the SaaSGrid SDK in action to give a better idea of how easy it is to SaaS-enable a .NET application. To get started we need the following:
  1. Visual Studio 2010 - Since I don't own a copy of Visual Studio, I decided to give the 30 day trial a spin for this exercise. Although I didn't try it you can use the Express version of VS with SaaSGrid if you follow the instructions here.
  2. SaaSGrid SDK - You may have already installed this when you installed SaaSGrid. If not you can download it here.
  3. Familiarity with Windows Communication Foundation (WCF). It's pretty much essential to all things SaaSGrid. I'd highly recommend the book "Programming WCF Services" if your knowledge is advanced enough to circumvent the Hello World tutorial and move directly into best practices.
  4. You should read the "Developer Topics" section of the SaaSGrid Developer Guide at a minimum - if you are really serious about using SaaSGrid you should take the time to work your way through the guide in its entirety before you sit down to develop.
In order for SaaSGrid to function properly, your Visual Studio project must adhere to a semi-rigid structure. The project must consist of a root project that houses the Web UI and one or more projects that contain the WCF services needed to make your Web UI function. Additionally a "Database Scripts" folder with a file called ApplicationProvisioning_Script.sql must contain the SQL necessary to build the table structure(s) for your WCF services to use. For my project I relied on the SaaSGrid template (that's included in the install of the SDK) to provide the basic structure. I ended up replacing the root web application project with an ASP.NET MVC 2 web application project since I was interested in checking out the .NET MVC framework. If you follow a similar path be sure to copy the SaaSGrid.cfg.xml file from the original root web application. 


In a SaaSGrid application WCF services will provide the majority of the application's functionality. This paradigm doesn't fit the traditional MVC development methodology but I was able to find some people that took the same plunge. Additionally, If you're like me and think most modern web applications will have a mobile counterpart, the push to a "pure" service oriented web application is a good thing. Not only will your application be ready to scale at the click of a button - you'll be able to pump out a mobile app without the added effort of exposing your application's business logic after the fact. Sweet. 

Recalling the description I gave for the sample application, a movie buff (Fred Film) will be able to manage a list of his/her favorite movies. Movie rental store owners (Ralph Rental) will be able to connect with users like Fred Film and tell Fred how many copies of his favorite movies they have in stock so that Fred can plan accordingly before heading out to the store. As an added bonus Ralph will be able to collect demographic information on users like Fred and perform some very simple analysis on his client base so that he can optimize his marketing strategies moving forward. Since we are building one application instead of two separate apps (one for the general public and another for store owners) we need to define the features of the application that will be for paying subscribers (i.e., store owners) only:
  • The ability to set the inventory level for a given movie
  • Associate a movie with the store
  • Provide 10 reports a month that show the number of users (based on zip code) connected to the subscribers store
At a general level, here are the features of the application that the general public can use:
  • Find and associate with a local rental store
  • Add favorite movies
  • View the inventory level of the user's favorite movie at his/her local rental store
Another great feature about SaaSGrid is that it controls the account (and role) creation for all users of your application. We can organize the functionality that we need to implement into the various roles and start coding. Let's take a look at our first SaaSGrid enabled method signature in a service interface we've defined for a rental store owner:

The FaultContract attribute will raise an exception if there is a failed authorization when trying to execute the implemented version of this method. This attribute indicates that the implemented function will contain SaaSGrid authorization. Now let's look at the implemented method for the signature above:


The Secured attribute in the implemented method defines a role based operation for associating a movie to a store. As you can see there is very little effort for this level of granularity. In fact all we are doing is decorating the method with an attribute - no code change required! Also note that I'm taking advantage of the TenantId instead of making the developer supply a Guid for a given store. The SaaSGrid SDK provides access to a series of heirarchal contexts (e.g., ProviderContext, TenantContext) allowing developers to access relevant details about the current tenant, user, provider, etc. This concept is another reason why it's important to go through the SaaSGrid Developer Guide. This post provides some additional details on accessing information that belongs to tenant's outside of the scope of the current context.


To help with testing your application locally you'll need to use the Mocker application (installed as part of the SDK) to add sample tenants, users, roles, as well as securables. You will need to define a securable for each Secured attribute that's in your application (essentially the attribute value is the securable definition). When you define each role you'll assign one or more securables to a role to define permissions. Moving on, roles are assigned to users and users belong to a tenant (or subscriber). Finally, before you launch the debugger for your WCF services and your web app, you will need to create the database and tables by executing the SQL contained in the ApplicationProvisioning_Script.sql script that was previously defined.


In the next post I'll show case some snippets that highlight finer grained monetization constructs, discuss how to package your application for deployment, discuss the product management features included with SaaSGrid, and talk about versioning your application. Enjoy!

Tuesday, April 12, 2011

Simply SaaS (Part 2)

This is part two of a multi part series where I will talk about what it means to develop and deliver a Software-as-a-Service application. I'll be trying to strike a balance between the technical aspects of bringing an app into the cloud and the advantages of using the SaaS approach as an Independent Software Vendor (ISV). I am NOT an expert in SaaS by any means...I'm writing this to educate myself and hopefully any reader that has the same curiosity. Your mileage may vary.

In Part 1 I provided a general overview on what it means to develop and deliver a SaaS application. In this post I will outline an example application and discuss the infrastructure I will be using to deploy my app into the cloud. This discussion should demonstrate the benefits of why SaaS applications are awesome from the perspective of a developer and a business owner (ISV). 


Since the intent of this series is to talk about SaaS (and not about original ideas for future SaaS applications) I didn't put a lot of creative thought into my example. The premise of the application is pretty simple...we are going to take the ASP.NET MVC Movie Tutorial (let's call it MoviesAndYou) and add the ability for brick-and-mortar movie rental stores to communicate with their customers. I decided on this example because I wanted to build a .NET application using the ASP.NET MVC framework and I also wanted an opportunity to try out Apprenda's SaaSGrid Express product. The application will have two types of users:

  1. Let's call the first user Fred Film. This guy loves movies and uses MoviesAndYou to manage a list of movies that he has watched. Fred rates each movie he watches and likes to rent his favorite movies frequently from his local store. Fred doesn't want to pay for the MoviesAndYou service.
  2. The second user will be Ralph Rental. Ralph owns several movie rental stores (as in brick-and-mortar) near Fred. Ralph would like to let his customers know the availability of the movies in his stores so that the customer can reserve the movie online and pick it up in store. Ralph sees the value in having an online reservation system but cannot afford to pay a large upfront fee for this service.

Seem easy enough? Ralph will be paying monthly for the online reservation system. Each store he owns can be thought of as a traditional software license seat. To start, Ralph will introduce the system in one store and then expand to include other stores as he realizes an increase in business from the online reservation system. For the sake of this example we'll pretend that brick-and-mortar rentals stores still exist!

From the ISV's perspective, MoviesAndYou is going to be a single web application. Roles will be used to delineate between consumers and brick-and-mortar users. The data for all users will be stored in a single, logical database. From my last post we know that the SaaSGrid framework will take care of co-mingling the database records so that the developer doesn't have to worry about setting up a new database instance each time a new brick-and-mortar customer subscribes. With SaaSGrid you're able to bring new customers online with a few clicks of the mouse - no messy deployment/configuration scripts. Additionally SaaSGrid provides the infrastructure for metering and billing of your application (that will be covered later). At the end of the day the ISV can focus on the functional aspects of their application instead of stressing out over infrastructure.


We have the business case laid out for the application and we also have our technology selected. To get started developing with SaaSGrid we need a place where we can install the framework. Since I don't have a spare server laying around, I thought this would be a great opportunity to get my feet wet with an Amazon EC2 windows instance.

Getting Started with Amazon EC2
I found the signup process to be straightforward enough for EC2 that I'm not going to cover that here. Once I had my account setup I selected a Windows Server 2008 with SQL Server Express + IIS instance to deploy to. Once you complete the sign up process and select the appropriate AMI you'll need to login to the EC2 console to access your instance. From here you're able to get the connection details that will allow you to remote desktop into your instance and start the install of SaaSGridExpress.


Before you get started installing SaaSGrid make sure you can successfully connect to the SQL Server Express service. At the time of this writing, the SQL Server Express service is set to 'Manual' by default and is not running out of the box. Open up the Server Manager and browse through the Services MMC and set all of the SQL Server Express services to start automatically. I wasn't able to get the SQL Server Agent to start but found that it wasn't necessary to have a successful install of SaaSGrid. With all of the services running, open up SQL Server Management Studio and connect to the .\EC2SQLEXPRESS instance using Windows Authentication. Once you've done that then move on to installing SaaSGrid.

Installing SaaSGridExpress on Your EC2 Instance
The installer for SaaSGrid will first validate your EC2 instance to ensure that all of the necessary services are in place for the framework to operate. Don't be surprised if this process finds some issues with your configuration - a 'repair' button is provided in most cases where the minimum requirements aren't met. Also be aware that some of the repairs will require you to restart the server. 


After validation, the actual installation will take place. Since I'm using an inexpensive EC2 instance (in other words it doesn't have a lot of horse power) the install process took a fair amount of time (approx. one hour). Once the initial install has completed, you'll be prompted to install the administrative tools and SDK.


Finally, even though I didn't receive any warnings during the install I was getting a 500.21 error when trying to view any of the SaaSGrid related apps deployed to IIS. Not to worry, Apprenda has a pretty active developer community. I searched for the error and found this post. Since the fix described there assumes .NET 2.0 I had to update the command to run in .NET 4.0 - also note that you'll need to navigate to the Framework64 folder if the EC2 AMI you selected is 64-bit.




Note: It was my experience that if you need to re-install SaaSGrid be sure to perform a complete uninstall before going through the installation process again. For some reason I didn't have any luck with the 'reinstall' feature.


Now we are all setup to build our application. In the next post I'll take a look at the SDK provided by SaaSGrid...