Skip to content

Commit

Permalink
Initial Project Scaffolding (crossplane-contrib#13)
Browse files Browse the repository at this point in the history
Initial Project Scaffolding
  • Loading branch information
Illya Chekrygin authored Sep 14, 2018
1 parent bd1c1ed commit 83dc670
Show file tree
Hide file tree
Showing 41 changed files with 2,832 additions and 1 deletion.
63 changes: 63 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
version: 2

jobs:
build:
machine:
docker_layer_caching: true

steps:
- checkout

- run:
name: Update Submodules
command: git submodule sync && git submodule update --init --recursive

- restore_cache:
keys:
- vendor-{{ checksum "Gopkg.toml" }}-{{ checksum "Gopkg.lock" }}

- run:
name: Prepare
command: |
git config --global user.name "upbound-bot"
echo "machine github.com login upbound-bot password $GITHUB_UPBOUND_BOT" > ~/.netrc
- run:
name: Build validation
command: ./build/run make -j$(nproc) build.all

- run:
name: Unit Tests
command: ./build/run make -j$(nproc) test

- store_test_results:
path: _output/tests

- run:
name: Publish
command: |
docker login -u $DOCKER_USER -p $DOCKER_PASS
./build/run make -j$(nproc) publish BRANCH_NAME=${CIRCLE_BRANCH} AWS_ACCESS_KEY_ID=${AWS_KEY_ID} AWS_SECRET_ACCESS_KEY=${AWS_KEY_SECRET} GIT_API_TOKEN=${GITHUB_UPBOUND_BOT}
if [ "${CIRCLE_BRANCH}" == "master" ]; then
./build/run make -j$(nproc) promote BRANCH_NAME=master CHANNEL=master AWS_ACCESS_KEY_ID=${AWS_KEY_ID} AWS_SECRET_ACCESS_KEY=${AWS_KEY_SECRET}
crumb="$(curl ${JENKINS_CRUMB_URL} --user ${JENKINS_USER}:${JENKINS_TOKEN})"
curl -H ".crumb:${crumb}" -X POST ${JENKINS_DEPLOY_URL} --user ${JENKINS_USER}:${JENKINS_TOKEN} -d "Content-Length:0"
fi
environment:
JENKINS_CRUMB_URL: https://jenkins.upbound.io/crumbIssuer/api/xml\?xpath\=concat\(//crumbRequestField,%22:%22,//crumb\)
JENKINS_DEPLOY_URL: https://jenkins.upbound.io/job/upbound/job/cloud/job/dev/job/master/buildWithParameters

- save_cache:
when: on_success
key: vendor-{{ checksum "Gopkg.toml" }}-{{ checksum "Gopkg.lock" }}
paths:
- vendor/
- ".cache"

- run:
name: Cleanup
when: always
command: |
make -j$(nproc) clean
make -j$(nproc) prune PRUNE_HOURS=48 PRUNE_KEEP=48
docker images
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/.cache
/.work
/_output
cover.out
/vendor
PROJECT
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "build"]
path = build
url = https://github.com/upbound/build
173 changes: 173 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
## How to Contribute

The Conductor project is under [Apache 2.0 license](LICENSE). We accept contributions via
GitHub pull requests. This document outlines some of the conventions related to
development workflow, commit message formatting, contact points and other
resources to make it easier to get your contribution accepted.

## Certificate of Origin

By contributing to this project you agree to the Developer Certificate of
Origin (DCO). This document was created by the Linux Kernel community and is a
simple statement that you, as a contributor, have the legal right to make the
contribution. See the [DCO](DCO) file for details.

Contributors sign-off that they adhere to these requirements by adding a
Signed-off-by line to commit messages. For example:

```
This is my commit message
Signed-off-by: Random J Developer <random@developer.example.org>
```

Git even has a -s command line option to append this automatically to your
commit message:

```
```
$ git commit -s -m 'This is my commit message'

If you have already made a commit and forgot to include the sign-off, you can amend your last commit
to add the sign-off with the following command, which can then be force pushed.

```
git commit --amend -s
```

We use a [DCO bot](https://github.com/apps/dco) to enforce the DCO on each pull
request and branch commits.

## Getting Started

- Fork the repository on GitHub
- Read the [install](INSTALL.md) for build and test instructions
- Play with the project, submit bugs, submit patches!

## Contribution Flow

This is a rough outline of what a contributor's workflow looks like:

- Create a branch from where you want to base your work (usually master).
- Make your changes and arrange them in readable commits.
- Make sure your commit messages are in the proper format (see below).
- Push your changes to the branch in your fork of the repository.
- Make sure all tests pass, and add any new tests as appropriate.
- Submit a pull request to the original repository.

## Coding Style

Conductor projects are written in golang and follows the style guidelines dictated by
the go fmt as well as go vet tools.

## Comments

Comments should be added to all new methods and structures as is appropriate for the coding
language. Additionally, if an existing method or structure is modified sufficiently, comments should
be created if they do not yet exist and updated if they do.

The goal of comments is to make the code more readable and grokkable by future developers. Once you
have made your code as understandable as possible, add comments to make sure future developers can
understand (A) what this piece of code's responsibility is within Conductor's architecture and (B) why it
was written as it was.

The below blog entry explains more the why's and how's of this guideline.
https://blog.codinghorror.com/code-tells-you-how-comments-tell-you-why/

For Go, Conductor follows standard godoc guidelines.
A concise godoc guideline can be found here: https://blog.golang.org/godoc-documenting-go-code

## Commit Messages

We follow a rough convention for commit messages that is designed to answer two
questions: what changed and why. The subject line should feature the what and
the body of the commit should describe the why.

```
ceph: update MON to use rocksdb
this enables us to remove leveldb from the codebase.
```

The format can be described more formally as follows:

```
<subsystem>: <what changed>
<BLANK LINE>
<why this change was made>
<BLANK LINE>
<footer>
```

The first line is the subject and should be no longer than 70 characters, the
second line is always blank, and other lines should be wrapped at 80 characters.
This allows the message to be easier to read on GitHub as well as in various
git tools.


## Adding New Resources

### Project Organization
The Conductor project is based on and intially created by using [Kubebuilder is a framework for building Kubernetes APIs](https://github.com/kubernetes-sigs/kubebuilder).

The Conductor project organizes resources (api types and controllers) by grouping them by Cloud Provider with further sub-group by resource type

The Kubebuilder framework does not provide good support for projects with multiple groups and group tiers which contain resources with overlapping names.
For example:
```
pkg
├── apis
│ ├── aws
│ │ ├── apis.go
│ │ └── database
│ │ ├── group.go
│ │ └── v1alpha1
│ │ ├── doc.go
│ │ ├── rds_instance_types.go
│ │ ├── rds_instance_types_test.go
│ │ ├── register.go
│ │ ├── v1alpha1_suite_test.go
│ │ └── zz_generated.deepcopy.go
│ └── gcp
│ ├── apis.go
│ └── database
│ ├── group.go
│ └── v1alpha1
│ ├── cloudsql_instance_types.go
│ ├── cloudsql_instance_types_test.go
│ ├── doc.go
│ ├── register.go
│ ├── v1alpha1_suite_test.go
│ └── zz_generated.deepcopy.go
└── controller
├── aws
│ ├── controller.go
│ └── database
│ ├── database_suite_test.go
│ ├── rds_instance.go
│ └── rds_instance_test.go
└── gcp
├── controller.go
└── database
├── cloudsql_instance.go
├── cloudsql_instance_test.go
└── database_suite_test.go
```
In above example we have two groups with sub-group (tiers):
- aws/rds
- gcp/cloudsql
In addition both groups contain types with the same name: `Instance`

### Creating New Resource
There are several different ways you can approach the creation of the new resources:
#### Manual
Good ol' copy & paste of existing resource for both apis and controller (if new controller is needed) and update to tailor your needs.

#### Kubebuilder With New Project
Create and Initialize a new (temporary) kubebuilder project and create new resources: apis and controller(s), then copy them into Conductor project following the established project organization.

To verify that new artifacts run:
```bash
make build test
```
To locally test new types/controllers please refer to [Local Build](/cluster/local/README.md) instructions.
36 changes: 36 additions & 0 deletions DCO
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
Developer Certificate of Origin
Version 1.1

Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
660 York Street, Suite 102,
San Francisco, CA 94110 USA

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.


Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or

(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or

(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.

(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
Loading

0 comments on commit 83dc670

Please sign in to comment.