Project to rewrite the Cloud Foundry CLI tool using Go. This project should currently be considered alpha quality software and should not be used in production environments. If you need something more stable, please check out the RubyGem.
For a view on the current status of the project, check cftracker.
Cloning the repository
- Install Go
brew install go --cross-compile-common
- Clone (Fork before hand for development).
git submodule update --init --recursive
The latest binary builds are published to Amazon S3 buckets
- The binary will be built into the out directory.
NOTE: Currently only development on OSX 10.8 is supported
- Write a test.
bin/testand watch test fail.
- Make test pass.
- Submit a pull request.
On linux: run
On mac: run
This will create tgz files in the release folder.
Rough overview of the architecture
The app (in
src/cf/app/app.go) declares the list of available commands. Help and flags are defined there.
It will instantiate a command, and run it using the runner (in
A command has requirements, and a run function. Requirements are used as filters before running the command.
If any of them fails, the command will not run (see
src/cf/requirements for examples of requirements).
When the command is run, it communicates with api using repositories (they are in
Repositories are injected into the command, so tests can inject a fake.
Repositories communicate with the api endpoints through a Gateway (see
Repositories return a Domain Object and an ApiResponse object.
Domain objects are data structures related to Cloud Foundry (see
ApiResponse objects convey a variety of important error conditions (see
Command dependencies are managed by the commands factory. The app uses the command factory (in
to instantiate them, this allows not sharing the knowledge of their dependencies with the app itself.
As for repositories, we use the repository locator to handle their dependencies. You can find it in
Create Space is a good example of command. Its tests include checking arguments, having requirements, and the actual command itself.
You will find it in
Resources that include several commands have been broken out into their own sub-package using the Resource name. An example of this convention is the Space resource and package.
In addition, command file and methods naming follows a CRUD like convention. For example, the Space resource includes commands such a CreateSpace, ListSpaces, etc.
Although not ideal, we use the name "Repository" for API related operations as opposed to "Service". Repository was chosen to avoid confusion with Service domain objects (i.e. creating Services and Service Instances within Cloud Foundry).
By convention, Repository methods return a Domain object and an ApiResponse. Domain objects are used in both Commands and Repositories to model Cloud Foundry data. ApiResponse objects are used to communicate application errors, runtime errors, whether the resource was found, etc. This convention provides a consistent method signature across repositories.