Skip to content

Commit

Permalink
feat(app): impl main login of app controller (#350)
Browse files Browse the repository at this point in the history
* impl app controller
* feat(app): impl main logic of app controller

Signed-off-by: maslow <wangfugen@126.com>
  • Loading branch information
maslow authored Sep 27, 2022
1 parent 66abc80 commit 821e875
Show file tree
Hide file tree
Showing 24 changed files with 665 additions and 354 deletions.
109 changes: 36 additions & 73 deletions controllers/application/README.md
Original file line number Diff line number Diff line change
@@ -1,94 +1,57 @@
# application
// TODO(user): Add simple overview of use/purpose

## Description
// TODO(user): An in-depth paragraph about your project and overview of use

## Getting Started
You’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster.
**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster `kubectl cluster-info` shows).

### Running on the cluster
1. Install Instances of Custom Resources:
## Local development

```sh
kubectl apply -f config/samples/
```
### 0. start a k8s cluster

2. Build and push your image to the location specified by `IMG`:

```sh
make docker-build docker-push IMG=<some-registry>/application:tag
```bash
# in laf project root path
sh scripts/start_vm.sh laf-test ~/.kube/config
```

3. Deploy the controller to the cluster with the image specified by `IMG`:

```sh
make deploy IMG=<some-registry>/application:tag
### 1. run the controller locally (*Prerequisite*)
```bash
# terminal 1st
cd controllers/application/
make run
```

### Uninstall CRDs
To delete the CRDs from the cluster:

```sh
make uninstall
### 2. run all the tests
```bash
make test -v
```

### Undeploy controller
UnDeploy the controller to the cluster:

```sh
make undeploy
### *Optional* run a specific test for debugging
```bash
# run a specific test
go test ./tests/e2e/app_create_test.go -v
```

## Contributing
// TODO(user): Add detailed information on how you would like others to contribute to this project

### How it works
This project aims to follow the Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/)
## CI/CD

It uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/)
which provides a reconcile function responsible for synchronizing resources untile the desired state is reached on the cluster
### 0. prepare a remote k8s cluster
> TODO: ensure a ready k8s cluster config is located in ~/.kube/config
### Test It Out
1. Install the CRDs into the cluster:
### 1. build & push the controller image
```bash
# build the image
IMG=ghcr.io/oss-controller:ci-test make docker-build

```sh
make install
# push the image
IMG=ghcr.io/oss-controller:ci-test make docker-push
```

2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running):

```sh
make run
### 2. deploy the crd
```bash
# deploy the controller
kubectl apply -f config/crd/bases
kubectl apply -f config/rbac
kubectl apply -f config/manager
```

**NOTE:** You can also run this in one step by running: `make install run`

### Modifying the API definitions
If you are editing the API definitions, generate the manifests such as CRs or CRDs using:

```sh
make manifests
```

**NOTE:** Run `make --help` for more information on all potential `make` targets

More information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html)

## License

Copyright 2022.

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.

### 3. run tests in local
```bash
make test
```
65 changes: 35 additions & 30 deletions controllers/application/api/v1/application_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,32 +36,25 @@ const (
ApplicationStateStopped ApplicationState = "Stopped"
)

type ApplicationConditionType string

const (
ApplicationBundleInitialized ApplicationConditionType = "BundleInitialized"
ApplicationRuntimeInitialized ApplicationConditionType = "RuntimeInitialized"

// ApplicationInitialized = Initialized + DatabaseCreated + ObjectStorageCreated + GatewayCreated + InstanceCreated
ApplicationInitialized ApplicationConditionType = "Initialized"
ApplicationDatabaseCreated ApplicationConditionType = "DatabaseCreated"
ApplicationObjectStorageCreated ApplicationConditionType = "ObjectStorageCreated"
ApplicationGatewayCreated ApplicationConditionType = "GatewayCreated"
ApplicationInstanceCreated ApplicationConditionType = "InstanceCreated"

// ApplicationReady = DatabaseReady + ObjectStorageReady + GatewayReady + InstanceReady
ApplicationReady ApplicationConditionType = "Ready"
ApplicationDatabaseReady ApplicationConditionType = "DatabaseReady"
ApplicationObjectStorageReady ApplicationConditionType = "ObjectStorageReady"
ApplicationGatewayReady ApplicationConditionType = "GatewayReady"
ApplicationInstanceReady ApplicationConditionType = "InstanceReady"

// ApplicationDeleted = DatabaseDeleted + ObjectStorageDeleted + GatewayDeleted + InstanceDeleted
ApplicationDeleted ApplicationConditionType = "Deleted"
ApplicationDatabaseDeleted ApplicationConditionType = "DatabaseDeleted"
ApplicationObjectStorageDeleted ApplicationConditionType = "ObjectStorageDeleted"
ApplicationGatewayDeleted ApplicationConditionType = "GatewayDeleted"
ApplicationInstanceDeleted ApplicationConditionType = "InstanceDeleted"
BundleInitialized string = "BundleInitialized"
RuntimeInitialized string = "RuntimeInitialized"

DatabaseCreated string = "DatabaseCreated"
ObjectStorageCreated string = "ObjectStorageCreated"
GatewayCreated string = "GatewayCreated"

DatabaseReady string = "DatabaseReady"
ObjectStorageReady string = "ObjectStorageReady"
GatewayReady string = "GatewayReady"

Ready string = "Ready"
InstanceCreated string = "InstanceCreated"
InstanceDeleted string = "InstanceDeleted"

DatabaseDeleted string = "DatabaseDeleted"
StorageDeleted string = "ObjectStorageDeleted"
GatewayDeleted string = "GatewayDeleted"
)

// ApplicationSpec defines the desired state of Application
Expand All @@ -75,6 +68,12 @@ type ApplicationSpec struct {
//+kubebuilder:validation:Required
AppId string `json:"appid"`

// Region
//+kubebuilder:validation:Required
//+kubebuilder:validation:MinLength=3
//+kubebuilder:validation:MaxLength=24
Region string `json:"region"`

// State of the application
//+kubebuilder:validation:Enum=Running;Stopped;
//+kubebuilder:validation:Required
Expand All @@ -95,17 +94,23 @@ type ApplicationStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file

// Bundle of the application
Bundle Bundle `json:"bundle,omitempty"`
// Bundle Name for the application
BundleName string `json:"bundleName"`

// BundleSpec of the application
BundleSpec BundleSpec `json:"bundleSpec"`

// Runtime Name for the application
RuntimeName string `json:"runtimeName"`

// Runtime of the application
Runtime runtimev1.Runtime `json:"runtime,omitempty"`
// RuntimeSpec of the application
RuntimeSpec runtimev1.RuntimeSpec `json:"runtimeSpec,omitempty"`

// State of the application
Phase ApplicationState `json:"state,omitempty"`

// Conditions:
// @see ApplicationConditionType for the list of conditions
// @see string for the list of conditions
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

Expand Down
8 changes: 7 additions & 1 deletion controllers/application/api/v1/creationform_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ type CreationFormSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file

// Region
//+kubebuilder:validation:Required
//+kubebuilder:validation:MinLength=3
//+kubebuilder:validation:MaxLength=24
Region string `json:"region"`

// DisplayName for the application
//+kubebuilder:validation:MinLength=3
//+kubebuilder:validation:MaxLength=63
Expand All @@ -38,7 +44,7 @@ type CreationFormSpec struct {
//+kubebuilder:validation:Required
BundleName string `json:"bundleName"`

// Runtime Name of the application
// RuntimeSpec Name of the application
//+kubebuilder:validation:Required
RuntimeName string `json:"runtimeName"`
}
Expand Down
4 changes: 2 additions & 2 deletions controllers/application/api/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 821e875

Please sign in to comment.