This repository contains the code for the Cloud Controller. The NG signifies that this is a "next generation" component and this is not backward-compatible with the original cloud_controller. This version adds significant new functionality including the additional mandatory "organization" and "space" hierarchy that all users, applications and services must use.
The Cloud Controller itself is written in Ruby and provides REST API endpoints for clients to access the system. The Cloud Controller maintains a database with tables for orgs, spaces, apps, services, service instances, user roles, and more.
The Cloud Controller database has been tested with Postgres, Mysql, and Sqlite.
The Cloud Controller manages a blob store for:
-
resources - files that are uploaded to the Cloud Controller with a unique SHA such that they can be reused without re-uploading the file
-
app packages - unstaged files that represent an application
-
droplets - the result of taking an app package and staging it (processesing a buildpack) and getting it ready to run
The blob store uses FOG such that it can use abstractions like Amazon S3 or an NFS-mounted file system for storage.
The Cloud Controller interacts with other core components of the Cloud Foundry platform using the NATS message bus. For example, it performs the following using NATS:
- Instructs a DEA to stage an application (processes a buildpack for the app) to prepare it to run
- Instructs a DEA to start or stop an application
- Receives information from the Health Manager about applications
By default rspec
will run test suite with sqlite3 in-memory database;
however, you can specify connection string via DB_CONNECTION
environment
variable to test against postgres and mysql. Examples:
DB_CONNECTION="postgres://postgres@localhost:5432/ccng" rspec
DB_CONNECTION="mysql2://root:password@localhost:3306/ccng" rspec
Travis currently runs 3 build jobs against sqlite, postgres, and mysql.
The development team typically will run the specs to a single file as (e.g.)
bundle exec rspec spec/controllers/runtime/users_controller_spec.rb
There are a very large number of tests in Cloud Controller, so the development team typically uses parallel_rspec:
bundle exec parallel_rspec spec -s integration
It is important to remember to use -s integration
to force all the integration specs to run in the same process.
Without it, you will see failures due to two tests trying to start NATS on the same port at the same time, for instance.
To genenerate the API documentation
bundle exec rspec spec/api/ --format RspecApiDocumentation::ApiFormatter
open doc/api/index.html
Cloud Controller uses Steno to manage its logs. Each log entry includes a "source" field to designate which module in the code the entry originates from. Some of the possible sources are 'cc.app', 'cc.app_stager', 'cc.dea.client' and 'cc.healthmanager.client'.
Here are some use cases for the different log levels:
error
- the CC received a malformed HTTP request, or a request for a non-existent dropletwarn
- the CC failed to delete a droplet, CC received a request with an invalid auth tokeninfo
- CC received a token from UAA, CC received a NATS requestdebug2
- CC created a service, updated a servicedebug
- CC syncs resource pool, CC uploaded a file
The logs for database migrations are written to standard out.
The Cloud Controller uses a YAML configuration file.
For an example, see config/cloud_controller.yml
.
Some of the keys that are read from this configuration file are:
logging
- a steno configuration hashbulk_api
- basic auth credentials for the application state bulk API. In Cloud Foundry, this endpoint is used by the health manager to retrieve the expected state of every user application.uaa
- URL and credentials for connecting to the UAA, Cloud Foundry's OAuth 2.0 server.
Please read the contributors' guide