parent
bd1c1ed286
commit
0b2b66b5e6
|
@ -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
|
|
@ -0,0 +1,6 @@
|
||||||
|
/.cache
|
||||||
|
/.work
|
||||||
|
/_output
|
||||||
|
cover.out
|
||||||
|
/vendor
|
||||||
|
PROJECT
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "build"]
|
||||||
|
path = build
|
||||||
|
url = https://github.com/upbound/build
|
|
@ -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.
|
|
@ -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.
|
|
@ -0,0 +1,673 @@
|
||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||||
|
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "cloud.google.com/go"
|
||||||
|
packages = ["compute/metadata"]
|
||||||
|
revision = "c728a003b238b26cef9ab6753a5dc424b331c3ad"
|
||||||
|
version = "v0.27.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/davecgh/go-spew"
|
||||||
|
packages = ["spew"]
|
||||||
|
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
|
||||||
|
version = "v1.1.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/emicklei/go-restful"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"log"
|
||||||
|
]
|
||||||
|
revision = "3eb9738c1697594ea6e71a7156a9bb32ed216cf0"
|
||||||
|
version = "v2.8.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/ghodss/yaml"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/go-logr/logr"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "9fb12b3b21c5415d16ac18dc5cd42c1cfdd40c4e"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/go-logr/zapr"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "7536572e8d55209135cd5e7ccf7fce43dca217ab"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/gobuffalo/envy"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "3c96536452167a705ca5a70b831d3810e1e10452"
|
||||||
|
version = "v1.6.4"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/gogo/protobuf"
|
||||||
|
packages = [
|
||||||
|
"proto",
|
||||||
|
"sortkeys"
|
||||||
|
]
|
||||||
|
revision = "636bf0302bc95575d69441b25a2603156ffdddf1"
|
||||||
|
version = "v1.1.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/golang/glog"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/golang/groupcache"
|
||||||
|
packages = ["lru"]
|
||||||
|
revision = "24b0969c4cb722950103eed87108c8d291a8df00"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/golang/protobuf"
|
||||||
|
packages = [
|
||||||
|
"proto",
|
||||||
|
"ptypes",
|
||||||
|
"ptypes/any",
|
||||||
|
"ptypes/duration",
|
||||||
|
"ptypes/timestamp"
|
||||||
|
]
|
||||||
|
revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5"
|
||||||
|
version = "v1.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/google/btree"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/google/gofuzz"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/googleapis/gnostic"
|
||||||
|
packages = [
|
||||||
|
"OpenAPIv2",
|
||||||
|
"compiler",
|
||||||
|
"extensions"
|
||||||
|
]
|
||||||
|
revision = "7c663266750e7d82587642f65e60bc4083f1f84e"
|
||||||
|
version = "v0.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/gregjones/httpcache"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"diskcache"
|
||||||
|
]
|
||||||
|
revision = "9cad4c3443a7200dd6400aef47183728de563a38"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/hashicorp/golang-lru"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"simplelru"
|
||||||
|
]
|
||||||
|
revision = "20f1fb78b0740ba8c3cb143a61e86ba5c8669768"
|
||||||
|
version = "v0.5.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/hpcloud/tail"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"ratelimiter",
|
||||||
|
"util",
|
||||||
|
"watch",
|
||||||
|
"winfile"
|
||||||
|
]
|
||||||
|
revision = "a30252cb686a21eb2d0b98132633053ec2f7f1e5"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/imdario/mergo"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "9f23e2d6bd2a77f959b2bf6acdbefd708a83a4a4"
|
||||||
|
version = "v0.3.6"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/inconshreveable/mousetrap"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
||||||
|
version = "v1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/joho/godotenv"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "23d116af351c84513e1946b527c88823e476be13"
|
||||||
|
version = "v1.3.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/json-iterator/go"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "1624edc4454b8682399def8740d46db5e4362ba4"
|
||||||
|
version = "v1.1.5"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/markbates/inflect"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "dd7de90c06bca70f18136e59dec2270c19a401e7"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/modern-go/concurrent"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94"
|
||||||
|
version = "1.0.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/modern-go/reflect2"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd"
|
||||||
|
version = "1.0.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/onsi/ginkgo"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"config",
|
||||||
|
"internal/codelocation",
|
||||||
|
"internal/containernode",
|
||||||
|
"internal/failer",
|
||||||
|
"internal/leafnodes",
|
||||||
|
"internal/remote",
|
||||||
|
"internal/spec",
|
||||||
|
"internal/spec_iterator",
|
||||||
|
"internal/specrunner",
|
||||||
|
"internal/suite",
|
||||||
|
"internal/testingtproxy",
|
||||||
|
"internal/writer",
|
||||||
|
"reporters",
|
||||||
|
"reporters/stenographer",
|
||||||
|
"reporters/stenographer/support/go-colorable",
|
||||||
|
"reporters/stenographer/support/go-isatty",
|
||||||
|
"types"
|
||||||
|
]
|
||||||
|
revision = "3774a09d95489ccaa16032e0770d08ea77ba6184"
|
||||||
|
version = "v1.6.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/onsi/gomega"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"format",
|
||||||
|
"gbytes",
|
||||||
|
"gexec",
|
||||||
|
"internal/assertion",
|
||||||
|
"internal/asyncassertion",
|
||||||
|
"internal/oraclematcher",
|
||||||
|
"internal/testingtsupport",
|
||||||
|
"matchers",
|
||||||
|
"matchers/support/goraph/bipartitegraph",
|
||||||
|
"matchers/support/goraph/edge",
|
||||||
|
"matchers/support/goraph/node",
|
||||||
|
"matchers/support/goraph/util",
|
||||||
|
"types"
|
||||||
|
]
|
||||||
|
revision = "7615b9433f86a8bdf29709bf288bc4fd0636a369"
|
||||||
|
version = "v1.4.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/petar/GoLLRB"
|
||||||
|
packages = ["llrb"]
|
||||||
|
revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/peterbourgon/diskv"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "5f041e8faa004a95c88a202771f4cc3e991971e6"
|
||||||
|
version = "v2.0.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/pkg/errors"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||||
|
version = "v0.8.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/spf13/afero"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"mem"
|
||||||
|
]
|
||||||
|
revision = "d40851caa0d747393da1ffb28f7f9d8b4eeffebd"
|
||||||
|
version = "v1.1.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/spf13/cobra"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385"
|
||||||
|
version = "v0.0.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/spf13/pflag"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "9a97c102cda95a86cec2345a6f09f55a939babf5"
|
||||||
|
version = "v1.0.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "go.uber.org/atomic"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289"
|
||||||
|
version = "v1.3.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "go.uber.org/multierr"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a"
|
||||||
|
version = "v1.1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "go.uber.org/zap"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"buffer",
|
||||||
|
"internal/bufferpool",
|
||||||
|
"internal/color",
|
||||||
|
"internal/exit",
|
||||||
|
"zapcore"
|
||||||
|
]
|
||||||
|
revision = "ff33455a0e382e8a81d14dd7c922020b6b5e7982"
|
||||||
|
version = "v1.9.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/crypto"
|
||||||
|
packages = ["ssh/terminal"]
|
||||||
|
revision = "0e37d006457bf46f9e6692014ba72ef82c33022c"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/net"
|
||||||
|
packages = [
|
||||||
|
"context",
|
||||||
|
"context/ctxhttp",
|
||||||
|
"html",
|
||||||
|
"html/atom",
|
||||||
|
"html/charset",
|
||||||
|
"http/httpguts",
|
||||||
|
"http2",
|
||||||
|
"http2/hpack",
|
||||||
|
"idna"
|
||||||
|
]
|
||||||
|
revision = "26e67e76b6c3f6ce91f7c52def5af501b4e0f3a2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/oauth2"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"google",
|
||||||
|
"internal",
|
||||||
|
"jws",
|
||||||
|
"jwt"
|
||||||
|
]
|
||||||
|
revision = "d2e6202438beef2727060aa7cabdd924d92ebfd9"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/sys"
|
||||||
|
packages = [
|
||||||
|
"unix",
|
||||||
|
"windows"
|
||||||
|
]
|
||||||
|
revision = "d0be0721c37eeb5299f245a996a483160fc36940"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "golang.org/x/text"
|
||||||
|
packages = [
|
||||||
|
"collate",
|
||||||
|
"collate/build",
|
||||||
|
"encoding",
|
||||||
|
"encoding/charmap",
|
||||||
|
"encoding/htmlindex",
|
||||||
|
"encoding/internal",
|
||||||
|
"encoding/internal/identifier",
|
||||||
|
"encoding/japanese",
|
||||||
|
"encoding/korean",
|
||||||
|
"encoding/simplifiedchinese",
|
||||||
|
"encoding/traditionalchinese",
|
||||||
|
"encoding/unicode",
|
||||||
|
"internal/colltab",
|
||||||
|
"internal/gen",
|
||||||
|
"internal/tag",
|
||||||
|
"internal/triegen",
|
||||||
|
"internal/ucd",
|
||||||
|
"internal/utf8internal",
|
||||||
|
"language",
|
||||||
|
"runes",
|
||||||
|
"secure/bidirule",
|
||||||
|
"transform",
|
||||||
|
"unicode/bidi",
|
||||||
|
"unicode/cldr",
|
||||||
|
"unicode/norm",
|
||||||
|
"unicode/rangetable"
|
||||||
|
]
|
||||||
|
revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0"
|
||||||
|
version = "v0.3.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/time"
|
||||||
|
packages = ["rate"]
|
||||||
|
revision = "fbb02b2291d28baffd63558aa44b4b56f178d650"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/tools"
|
||||||
|
packages = [
|
||||||
|
"go/ast/astutil",
|
||||||
|
"imports",
|
||||||
|
"internal/fastwalk"
|
||||||
|
]
|
||||||
|
revision = "677d2ff680c188ddb7dcd2bfa6bc7d3f2f2f75b2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "google.golang.org/appengine"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"internal",
|
||||||
|
"internal/app_identity",
|
||||||
|
"internal/base",
|
||||||
|
"internal/datastore",
|
||||||
|
"internal/log",
|
||||||
|
"internal/modules",
|
||||||
|
"internal/remote_api",
|
||||||
|
"internal/urlfetch",
|
||||||
|
"urlfetch"
|
||||||
|
]
|
||||||
|
revision = "b1f26356af11148e710935ed1ac8a7f5702c7612"
|
||||||
|
version = "v1.1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "gopkg.in/fsnotify.v1"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9"
|
||||||
|
source = "https://github.com/fsnotify/fsnotify.git"
|
||||||
|
version = "v1.4.7"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "gopkg.in/inf.v0"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf"
|
||||||
|
version = "v0.9.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "v1"
|
||||||
|
name = "gopkg.in/tomb.v1"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "dd632973f1e7218eb1089048e0798ec9ae7dceb8"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "gopkg.in/yaml.v2"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183"
|
||||||
|
version = "v2.2.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "k8s.io/api"
|
||||||
|
packages = [
|
||||||
|
"admissionregistration/v1alpha1",
|
||||||
|
"admissionregistration/v1beta1",
|
||||||
|
"apps/v1",
|
||||||
|
"apps/v1beta1",
|
||||||
|
"apps/v1beta2",
|
||||||
|
"authentication/v1",
|
||||||
|
"authentication/v1beta1",
|
||||||
|
"authorization/v1",
|
||||||
|
"authorization/v1beta1",
|
||||||
|
"autoscaling/v1",
|
||||||
|
"autoscaling/v2beta1",
|
||||||
|
"batch/v1",
|
||||||
|
"batch/v1beta1",
|
||||||
|
"batch/v2alpha1",
|
||||||
|
"certificates/v1beta1",
|
||||||
|
"core/v1",
|
||||||
|
"events/v1beta1",
|
||||||
|
"extensions/v1beta1",
|
||||||
|
"networking/v1",
|
||||||
|
"policy/v1beta1",
|
||||||
|
"rbac/v1",
|
||||||
|
"rbac/v1alpha1",
|
||||||
|
"rbac/v1beta1",
|
||||||
|
"scheduling/v1alpha1",
|
||||||
|
"scheduling/v1beta1",
|
||||||
|
"settings/v1alpha1",
|
||||||
|
"storage/v1",
|
||||||
|
"storage/v1alpha1",
|
||||||
|
"storage/v1beta1"
|
||||||
|
]
|
||||||
|
revision = "2d6f90ab1293a1fb871cf149423ebb72aa7423aa"
|
||||||
|
version = "kubernetes-1.11.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "k8s.io/apiextensions-apiserver"
|
||||||
|
packages = [
|
||||||
|
"pkg/apis/apiextensions",
|
||||||
|
"pkg/apis/apiextensions/v1beta1",
|
||||||
|
"pkg/client/clientset/clientset",
|
||||||
|
"pkg/client/clientset/clientset/scheme",
|
||||||
|
"pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
|
||||||
|
]
|
||||||
|
revision = "408db4a50408e2149acbd657bceb2480c13cb0a4"
|
||||||
|
version = "kubernetes-1.11.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "k8s.io/apimachinery"
|
||||||
|
packages = [
|
||||||
|
"pkg/api/errors",
|
||||||
|
"pkg/api/meta",
|
||||||
|
"pkg/api/resource",
|
||||||
|
"pkg/apis/meta/internalversion",
|
||||||
|
"pkg/apis/meta/v1",
|
||||||
|
"pkg/apis/meta/v1/unstructured",
|
||||||
|
"pkg/apis/meta/v1beta1",
|
||||||
|
"pkg/conversion",
|
||||||
|
"pkg/conversion/queryparams",
|
||||||
|
"pkg/fields",
|
||||||
|
"pkg/labels",
|
||||||
|
"pkg/runtime",
|
||||||
|
"pkg/runtime/schema",
|
||||||
|
"pkg/runtime/serializer",
|
||||||
|
"pkg/runtime/serializer/json",
|
||||||
|
"pkg/runtime/serializer/protobuf",
|
||||||
|
"pkg/runtime/serializer/recognizer",
|
||||||
|
"pkg/runtime/serializer/streaming",
|
||||||
|
"pkg/runtime/serializer/versioning",
|
||||||
|
"pkg/selection",
|
||||||
|
"pkg/types",
|
||||||
|
"pkg/util/cache",
|
||||||
|
"pkg/util/clock",
|
||||||
|
"pkg/util/diff",
|
||||||
|
"pkg/util/errors",
|
||||||
|
"pkg/util/framer",
|
||||||
|
"pkg/util/intstr",
|
||||||
|
"pkg/util/json",
|
||||||
|
"pkg/util/mergepatch",
|
||||||
|
"pkg/util/net",
|
||||||
|
"pkg/util/runtime",
|
||||||
|
"pkg/util/sets",
|
||||||
|
"pkg/util/strategicpatch",
|
||||||
|
"pkg/util/validation",
|
||||||
|
"pkg/util/validation/field",
|
||||||
|
"pkg/util/wait",
|
||||||
|
"pkg/util/yaml",
|
||||||
|
"pkg/version",
|
||||||
|
"pkg/watch",
|
||||||
|
"third_party/forked/golang/json",
|
||||||
|
"third_party/forked/golang/reflect"
|
||||||
|
]
|
||||||
|
revision = "103fd098999dc9c0c88536f5c9ad2e5da39373ae"
|
||||||
|
version = "kubernetes-1.11.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "k8s.io/client-go"
|
||||||
|
packages = [
|
||||||
|
"discovery",
|
||||||
|
"kubernetes",
|
||||||
|
"kubernetes/scheme",
|
||||||
|
"kubernetes/typed/admissionregistration/v1alpha1",
|
||||||
|
"kubernetes/typed/admissionregistration/v1beta1",
|
||||||
|
"kubernetes/typed/apps/v1",
|
||||||
|
"kubernetes/typed/apps/v1beta1",
|
||||||
|
"kubernetes/typed/apps/v1beta2",
|
||||||
|
"kubernetes/typed/authentication/v1",
|
||||||
|
"kubernetes/typed/authentication/v1beta1",
|
||||||
|
"kubernetes/typed/authorization/v1",
|
||||||
|
"kubernetes/typed/authorization/v1beta1",
|
||||||
|
"kubernetes/typed/autoscaling/v1",
|
||||||
|
"kubernetes/typed/autoscaling/v2beta1",
|
||||||
|
"kubernetes/typed/batch/v1",
|
||||||
|
"kubernetes/typed/batch/v1beta1",
|
||||||
|
"kubernetes/typed/batch/v2alpha1",
|
||||||
|
"kubernetes/typed/certificates/v1beta1",
|
||||||
|
"kubernetes/typed/core/v1",
|
||||||
|
"kubernetes/typed/events/v1beta1",
|
||||||
|
"kubernetes/typed/extensions/v1beta1",
|
||||||
|
"kubernetes/typed/networking/v1",
|
||||||
|
"kubernetes/typed/policy/v1beta1",
|
||||||
|
"kubernetes/typed/rbac/v1",
|
||||||
|
"kubernetes/typed/rbac/v1alpha1",
|
||||||
|
"kubernetes/typed/rbac/v1beta1",
|
||||||
|
"kubernetes/typed/scheduling/v1alpha1",
|
||||||
|
"kubernetes/typed/scheduling/v1beta1",
|
||||||
|
"kubernetes/typed/settings/v1alpha1",
|
||||||
|
"kubernetes/typed/storage/v1",
|
||||||
|
"kubernetes/typed/storage/v1alpha1",
|
||||||
|
"kubernetes/typed/storage/v1beta1",
|
||||||
|
"pkg/apis/clientauthentication",
|
||||||
|
"pkg/apis/clientauthentication/v1alpha1",
|
||||||
|
"pkg/apis/clientauthentication/v1beta1",
|
||||||
|
"pkg/version",
|
||||||
|
"plugin/pkg/client/auth/exec",
|
||||||
|
"plugin/pkg/client/auth/gcp",
|
||||||
|
"rest",
|
||||||
|
"rest/watch",
|
||||||
|
"restmapper",
|
||||||
|
"third_party/forked/golang/template",
|
||||||
|
"tools/auth",
|
||||||
|
"tools/cache",
|
||||||
|
"tools/clientcmd",
|
||||||
|
"tools/clientcmd/api",
|
||||||
|
"tools/clientcmd/api/latest",
|
||||||
|
"tools/clientcmd/api/v1",
|
||||||
|
"tools/metrics",
|
||||||
|
"tools/pager",
|
||||||
|
"tools/record",
|
||||||
|
"tools/reference",
|
||||||
|
"transport",
|
||||||
|
"util/buffer",
|
||||||
|
"util/cert",
|
||||||
|
"util/connrotation",
|
||||||
|
"util/flowcontrol",
|
||||||
|
"util/homedir",
|
||||||
|
"util/integer",
|
||||||
|
"util/jsonpath",
|
||||||
|
"util/retry",
|
||||||
|
"util/workqueue"
|
||||||
|
]
|
||||||
|
revision = "1f13a808da65775f22cbf47862c4e5898d8f4ca1"
|
||||||
|
version = "kubernetes-1.11.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "k8s.io/code-generator"
|
||||||
|
packages = [
|
||||||
|
"cmd/deepcopy-gen",
|
||||||
|
"cmd/deepcopy-gen/args",
|
||||||
|
"pkg/util"
|
||||||
|
]
|
||||||
|
revision = "aae79feb89bdded3679da91fd8c19b6dfcbdb79a"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "k8s.io/gengo"
|
||||||
|
packages = [
|
||||||
|
"args",
|
||||||
|
"examples/deepcopy-gen/generators",
|
||||||
|
"examples/set-gen/sets",
|
||||||
|
"generator",
|
||||||
|
"namer",
|
||||||
|
"parser",
|
||||||
|
"types"
|
||||||
|
]
|
||||||
|
revision = "4242d8e6c5dba56827bb7bcf14ad11cda38f3991"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "k8s.io/kube-openapi"
|
||||||
|
packages = ["pkg/util/proto"]
|
||||||
|
revision = "e3762e86a74c878ffed47484592986685639c2cd"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "sigs.k8s.io/controller-runtime"
|
||||||
|
packages = [
|
||||||
|
"pkg/cache",
|
||||||
|
"pkg/cache/internal",
|
||||||
|
"pkg/client",
|
||||||
|
"pkg/client/apiutil",
|
||||||
|
"pkg/client/config",
|
||||||
|
"pkg/controller",
|
||||||
|
"pkg/controller/controllerutil",
|
||||||
|
"pkg/envtest",
|
||||||
|
"pkg/envtest/printer",
|
||||||
|
"pkg/event",
|
||||||
|
"pkg/handler",
|
||||||
|
"pkg/internal/controller",
|
||||||
|
"pkg/internal/recorder",
|
||||||
|
"pkg/manager",
|
||||||
|
"pkg/predicate",
|
||||||
|
"pkg/reconcile",
|
||||||
|
"pkg/recorder",
|
||||||
|
"pkg/runtime/inject",
|
||||||
|
"pkg/runtime/log",
|
||||||
|
"pkg/runtime/scheme",
|
||||||
|
"pkg/runtime/signals",
|
||||||
|
"pkg/source",
|
||||||
|
"pkg/source/internal"
|
||||||
|
]
|
||||||
|
revision = "2ef903b2a5ed4cf8adde14a27994a291388a1789"
|
||||||
|
version = "v0.1.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "sigs.k8s.io/controller-tools"
|
||||||
|
packages = [
|
||||||
|
"cmd/controller-gen",
|
||||||
|
"pkg/crd/generator",
|
||||||
|
"pkg/crd/util",
|
||||||
|
"pkg/generate/rbac",
|
||||||
|
"pkg/internal/codegen",
|
||||||
|
"pkg/internal/codegen/parse",
|
||||||
|
"pkg/util"
|
||||||
|
]
|
||||||
|
revision = "bfd3eefb7f22ed714b2acd38730c36992ee6af70"
|
||||||
|
version = "v0.1.5"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "sigs.k8s.io/testing_frameworks"
|
||||||
|
packages = [
|
||||||
|
"integration",
|
||||||
|
"integration/internal"
|
||||||
|
]
|
||||||
|
revision = "5818a3a284a11812aaed11d5ca0bcadec2c50e83"
|
||||||
|
|
||||||
|
[solve-meta]
|
||||||
|
analyzer-name = "dep"
|
||||||
|
analyzer-version = 1
|
||||||
|
inputs-digest = "30bf4877934445daeb259e8dea39074dba0c7eecdd263f36bf9cee1719571962"
|
||||||
|
solver-name = "gps-cdcl"
|
||||||
|
solver-version = 1
|
|
@ -0,0 +1,36 @@
|
||||||
|
required = [
|
||||||
|
"github.com/emicklei/go-restful",
|
||||||
|
"github.com/onsi/ginkgo", # for test framework
|
||||||
|
"github.com/onsi/gomega", # for test matchers
|
||||||
|
"k8s.io/client-go/plugin/pkg/client/auth/gcp", # for development against gcp
|
||||||
|
"k8s.io/code-generator/cmd/deepcopy-gen", # for go generate
|
||||||
|
"sigs.k8s.io/controller-tools/cmd/controller-gen", # for crd/rbac generation
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client/config",
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/controller",
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/handler",
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/manager",
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/runtime/signals",
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/source",
|
||||||
|
"sigs.k8s.io/testing_frameworks/integration", # for integration testing
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1",
|
||||||
|
]
|
||||||
|
|
||||||
|
[prune]
|
||||||
|
go-tests = true
|
||||||
|
|
||||||
|
|
||||||
|
# STANZAS BELOW ARE GENERATED AND MAY BE WRITTEN - DO NOT MODIFY BELOW THIS LINE.
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name="sigs.k8s.io/controller-runtime"
|
||||||
|
version="v0.1.1"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name="sigs.k8s.io/controller-tools"
|
||||||
|
version="v0.1.1"
|
||||||
|
|
||||||
|
# For dependency below: Refer to issue https://github.com/golang/dep/issues/1799
|
||||||
|
[[override]]
|
||||||
|
name = "gopkg.in/fsnotify.v1"
|
||||||
|
source = "https://github.com/fsnotify/fsnotify.git"
|
||||||
|
version="v1.4.7"
|
|
@ -0,0 +1,147 @@
|
||||||
|
# Building and Installing Conductor
|
||||||
|
|
||||||
|
Conductor is composed of golang project and can be built directly with standard `golang` tools. We currently support
|
||||||
|
two different platforms for building:
|
||||||
|
|
||||||
|
* Linux: most modern distros should work although most testing has been done on Ubuntu
|
||||||
|
* Mac: macOS 10.6+ is supported
|
||||||
|
|
||||||
|
## Build Requirements
|
||||||
|
|
||||||
|
An Intel-based machine (recommend 2+ cores, 2+ GB of memory and 128GB of SSD). Inside your build environment (Docker for Mac or a VM), 6+ GB memory is also recommended.
|
||||||
|
|
||||||
|
The following tools are need on the host:
|
||||||
|
- curl
|
||||||
|
- docker (1.12+) or Docker for Mac (17+)
|
||||||
|
- git
|
||||||
|
- make
|
||||||
|
- golang
|
||||||
|
- rsync (if you're using the build container on mac)
|
||||||
|
- helm (v2.8.2+)
|
||||||
|
- kubebuilder (v1.0.4+)
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
You can build the Conductor binaries and all container images for the host platform by simply running the
|
||||||
|
command below. Building in parallel with the `-j` option is recommended.
|
||||||
|
|
||||||
|
```
|
||||||
|
make -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
Run `make help` for more options.
|
||||||
|
|
||||||
|
## Building inside the cross container
|
||||||
|
|
||||||
|
Official Conductor builds are done inside a build container. This ensures that we get a consistent build, test and release environment. To run the build inside the cross container run:
|
||||||
|
|
||||||
|
```
|
||||||
|
> build/run make -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
The first run of `build/run` will build the container itself and could take a few
|
||||||
|
minutes to complete.
|
||||||
|
|
||||||
|
### Resetting the build container
|
||||||
|
|
||||||
|
If you're running the build container on the Mac using Docker for Mac, the build
|
||||||
|
container will rely on rsync to copy source to and from the host. To reset the build container and it's persistent volumes, you can run the below command. You should not have to do this often unless something is broken or stale with your build container:
|
||||||
|
|
||||||
|
```
|
||||||
|
build/reset
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building for other platforms
|
||||||
|
|
||||||
|
You can also run the build for all supported platforms:
|
||||||
|
|
||||||
|
```
|
||||||
|
make -j4 build.all
|
||||||
|
```
|
||||||
|
|
||||||
|
Or from the cross container:
|
||||||
|
|
||||||
|
```
|
||||||
|
build/run make -j4 build.all
|
||||||
|
```
|
||||||
|
|
||||||
|
Currently, only `amd64` platform supports this kind of 'cross' build. In order to make `build.all`
|
||||||
|
succeed, we need to follow the steps specified by the below section `Building for other platforms`
|
||||||
|
first.
|
||||||
|
|
||||||
|
We suggest to use native `build` to create the binaries and container images on `arm{32,64}`
|
||||||
|
platform, but if you do want to build those `arm{32,64}` binaries and images on `amd64` platform
|
||||||
|
with `build.all` command, please make sure the multi-arch feature is supported. To test run the
|
||||||
|
following:
|
||||||
|
|
||||||
|
```
|
||||||
|
> docker run --rm -ti arm32v7/ubuntu uname -a
|
||||||
|
Linux bad621a75757 4.8.0-58-generic #63~16.04.1-Ubuntu SMP Mon Jun 26 18:08:51 UTC 2017 armv7l armv7l armv7l GNU/Linux
|
||||||
|
|
||||||
|
> docker run --rm -ti arm64v8/ubuntu uname -a
|
||||||
|
Linux f51ea93e76a2 4.8.0-58-generic #63~16.04.1-Ubuntu SMP Mon Jun 26 18:08:51 UTC 2017 aarch64 aarch64 aarch64 GNU/Linux
|
||||||
|
```
|
||||||
|
|
||||||
|
In order to build container images for these platforms we rely on cross-compilers and QEMU. Cross compiling is much faster than QEMU and so we lean heavily on it.
|
||||||
|
|
||||||
|
In order for QEMU to work inside docker containers you need to do a few things on
|
||||||
|
the linux host. If you are using a recent Docker for Mac build you can skip this section, since they added support for binfmt and multi-arch docker builds.
|
||||||
|
|
||||||
|
On an Ubuntu machine with a 4.8+ kernel you need to run install the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
|
||||||
|
binfmt-support
|
||||||
|
qemu-user-static
|
||||||
|
```
|
||||||
|
|
||||||
|
You also need to run the following on every boot:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run --rm --privileged hypriot/qemu-register
|
||||||
|
```
|
||||||
|
|
||||||
|
you can install a systemd unit to help with this if you'd like, for example:
|
||||||
|
|
||||||
|
```
|
||||||
|
cat <<EOF > /etc/systemd/system/update-binfmt.service
|
||||||
|
[Unit]
|
||||||
|
After=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStartPre=/usr/bin/docker pull hypriot/qemu-register
|
||||||
|
ExecStart=/usr/bin/docker run --rm --privileged hypriot/qemu-register
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl enable update-binfmt.service
|
||||||
|
```
|
||||||
|
|
||||||
|
# Install
|
||||||
|
|
||||||
|
## Local
|
||||||
|
Please refer to [Local Build & Install](/cluster/local/README.md) documentation on how to deploy locally built Conductor image onto Kubernetes cluster running on Minikube
|
||||||
|
|
||||||
|
# Improving Build Speed
|
||||||
|
|
||||||
|
## Image Caching and Pruning
|
||||||
|
|
||||||
|
Doing a complete build of Conductor and the dependent packages can take a long time (more than an hour on a typical macbook). To speed things up we rely heavily on image caching in docker. Docker support content-addressable images by default and we use that effectively when building images. Images are factored to increase reusability across builds. We also tag and timestamp images that should remain in the cache to help future builds.
|
||||||
|
|
||||||
|
### Pruning the cache
|
||||||
|
|
||||||
|
To prune the number of cached images run `make prune`. There are two options that control the level of pruning performed:
|
||||||
|
|
||||||
|
- `PRUNE_HOURS` - the number of hours from when an image was last used (a cache hit) for it to be considered for pruning. The default is 48 hrs.
|
||||||
|
- `PRUNE_KEEP` - the minimum number of cached images to keep in the cache. Default is 24 images.
|
||||||
|
|
||||||
|
## CI workflow and options
|
||||||
|
Every PR and every merge to master triggers the CI process in [TBD](http://TBD).
|
||||||
|
The Jenkins CI will build, run unit tests, run integration tests and Publish artifacts- On every commit to PR and master.
|
||||||
|
If any of the CI stages fail, then the process is aborted and no artifacts are published.
|
||||||
|
On every successful build Artifacts are pushed to a [s3 bucket](https://release.conductor.io/). On every successful master build,
|
||||||
|
images are uploaded to docker hub in addition.
|
|
@ -0,0 +1,83 @@
|
||||||
|
pipeline {
|
||||||
|
agent { label 'upbound-gce' }
|
||||||
|
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
timestamps()
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
|
||||||
|
stage('Prepare') {
|
||||||
|
steps {
|
||||||
|
sh 'git config --global user.name "upbound-bot"'
|
||||||
|
sh 'echo "machine github.com login upbound-bot password $GITHUB_UPBOUND_BOT" > ~/.netrc'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Build validation'){
|
||||||
|
steps {
|
||||||
|
sh './build/run make -j$(nproc) build.all'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Unit Tests') {
|
||||||
|
steps {
|
||||||
|
sh './build/run make -j$(nproc) test'
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archive "_output/tests/**/*"
|
||||||
|
junit "_output/tests/**/*.xml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Publish') {
|
||||||
|
|
||||||
|
environment {
|
||||||
|
DOCKER = credentials('dockerhub-upboundci')
|
||||||
|
AWS = credentials('aws-upbound-bot')
|
||||||
|
GITHUB_UPBOUND_BOT = credentials('github-upbound-jenkins')
|
||||||
|
}
|
||||||
|
|
||||||
|
steps {
|
||||||
|
sh 'docker login -u="${DOCKER_USR}" -p="${DOCKER_PSW}"'
|
||||||
|
sh "./build/run make -j\$(nproc) publish BRANCH_NAME=${BRANCH_NAME} AWS_ACCESS_KEY_ID=${AWS_USR} AWS_SECRET_ACCESS_KEY=${AWS_PSW} GIT_API_TOKEN=${GITHUB_UPBOUND_BOT}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Promote') {
|
||||||
|
when {
|
||||||
|
branch 'master'
|
||||||
|
}
|
||||||
|
|
||||||
|
steps {
|
||||||
|
lock('promote-job') {
|
||||||
|
sh "./build/run make -j\$(nproc) promote BRANCH_NAME=master CHANNEL=master AWS_ACCESS_KEY_ID=${AWS_USR} AWS_SECRET_ACCESS_KEY=${AWS_PSW}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy') {
|
||||||
|
when {
|
||||||
|
branch 'master'
|
||||||
|
}
|
||||||
|
|
||||||
|
steps {
|
||||||
|
build job: 'upbound/cloud/dev/master', parameters: [string(name: 'action', value: 'up')], quietPeriod: 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
sh 'make -j\$(nproc) clean'
|
||||||
|
sh 'make -j$(nproc) prune PRUNE_HOURS=48 PRUNE_KEEP=48'
|
||||||
|
sh 'docker images'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,201 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright 2016 The Conductor Authors. All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
|
@ -0,0 +1,47 @@
|
||||||
|
# ====================================================================================
|
||||||
|
# Setup Project
|
||||||
|
|
||||||
|
PROJECT_NAME := conductor
|
||||||
|
PROJECT_REPO := github.com/upbound/$(PROJECT_NAME)
|
||||||
|
|
||||||
|
PLATFORMS ?= linux_amd64
|
||||||
|
include build/makelib/common.mk
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Setup Output
|
||||||
|
|
||||||
|
S3_BUCKET ?= upbound.releases/conductor
|
||||||
|
include build/makelib/output.mk
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Setup Go
|
||||||
|
|
||||||
|
GO_STATIC_PACKAGES = $(GO_PROJECT)/cmd/conductor
|
||||||
|
GO_LDFLAGS += -X $(GO_PROJECT)/pkg/version.Version=$(VERSION)
|
||||||
|
include build/makelib/golang.mk
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Setup Helm
|
||||||
|
|
||||||
|
HELM_BASE_URL = https://charts.upbound.io
|
||||||
|
HELM_S3_BUCKET = upbound.charts
|
||||||
|
HELM_CHARTS = conductor
|
||||||
|
HELM_CHART_LINT_ARGS_conductor = --set nameOverride='',imagePullSecrets=''
|
||||||
|
include build/makelib/helm.mk
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Setup Kubebuilder
|
||||||
|
|
||||||
|
include build/makelib/kubebuilder.mk
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Setup Images
|
||||||
|
|
||||||
|
DOCKER_REGISTRY = upbound
|
||||||
|
IMAGES = conductor
|
||||||
|
include build/makelib/image.mk
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Targets
|
||||||
|
|
||||||
|
# run `make help` to see the targets and options
|
43
README.md
43
README.md
|
@ -1,3 +1,44 @@
|
||||||
# Project Conductor (codename)
|
# Project Conductor (codename)
|
||||||
|
|
||||||
Project Conductor brings cloud provider resources into Kubernetes with unifying cloud abstractions.
|
## What is Conductor?
|
||||||
|
|
||||||
|
Conductor is an open source **external-resource-definition** for Kubernetes , providing the platform, framework, and support for a diverse set of the managed resources offered by major cloud providers (Currently focused on AWS and GCP)
|
||||||
|
|
||||||
|
Conductor turns storage software into self-managing, self-scaling, and self-healing of managed cloud resources. Conductor extends the facilities provided by Kubernetes such container management, scheduling and orchestration to the external resources.
|
||||||
|
|
||||||
|
Conductor integrates deeply into cloud native environments leveraging extension points and providing a seamless experience for scheduling, lifecycle management, resource management, security, monitoring, and user experience.
|
||||||
|
|
||||||
|
For more details about the cloud providers and resources currently supported by Conductor, please refer to the [project status section](#project-status) below.
|
||||||
|
We plan to continue adding support for other cloud providers and resource based on community demand and engagement in future releases. See our [roadmap](ROADMAP.md) for more details.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We welcome contributions. See [Contributing](CONTRIBUTING.md) to get started.
|
||||||
|
|
||||||
|
## Report a Bug
|
||||||
|
|
||||||
|
For filing bugs, suggesting improvements, or requesting new features, please open an [issue](https://github.com/upbound/conductor/issues).
|
||||||
|
|
||||||
|
## Project Status
|
||||||
|
|
||||||
|
The status of each storage provider supported by Conductor can be found in the table below.
|
||||||
|
Each API group is assigned its own individual status to reflect their varying maturity and stability.
|
||||||
|
More details about API versioning and status in Kubernetes can be found on the Kubernetes [API versioning page](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-versioning), but the key difference between the statuses are summarized below:
|
||||||
|
|
||||||
|
* **Alpha:** The API may change in incompatible ways in a later software release without notice, recommended for use only in short-lived testing clusters, due to increased risk of bugs and lack of long-term support.
|
||||||
|
* **Beta:** Support for the overall features will not be dropped, though details may change. Support for upgrading or migrating between versions will be provided, either through automation or manual steps.
|
||||||
|
* **Stable:** Features will appear in released software for many subsequent versions and support for upgrading between versions will be provided with software automation in the vast majority of scenarios.
|
||||||
|
|
||||||
|
|
||||||
|
Name | Details | API Group | Status
|
||||||
|
-----|---------|-----------|-------
|
||||||
|
|
||||||
|
### Official Releases
|
||||||
|
|
||||||
|
Official releases of Conductor can be found on the [releases page](https://github.com/upbound/conductor/releases).
|
||||||
|
Please note that it is **strongly recommended** that you use [official releases](https://github.com/upbound/concuctor/releases) of Conductor, as unreleased versions from the master branch are subject to changes and incompatibilities that will not be supported in the official releases.
|
||||||
|
Builds from the master branch can have functionality changed and even removed at any time without compatibility support and without prior notice.
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
|
||||||
|
Conductor is under the Apache 2.0 license.
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Roadmap
|
||||||
|
|
||||||
|
This document defines a high level roadmap for Conductor development and upcoming releases.
|
||||||
|
The features and themes included in each milestone are optimistic in the sense that many do not have clear owners yet.
|
||||||
|
Community and contributor involvement is vital for successfully implementing all desired items for each release.
|
||||||
|
We hope that the items listed below will inspire further engagement from the community to keep Conductor progressing and shipping exciting and valuable features.
|
||||||
|
|
||||||
|
Any dates listed below and the specific issues that will ship in a given milestone are subject to change but should give a general idea of what we are planning.
|
||||||
|
We use the [milestone](https://github.com/upbound/conductor/milestones) feature in Github so look there for the most up-to-date and issue plan.
|
||||||
|
|
||||||
|
## Conductor 0.1
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 53a9a2dadaeb391de68d44b73326344a30c2c959
|
|
@ -0,0 +1,9 @@
|
||||||
|
apiVersion: rds.aws.conductor.io/v1alpha1
|
||||||
|
kind: Instance
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
controller-tools.k8s.io: "1.0"
|
||||||
|
name: instance-sample
|
||||||
|
spec:
|
||||||
|
# Add fields here
|
||||||
|
foo: bar
|
|
@ -0,0 +1,9 @@
|
||||||
|
apiVersion: cloudsql.gcp.conductor.io/v1alpha1
|
||||||
|
kind: Instance
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
controller-tools.k8s.io: "1.0"
|
||||||
|
name: instance-sample
|
||||||
|
spec:
|
||||||
|
# Add fields here
|
||||||
|
foo: bar
|
|
@ -0,0 +1,9 @@
|
||||||
|
apiVersion: cloudsql.gcp.conductor.io/v1alpha1
|
||||||
|
kind: User
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
controller-tools.k8s.io: "1.0"
|
||||||
|
name: user-sample
|
||||||
|
spec:
|
||||||
|
# Add fields here
|
||||||
|
foo: bar
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Generate deepcopy for apis
|
||||||
|
//go:generate go run ../../../vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go -O zz_generated.deepcopy -i ./... -h ../../../hack/boilerplate.go.txt
|
||||||
|
|
||||||
|
// Package aws contains Kubernetes API groups for AWS cloud provider.
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import (
|
||||||
|
database "github.com/upbound/conductor/pkg/apis/aws/database/v1alpha1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
|
||||||
|
AddToSchemes = append(AddToSchemes, database.SchemeBuilder.AddToScheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddToSchemes may be used to add all resources defined in the project to a Scheme
|
||||||
|
var AddToSchemes runtime.SchemeBuilder
|
||||||
|
|
||||||
|
// AddToScheme adds all Resources to the Scheme
|
||||||
|
func AddToScheme(s *runtime.Scheme) error {
|
||||||
|
return AddToSchemes.AddToScheme(s)
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package database contains AWS database API versions
|
||||||
|
package database
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package v1alpha1 contains API Schema definitions for the rds v1alpha1 API group
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
// +k8s:deepcopy-gen=package,register
|
||||||
|
// +k8s:conversion-gen=github.com/upbound/conductor/pkg/apis/rds
|
||||||
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
|
// +groupName=database.aws.conductor.io
|
||||||
|
package v1alpha1
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
|
||||||
|
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
|
||||||
|
|
||||||
|
// RDSInstanceSpec defines the desired state of RDSInstance
|
||||||
|
type RDSInstanceSpec struct {
|
||||||
|
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
|
||||||
|
// Important: Run "make" to regenerate code after modifying this file
|
||||||
|
}
|
||||||
|
|
||||||
|
// RDSInstanceStatus defines the observed state of RDSInstance
|
||||||
|
type RDSInstanceStatus struct {
|
||||||
|
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
|
||||||
|
// Important: Run "make" to regenerate code after modifying this file
|
||||||
|
}
|
||||||
|
|
||||||
|
// +genclient
|
||||||
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
||||||
|
// RDSInstance is the Schema for the instances API
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
type RDSInstance struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||||
|
|
||||||
|
Spec RDSInstanceSpec `json:"spec,omitempty"`
|
||||||
|
Status RDSInstanceStatus `json:"status,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
||||||
|
// RDSInstanceList contains a list of RDSInstance
|
||||||
|
type RDSInstanceList struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ListMeta `json:"metadata,omitempty"`
|
||||||
|
Items []RDSInstance `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
SchemeBuilder.Register(&RDSInstance{}, &RDSInstanceList{})
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/onsi/gomega"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStorageRDSInstance(t *testing.T) {
|
||||||
|
key := types.NamespacedName{Name: "foo", Namespace: "default"}
|
||||||
|
created := &RDSInstance{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}}
|
||||||
|
g := gomega.NewGomegaWithT(t)
|
||||||
|
|
||||||
|
// Test Create
|
||||||
|
fetched := &RDSInstance{}
|
||||||
|
g.Expect(c.Create(context.TODO(), created)).NotTo(gomega.HaveOccurred())
|
||||||
|
|
||||||
|
g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
|
||||||
|
g.Expect(fetched).To(gomega.Equal(created))
|
||||||
|
|
||||||
|
// Test Updating the Labels
|
||||||
|
updated := fetched.DeepCopy()
|
||||||
|
updated.Labels = map[string]string{"hello": "world"}
|
||||||
|
g.Expect(c.Update(context.TODO(), updated)).NotTo(gomega.HaveOccurred())
|
||||||
|
|
||||||
|
g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
|
||||||
|
g.Expect(fetched).To(gomega.Equal(updated))
|
||||||
|
|
||||||
|
// Test Delete
|
||||||
|
g.Expect(c.Delete(context.TODO(), fetched)).NotTo(gomega.HaveOccurred())
|
||||||
|
g.Expect(c.Get(context.TODO(), key, fetched)).To(gomega.HaveOccurred())
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// NOTE: Boilerplate only. Ignore this file.
|
||||||
|
|
||||||
|
// Package v1alpha1 contains API Schema definitions for the rds v1alpha1 API group
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
// +k8s:deepcopy-gen=package,register
|
||||||
|
// +k8s:conversion-gen=github.com/upbound/conductor/pkg/apis/rds
|
||||||
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
|
// +groupName=database.aws.conductor.io
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/runtime/scheme"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// SchemeGroupVersion is group version used to register these objects
|
||||||
|
SchemeGroupVersion = schema.GroupVersion{Group: "database.aws.conductor.io", Version: "v1alpha1"}
|
||||||
|
|
||||||
|
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
|
||||||
|
SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
|
||||||
|
)
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cfg *rest.Config
|
||||||
|
var c client.Client
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
t := &envtest.Environment{
|
||||||
|
CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "..", "..",
|
||||||
|
"cluster", "charts", "conductor", "crds", "aws", "database", "v1alpha1")},
|
||||||
|
}
|
||||||
|
|
||||||
|
err := SchemeBuilder.AddToScheme(scheme.Scheme)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg, err = t.Start(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
code := m.Run()
|
||||||
|
t.Stop()
|
||||||
|
os.Exit(code)
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
// Code generated by main. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *RDSInstance) DeepCopyInto(out *RDSInstance) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||||
|
out.Spec = in.Spec
|
||||||
|
out.Status = in.Status
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RDSInstance.
|
||||||
|
func (in *RDSInstance) DeepCopy() *RDSInstance {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(RDSInstance)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *RDSInstance) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *RDSInstanceList) DeepCopyInto(out *RDSInstanceList) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
out.ListMeta = in.ListMeta
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]RDSInstance, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RDSInstanceList.
|
||||||
|
func (in *RDSInstanceList) DeepCopy() *RDSInstanceList {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(RDSInstanceList)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *RDSInstanceList) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *RDSInstanceSpec) DeepCopyInto(out *RDSInstanceSpec) {
|
||||||
|
*out = *in
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RDSInstanceSpec.
|
||||||
|
func (in *RDSInstanceSpec) DeepCopy() *RDSInstanceSpec {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(RDSInstanceSpec)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *RDSInstanceStatus) DeepCopyInto(out *RDSInstanceStatus) {
|
||||||
|
*out = *in
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RDSInstanceStatus.
|
||||||
|
func (in *RDSInstanceStatus) DeepCopy() *RDSInstanceStatus {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(RDSInstanceStatus)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Generate deepcopy for apis
|
||||||
|
//go:generate go run ../../../vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go -O zz_generated.deepcopy -i ./... -h ../../../hack/boilerplate.go.txt
|
||||||
|
|
||||||
|
// Package gcp contains Kubernetes API for GCP cloud provider.
|
||||||
|
package gcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
databasev1alpha1 "github.com/upbound/conductor/pkg/apis/gcp/database/v1alpha1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
|
||||||
|
AddToSchemes = append(AddToSchemes, databasev1alpha1.SchemeBuilder.AddToScheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddToSchemes may be used to add all resources defined in the project to a Scheme
|
||||||
|
var AddToSchemes runtime.SchemeBuilder
|
||||||
|
|
||||||
|
// AddToScheme adds all Resources to the Scheme
|
||||||
|
func AddToScheme(s *runtime.Scheme) error {
|
||||||
|
return AddToSchemes.AddToScheme(s)
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package database contains GCP database API versions
|
||||||
|
package database
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
|
||||||
|
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
|
||||||
|
|
||||||
|
// CloudsqlInstanceSpec defines the desired state of CloudsqlInstance
|
||||||
|
type CloudsqlInstanceSpec struct {
|
||||||
|
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
|
||||||
|
// Important: Run "make" to regenerate code after modifying this file
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloudsqlInstanceStatus defines the observed state of CloudsqlInstance
|
||||||
|
type CloudsqlInstanceStatus struct {
|
||||||
|
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
|
||||||
|
// Important: Run "make" to regenerate code after modifying this file
|
||||||
|
}
|
||||||
|
|
||||||
|
// +genclient
|
||||||
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
||||||
|
// CloudsqlInstance is the Schema for the instances API
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
type CloudsqlInstance struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||||
|
|
||||||
|
Spec CloudsqlInstanceSpec `json:"spec,omitempty"`
|
||||||
|
Status CloudsqlInstanceStatus `json:"status,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
||||||
|
// CloudsqlInstanceList contains a list of CloudsqlInstance
|
||||||
|
type CloudsqlInstanceList struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ListMeta `json:"metadata,omitempty"`
|
||||||
|
Items []CloudsqlInstance `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
SchemeBuilder.Register(&CloudsqlInstance{}, &CloudsqlInstanceList{})
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/onsi/gomega"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStorageCloudsqlInstance(t *testing.T) {
|
||||||
|
key := types.NamespacedName{Name: "foo", Namespace: "default"}
|
||||||
|
created := &CloudsqlInstance{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}}
|
||||||
|
g := gomega.NewGomegaWithT(t)
|
||||||
|
|
||||||
|
// Test Create
|
||||||
|
fetched := &CloudsqlInstance{}
|
||||||
|
g.Expect(c.Create(context.TODO(), created)).NotTo(gomega.HaveOccurred())
|
||||||
|
|
||||||
|
g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
|
||||||
|
g.Expect(fetched).To(gomega.Equal(created))
|
||||||
|
|
||||||
|
// Test Updating the Labels
|
||||||
|
updated := fetched.DeepCopy()
|
||||||
|
updated.Labels = map[string]string{"hello": "world"}
|
||||||
|
g.Expect(c.Update(context.TODO(), updated)).NotTo(gomega.HaveOccurred())
|
||||||
|
|
||||||
|
g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
|
||||||
|
g.Expect(fetched).To(gomega.Equal(updated))
|
||||||
|
|
||||||
|
// Test Delete
|
||||||
|
g.Expect(c.Delete(context.TODO(), fetched)).NotTo(gomega.HaveOccurred())
|
||||||
|
g.Expect(c.Get(context.TODO(), key, fetched)).To(gomega.HaveOccurred())
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package v1alpha1 contains API Schema definitions for the cloudsql v1alpha1 API group
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
// +k8s:deepcopy-gen=package,register
|
||||||
|
// +k8s:conversion-gen=github.com/upbound/conductor/pkg/apis/cloudsql
|
||||||
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
|
// +groupName=database.gcp.conductor.io
|
||||||
|
package v1alpha1
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// NOTE: Boilerplate only. Ignore this file.
|
||||||
|
|
||||||
|
// Package v1alpha1 contains API Schema definitions for the cloudsql v1alpha1 API group
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
// +k8s:deepcopy-gen=package,register
|
||||||
|
// +k8s:conversion-gen=github.com/upbound/conductor/pkg/gcp/apis/cloudsql
|
||||||
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
|
// +groupName=database.gcp.conductor.io
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/runtime/scheme"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// SchemeGroupVersion is group version used to register these objects
|
||||||
|
SchemeGroupVersion = schema.GroupVersion{Group: "database.gcp.conductor.io", Version: "v1alpha1"}
|
||||||
|
|
||||||
|
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
|
||||||
|
SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
|
||||||
|
)
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cfg *rest.Config
|
||||||
|
var c client.Client
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
t := &envtest.Environment{
|
||||||
|
CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "..", "..",
|
||||||
|
"cluster", "charts", "conductor", "crds", "gcp", "database", "v1alpha1")},
|
||||||
|
}
|
||||||
|
|
||||||
|
err := SchemeBuilder.AddToScheme(scheme.Scheme)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg, err = t.Start(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
code := m.Run()
|
||||||
|
t.Stop()
|
||||||
|
os.Exit(code)
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 The Conductor Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
// Code generated by main. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *CloudsqlInstance) DeepCopyInto(out *CloudsqlInstance) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||||
|
out.Spec = in.Spec
|
||||||
|
out.Status = in.Status
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudsqlInstance.
|
||||||
|
func (in *CloudsqlInstance) DeepCopy() *CloudsqlInstance {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(CloudsqlInstance)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *CloudsqlInstance) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *CloudsqlInstanceList) DeepCopyInto(out *CloudsqlInstanceList) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
out.ListMeta = in.ListMeta
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]CloudsqlInstance, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudsqlInstanceList.
|
||||||
|
func (in *CloudsqlInstanceList) DeepCopy() *CloudsqlInstanceList {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(CloudsqlInstanceList)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *CloudsqlInstanceList) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *CloudsqlInstanceSpec) DeepCopyInto(out *CloudsqlInstanceSpec) {
|
||||||
|
*out = *in
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudsqlInstanceSpec.
|
||||||
|
func (in *CloudsqlInstanceSpec) DeepCopy() *CloudsqlInstanceSpec {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(CloudsqlInstanceSpec)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *CloudsqlInstanceStatus) DeepCopyInto(out *CloudsqlInstanceStatus) {
|
||||||
|
*out = *in
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudsqlInstanceStatus.
|
||||||
|
func (in *CloudsqlInstanceStatus) DeepCopy() *CloudsqlInstanceStatus {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(CloudsqlInstanceStatus)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
Loading…
Reference in New Issue