The Cloud Foundry Blog

Next Generation Cloud Controller: The VMC View

In my last post, I introduced you to some of the new features we are rolling out with the new cloud controller. For reference, I’ve included a block diagram of the new structure to refresh your memory.

In the previous post, the focus was on introducing the objects and briefly discussing how they are used for operational collaboration. In this post, I want to show you how the objects are used for resource accounting, how to navigate around the objects using the Cloud Foundry Command Line Interface (VMC), and then briefly show how features like custom domains use these objects as their foundation.

Resource Accounting

From the diagram above, you can see how the organization (a.k.a., org) object acts as the root object holding a collection of spaces. Each space contains a number of applications and service instances. From a resource tracking perspective, what this means is that we can easily account for memory and services in aggregate at both the space and organization level.

If you used an org to represent a project, and then used spaces to hold your production apps, your staging playground, and a playground for each developer, you might end up with a structure that looks something like this:

org: mhlsoft
  spaces:
    - name: production
      - apps:
        - name: pds
    - name: staging
      - apps:
        - name: pds
    - name: markl
      - apps:
        - name: pds_ng_node
        - name: pds
    - name: patb
      - apps:
        - name: pds_ng_go

With this structure in place, Cloud Foundry is able to tell you the resource consumption of each space and the aggregate consumption across the entire org.

Suppose your Cloud Foundry provider sold you 16GB of RAM for $380/mo. It would be nice to know how much memory you are using in aggregate, how much is being spent on your production facing apps, and how much is being used for internally facing playgrounds.

The next generation cloud controller is designed to support exactly this scenario. This allows Cloud Foundry tooling to show an organization summary like this:

The same tooling could also show a space summary, for each space, that might look something like this:

From this small description, you can see how the next generation system is designed to support the resource accounting and quota enforcement requirements of a wide variety of commercial systems based on Cloud Foundry.

Navigation with VMC

Enough of the system is working now where we can run the next generation cloud controller alongside the existing cloud controller. Given where we are with the work, I thought it would be a good idea to show you how to navigate around the system using the next generation VMC while targeting a next generation cloud controller.

The first thing to note is that we have extended the “vmc target” command to accept an optional org and space switch:

$ vmc help target
Set or display the current target cloud
Usage: target [URL]
Options:
 --url URL Target URL to switch to
 -i, --interactive Interactively select organization/space
 -o, --organization, --org ORGANIZATION Organization 
 -s, --space SPACE Space

The new -o and -s switches allow you to select an org and space within the target cloud. In  one of my test clouds, I have two orgs set up, and in one org have a few spaces, in the other, just a single space. Watch as I navigate around using “vmc target”:

# show my current context (cloud, org, and space)
$ vmc target
target: https://api.fakedomain.com
organization: pds
space: production

# switch to the staging space
$ vmc target -s staging
Switching to space staging... OK
target: https://api.fakedomain.com
organization: pds
space: staging

# switch to my other org
$ vmc target -o mhlsoft
Switching to organization mhlsoft... OK
Switching to space blaster... OK
target: https://api.fakedomain.com
organization: mhlsoft
space: blaster

The new “vmc orgs” command and “vmc spaces” command are simple enumeration commands that display the orgs that the current user belongs to and that she can target, and the spaces within that org:

# enumerate the orgs that are available to be within this cloud
$ vmc orgs
Getting organizations... OK
pds
mhlsoft

# enumerate the spaces within the current org
$ vmc spaces
Getting spaces in pds... OK
markl
production
qa
staging

# enumerate the spaces within my other org
$ vmc spaces -o mhlsoft
Getting spaces in mhlsoft... OK
blaster

The next new command to note is “vmc org”. This command lets you take a look at an org and see its spaces and options.

$ vmc help org
Show organization information
Usage: org [ORGANIZATION]
Options:
     --full                Show full information for an org 
 -o, --organization, --org ORGANIZATION Organization to show 

# show the current org
$ vmc org
pds:
  domains: none
  spaces: markl, production, qa, staging 

# show another org
$ vmc org mhlsoft
mhlsoft:
  domains: none
  spaces: blaster

As a peer to the “vmc org” command, there is the new “vmc space” command. This command lets you take a look at a space and see its org, its apps, its services, and its options:

$ vmc help space
Show space information
Usage: space [SPACE]
Options:
     --full                             Show full information 
     --space SPACE                      Space to show
 -o, --organization, --org ORGANIZATION Space's organization 

# show the current space
$ vmc space
production:
  organization: pds
  apps: pds-mgmt, pds
  services: redis, rabbitmq, redis-stats

# show a different space
$ vmc space staging
staging:
  organization: pds
  apps: stress, pds, pds-mgmt
  services: postgres, redis-e6ebd, rabbitmq-e1a06, redis-stats

As discussed in the previous post, the app names and service names are scoped to a space. This means that you can re-use app names across spaces. To see this from a different command’s perspective, take a look at the enhanced “vmc apps” command:

$ vmc help apps
List your applications
Usage: apps
Options:
     --framework FRAMEWORK    Filter by framework
     --name NAME              Filter by name
     --runtime RUNTIME        Filter by runtime
     --space SPACE            Show apps in a given space
     --url URL                Filter by url

# list apps in the current space
$ vmc apps
Getting applications in production... OK

pds-mgmt: started
  platform: sinatra on ruby19
  usage: 256M × 8 instances
  services: rabbitmq, redis-stats, redis

pds: started
  platform: node on node06
  usage: 256M × 16 instances
  services: redis, redis-stats 

# list only node apps in the staging space
$ vmc apps --space staging --runtime node*
Getting applications in production... OK

stress: started
  platform: node on node06
  usage: 256M × 1 instances
  services: rabbitmq-e1a06

pds: started
  platform: node on node06
  usage: 256M × 1 instances
  services: redis-e6ebd, redis-stats

Hopefully this will give you a good feel for how to use VMC to navigate around the system, how you can segregate apps into spaces, and how these new features will help with basic operational collaboration. All of the code that backs this system is being developed in the open, so poke around the vmc and cloud controller repos if you are curious, or better yet, come on in and help us out!

Organizations, Spaces, and Custom Domains

Finally, some of you very careful readers might have noticed that in the “vmc org” output, there is a row for “domains:”. This code is still under development, part of this phase’s work stream. This is the first step in rolling out official, integrated support for custom domains. We will talk more about this feature as it starts to take form. The short story is simple: an org can be assigned one or more domains or wild-card domains. This same capability extends into spaces with the restriction that a space may only attach to a domain enabled for the org. Once a space is enabled for a domain, then apps within that space can use that domain. Semi-fake output is included below to illustrate this point.

# show the current org, note that
# it's enabled for *.cloudfoundry.com as well
# as a custom wildcard domain
$ vmc org
pds:
  domains: *.cloudfoundry.com, *.mydomain.com
  spaces: markl, production, qa, staging 

# show the production space
# note that it is ONLY enabled for
# the custom domain, production apps
# can not accidentally live on *.cloudfoundry.com
$ vmc space production
production:
  organization: pds
  domains: *.mydomain.com
  apps: pds-mgmt, pds
  services: redis, rabbitmq, redis-stats

# show the staging space
# note that it is ONLY enabled for *.cloudfoundry.com
# staging apps can not accidentally live on *.mydomain.com
$ vmc space staging
staging:
  organization: pds
  domains: *.cloudfoundry.com
  apps: pds-mgmt, pds
  services: redis, rabbitmq, redis-stats

# list apps in production. note their URLs
$ vmc apps --space production
Getting applications in production... OK

pds-mgmt: started
  platform: sinatra on ruby19
  usage: 256M × 8 instances
  urls: manage.mydomain.com
  services: rabbitmq, redis-stats, redis

pds: started
  platform: node on node06
  usage: 256M × 16 instances
  urls: www.mydomain.com, mydomain.com, pds.mydomain.com
  services: redis, redis-stats 

Summary

The next generation cloud controller introduces the new organization and space objects. These objects provide the foundation for a wide range of commercial class features including operational collaboration, advanced quota management and control, custom domains, etc. While the code speaks for itself, I will continue to provide added color and commentary in these blog posts.

-markl Mark Lucovsky, VP of Engineering – Cloud Foundry

This entry was posted in Cloud Foundry. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>