You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@submarine.apache.org by pi...@apache.org on 2021/10/09 08:24:25 UTC

[submarine] branch master updated: SUBMARINE-1033. Remove submarine-cloud

This is an automated email from the ASF dual-hosted git repository.

pingsutw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git


The following commit(s) were added to refs/heads/master by this push:
     new bf35b3a  SUBMARINE-1033. Remove submarine-cloud
bf35b3a is described below

commit bf35b3a4f8c441fa5c6689c1f1b1f633fec1a7fa
Author: 傅譽的MacBook <b0...@ntu.edu.tw>
AuthorDate: Fri Oct 8 14:28:36 2021 +0800

    SUBMARINE-1033. Remove submarine-cloud
    
    ### What is this PR for?
    <!-- A few sentences describing the overall goals of the pull request's commits.
    First time? Check out the contributing guide - https://submarine.apache.org/contribution/contributions.html
    -->
    
    We are not using submarine-cloud now, so we can remove it now.
    
    ### What type of PR is it?
    [Improvement]
    
    ### Todos
    
    None
    
    ### What is the Jira issue?
    <!-- * Open an issue on Jira https://issues.apache.org/jira/browse/SUBMARINE/
    * Put link here, and add [SUBMARINE-*Jira number*] in PR title, eg. `SUBMARINE-23. PR title`
    -->
    
    https://issues.apache.org/jira/browse/SUBMARINE-1033
    
    ### How should this be tested?
    <!--
    * First time? Setup Travis CI as described on https://submarine.apache.org/contribution/contributions.html#continuous-integration
    * Strongly recommended: add automated unit tests for any new or changed behavior
    * Outline any manual steps to test the PR here.
    -->
    
    ### Screenshots (if appropriate)
    
    None
    
    ### Questions:
    * Do the license files need updating? No
    * Are there breaking changes for older versions? No
    * Does this need new documentation? No
    
    Author: 傅譽的MacBook <b0...@ntu.edu.tw>
    
    Signed-off-by: Kevin <pi...@apache.org>
    
    Closes #768 from FYRichie/SUBMARINE-1033 and squashes the following commits:
    
    c7832bb6 [傅譽的MacBook] SUBMARINE-1033. delete submarine-cloud
    7e69a1f7 [傅譽的MacBook] SUBMARINE-1033 remove submarine-cloud directory
---
 submarine-cloud/Dockerfile                         |  33 --
 submarine-cloud/Makefile                           |  51 --
 submarine-cloud/README.md                          |  28 -
 submarine-cloud/build.sh                           |  35 --
 submarine-cloud/cmd/operator/main.go               |  63 --
 submarine-cloud/go.mod                             |  28 -
 submarine-cloud/go.sum                             | 476 ---------------
 submarine-cloud/hack/boilerplate.go.txt            |  17 -
 submarine-cloud/hack/custom-boilerplate.go.txt     |  17 -
 submarine-cloud/hack/deploy-submarine.sh           | 150 -----
 submarine-cloud/hack/integration-test.sh           | 137 -----
 submarine-cloud/hack/kind                          |  27 -
 submarine-cloud/hack/kind-cluster-build.sh         | 248 --------
 submarine-cloud/hack/kubectl                       |  27 -
 submarine-cloud/hack/lib.sh                        | 108 ----
 submarine-cloud/hack/update-codegen.sh             |  42 --
 submarine-cloud/hack/verify-codegen.sh             |  51 --
 submarine-cloud/manifests/crd.yaml                 |  69 ---
 .../manifests/submarine-cluster/rbac.yaml          |  60 --
 .../submarine-cluster/serviceaccounts.yaml         |  25 -
 .../submarine-cluster/submarine-database.yaml      |  51 --
 .../submarine-cluster/submarine-server.yaml        | 114 ----
 .../submarine-cluster/submarine-tensorboard.yaml   |  99 ----
 .../manifests/submarine-operator/deployment.yaml   |  46 --
 .../manifests/submarine-operator/rbac.yaml         |  58 --
 .../submarine-operator/serviceaccounts.yaml        |  25 -
 submarine-cloud/pkg/apis/submarine/register.go     |  23 -
 .../pkg/apis/submarine/v1alpha1/const.go           |  24 -
 .../pkg/apis/submarine/v1alpha1/default.go         |  66 ---
 submarine-cloud/pkg/apis/submarine/v1alpha1/doc.go |  20 -
 .../pkg/apis/submarine/v1alpha1/register.go        |  67 ---
 .../pkg/apis/submarine/v1alpha1/types.go           | 222 -------
 .../submarine/v1alpha1/zz_generated.deepcopy.go    | 221 -------
 submarine-cloud/pkg/client/client.go               | 114 ----
 .../pkg/client/clientset/versioned/clientset.go    |  98 ----
 .../pkg/client/clientset/versioned/doc.go          |  21 -
 .../versioned/fake/clientset_generated.go          |  83 ---
 .../pkg/client/clientset/versioned/fake/doc.go     |  21 -
 .../client/clientset/versioned/fake/register.go    |  57 --
 .../pkg/client/clientset/versioned/scheme/doc.go   |  21 -
 .../client/clientset/versioned/scheme/register.go  |  57 --
 .../versioned/typed/submarine/v1alpha1/doc.go      |  21 -
 .../versioned/typed/submarine/v1alpha1/fake/doc.go |  21 -
 .../v1alpha1/fake/fake_submarine_client.go         |  41 --
 .../v1alpha1/fake/fake_submarinecluster.go         | 141 -----
 .../submarine/v1alpha1/generated_expansion.go      |  22 -
 .../typed/submarine/v1alpha1/submarine_client.go   |  90 ---
 .../typed/submarine/v1alpha1/submarinecluster.go   | 192 ------
 .../client/informers/externalversions/factory.go   | 181 ------
 .../client/informers/externalversions/generic.go   |  63 --
 .../internalinterfaces/factory_interfaces.go       |  41 --
 .../externalversions/submarine/interface.go        |  47 --
 .../submarine/v1alpha1/interface.go                |  46 --
 .../submarine/v1alpha1/submarinecluster.go         |  90 ---
 .../submarine/v1alpha1/expansion_generated.go      |  28 -
 .../listers/submarine/v1alpha1/submarinecluster.go |  95 ---
 submarine-cloud/pkg/config/cluster.go              |  33 --
 submarine-cloud/pkg/config/submarine.go            | 101 ----
 submarine-cloud/pkg/controller/actions.go          | 256 --------
 submarine-cloud/pkg/controller/checks.go           | 246 --------
 .../pkg/controller/clustering/cluster-migration.go |  61 --
 .../pkg/controller/clustering/cluster-placement.go | 237 --------
 .../pkg/controller/clustering/cluster-roles.go     |  44 --
 submarine-cloud/pkg/controller/condition.go        | 100 ----
 submarine-cloud/pkg/controller/config.go           |  33 --
 submarine-cloud/pkg/controller/controller.go       | 653 ---------------------
 submarine-cloud/pkg/controller/pod/control.go      | 171 ------
 submarine-cloud/pkg/controller/pod/utils.go        |  62 --
 .../pkg/controller/poddisruptionbudgets_control.go |  66 ---
 .../pkg/controller/sanitycheck/process.go          |  63 --
 submarine-cloud/pkg/controller/services_control.go |  78 ---
 submarine-cloud/pkg/controller/utils.go            |  82 ---
 submarine-cloud/pkg/operator/config.go             |  43 --
 submarine-cloud/pkg/operator/operator.go           | 148 -----
 submarine-cloud/pkg/signal/signal.go               |  39 --
 submarine-cloud/pkg/submarine/admin.go             | 209 -------
 submarine-cloud/pkg/submarine/client.go            | 119 ----
 submarine-cloud/pkg/submarine/cluster.go           |  43 --
 submarine-cloud/pkg/submarine/clusterinfo.go       | 168 ------
 submarine-cloud/pkg/submarine/connections.go       | 281 ---------
 submarine-cloud/pkg/submarine/errors.go            |  70 ---
 submarine-cloud/pkg/submarine/node.go              | 192 ------
 submarine-cloud/pkg/utils/build.go                 |  52 --
 submarine-cloud/pom.xml                            |  98 ----
 84 files changed, 8067 deletions(-)

diff --git a/submarine-cloud/Dockerfile b/submarine-cloud/Dockerfile
deleted file mode 100644
index 24294d9..0000000
--- a/submarine-cloud/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-
-FROM golang:1.13-alpine
-MAINTAINER Apache Software Foundation <de...@submarine.apache.org>
-
-# Update apk repositories
-RUN echo "http://mirrors.ustc.edu.cn/alpine/v3.10/main" > /etc/apk/repositories
-RUN echo "http://mirrors.ustc.edu.cn/alpine/v3.10/community" >> /etc/apk/repositories
-RUN apk add make --no-cache
-
-ENV GOPROXY https://goproxy.io
-ENV GO111MODULE on
-
-WORKDIR /go/cache
-
-ADD go.mod .
-ADD go.sum .
-RUN go mod download
-
-# docker build -t apache/submarine:build .
diff --git a/submarine-cloud/Makefile b/submarine-cloud/Makefile
deleted file mode 100644
index 2b7ce2f..0000000
--- a/submarine-cloud/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
-GOCMD=go
-GOBUILD=$(GOCMD) build
-GOCLEAN=$(GOCMD) clean
-GOTEST=$(GOCMD) test
-GOGET=$(GOCMD) get
-BINARY_NAME=submarine-operator
-VERSION="0.7.0-SNAPSHOT"
-BuildGitBranch=$(git rev-parse --abbrev-ref HEAD)
-BuildGitRev=$(git rev-list --count HEAD)
-BuildGitCommit=$(git rev-parse HEAD)
-LDFLAGS		:= -s -w \
-			   -X "github.com/apache/submarine/submarine-cloud/pkg/utils.VERSION=${VERSION}" \
-			   -X "github.com/apache/submarine/submarine-cloud/pkg/utils.BuildGitBranch=${BuildGitBranch}" \
-			   -X "github.com/apache/submarine/submarine-cloud/pkg/utils.BuildGitRev=${BuildGitRev}" \
-			   -X "github.com/apache/submarine/submarine-cloud/pkg/utils.BuildGitCommit=${BuildGitCommit}" \
-			   -X "github.com/apache/submarine/submarine-cloud/pkg/utils.BuildTime=$(/bin/date "+%F %T")"
-
-.PHONY: build
-build:
-	GOOS=${GOOS} GOARCH=amd64 $(GOBUILD) -o ./bin/$(BINARY_NAME) -v cmd/operator/main.go
-
-test:
-	#$(GOTEST) -v ./...
-
-all: test build
-
-clean:
-	$(GOCLEAN)
-	rm -f ./bin/$(BINARY_NAME)
-
-fmt:
-	@go fmt $(CURDIR)/...
-
-release:
-	CGO_ENABLED=0 GOOS=${GOOS} GOARCH=amd64 $(GOBUILD) -a -installsuffix cgo -ldflags "$(LDFLAGS)" -o ./bin/$(BINARY_NAME) -v cmd/operator/main.go
diff --git a/submarine-cloud/README.md b/submarine-cloud/README.md
deleted file mode 100644
index 08b015a..0000000
--- a/submarine-cloud/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Submarine Operator
-## Run (Method 1)
-```
-# Build Submarine Operator Binary
-cd submarine/submarine-cloud
-make build
-
-# Create CRD (SubmarineCluster)
-kubectl apply -f manifests/crd.yaml
-
-# Create a kind cluster
-./hack/kind-cluster-build.sh --name "submarine"
-
-# Launch Submarine Operator (Method 1)
-# ([Kind v0.7.0-SNAPSHOT deprecates `kind get kubeconfig-path`](https://github.com/kubernetes-sigs/cluster-api/issues/1796))
-KUBECONFIG=$(kind get kubeconfig-path --name submarine)
-./submarine-operator --kubeconfig=${KUBECONFIG} --alsologtostderr --v=7
-
-# Launch Submarine Operator (Method 2)
-kind get kubeconfig --name submarine > kind_kubeconfig
-KUBECONFIG=$(path of kind_kubeconfig)
-./bin/submarine-operator --kubeconfig=${KUBECONFIG} --alsologtostderr --v=7
-```
-
-## Run (Method 2)
-```
-kubectl apply -f submarine-operator
-```
diff --git a/submarine-cloud/build.sh b/submarine-cloud/build.sh
deleted file mode 100755
index 5bcabee..0000000
--- a/submarine-cloud/build.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-set -euo pipefail
-
-if [ -L ${BASH_SOURCE-$0} ]; then
-  PWD=$(dirname $(readlink "${BASH_SOURCE-$0}"))
-else
-  PWD=$(dirname ${BASH_SOURCE-$0})
-fi
-export CURRENT_PATH=$(cd "${PWD}">/dev/null; pwd)
-cd $CURRENT_PATH
-
-echo "${1} submarine-cloud by docker ..."
-if [[ "${1}"x == "test"x ]]; then
-  echo "Test submarine-cloud by docker ..."
-elif [ "${1}"x == "clean"x ]; then
-  rm -rf ./bin
-else
-  docker run --rm -v "$CURRENT_PATH":/go/src/submarine-cloud -w /go/src/submarine-cloud -e GOOS="${GOOS:-darwin}" -e GOARCH="${GOARCH:-amd64}" apache/submarine:build /bin/sh -c "make ${1} && chown -R $(id -u):$(id -g) ./bin"
-fi;
diff --git a/submarine-cloud/cmd/operator/main.go b/submarine-cloud/cmd/operator/main.go
deleted file mode 100644
index aafcc9a..0000000
--- a/submarine-cloud/cmd/operator/main.go
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 main
-
-import (
-	"context"
-	goflag "flag"
-	"fmt"
-	"github.com/apache/submarine/submarine-cloud/pkg/operator"
-	"github.com/apache/submarine/submarine-cloud/pkg/signal"
-	"github.com/apache/submarine/submarine-cloud/pkg/utils"
-	"github.com/golang/glog"
-	"github.com/spf13/pflag"
-	"os"
-	"runtime"
-)
-
-func main() {
-	utils.BuildInfos()
-	runtime.GOMAXPROCS(runtime.NumCPU())
-
-	config := operator.NewSubmarineOperatorConfig()
-	config.AddFlags(pflag.CommandLine)
-
-	pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
-	pflag.Parse()
-	goflag.CommandLine.Parse([]string{})
-
-	fmt.Println("config:", config)
-
-	op := operator.NewSubmarineOperator(config)
-
-	if err := run(op); err != nil {
-		glog.Errorf("SubmarineOperator returns an error:%v", err)
-		os.Exit(1)
-	}
-
-	os.Exit(0)
-}
-
-func run(op *operator.SubmarineOperator) error {
-	ctx, cancelFunc := context.WithCancel(context.Background())
-	go signal.HandleSignal(cancelFunc)
-
-	op.Run(ctx.Done())
-
-	return nil
-}
diff --git a/submarine-cloud/go.mod b/submarine-cloud/go.mod
deleted file mode 100644
index 71dc0c8..0000000
--- a/submarine-cloud/go.mod
+++ /dev/null
@@ -1,28 +0,0 @@
-// This is a generated file. Do not edit directly.
-
-module github.com/apache/submarine/submarine-cloud
-
-go 1.13
-
-require (
-	github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
-	github.com/heptiolabs/healthcheck v0.0.0-20180807145615-6ff867650f40
-	github.com/mitchellh/go-homedir v1.1.0
-	github.com/spf13/cobra v0.0.5
-	github.com/spf13/pflag v1.0.5
-	github.com/spf13/viper v1.5.0
-	k8s.io/api v0.17.0
-	k8s.io/apiextensions-apiserver v0.17.0
-	k8s.io/apimachinery v0.17.0
-	k8s.io/client-go v0.17.0
-	k8s.io/code-generator v0.17.0
-)
-
-replace (
-	golang.org/x/sys => golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // pinned to release-branch.go1.13
-	golang.org/x/tools => golang.org/x/tools v0.0.0-20190821162956-65e3620a7ae7 // pinned to release-branch.go1.13
-	k8s.io/api => k8s.io/api v0.0.0-20191121015604-11707872ac1c
-	k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20191121015412-41065c7a8c2a
-	k8s.io/client-go => k8s.io/client-go v0.0.0-20191121015835-571c0ef67034
-	k8s.io/code-generator => k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e
-)
diff --git a/submarine-cloud/go.sum b/submarine-cloud/go.sum
deleted file mode 100644
index b788913..0000000
--- a/submarine-cloud/go.sum
+++ /dev/null
@@ -1,476 +0,0 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
-github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
-github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
-github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
-github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
-github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
-github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
-github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0=
-github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
-github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/apache/submarine v0.0.0-20191217064858-fc7e722da84f h1:eQ/mULGQcKeW9CMan+NzSpoMpiPEG5YckWyInzxuUWI=
-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
-github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs=
-github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
-github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
-github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
-github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
-github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
-github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
-github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
-github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
-github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
-github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
-github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
-github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
-github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
-github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
-github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
-github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
-github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
-github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
-github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
-github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
-github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
-github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
-github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
-github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY=
-github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk=
-github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
-github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
-github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI=
-github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
-github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
-github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
-github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
-github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
-github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
-github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
-github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
-github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
-github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
-github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
-github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
-github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
-github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
-github.com/go-openapi/validate v0.19.5 h1:QhCBKRYqZR+SKo4gl1lPhPahope8/RLt6EVgY8X80w0=
-github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I=
-github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 h1:LbsanbbD6LieFkXbj9YNNBupiGHJgFeLpO0j0Fza1h8=
-github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
-github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k=
-github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
-github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
-github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/heptiolabs/healthcheck v0.0.0-20180807145615-6ff867650f40 h1:GT4RsKmHh1uZyhmTkWJTDALRjSHYQp6FRKrotf0zhAs=
-github.com/heptiolabs/healthcheck v0.0.0-20180807145615-6ff867650f40/go.mod h1:NtmN9h8vrTveVQRLHcX2HQ5wIPBDCsZ351TGbZWgg38=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q=
-github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
-github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
-github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
-github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
-github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
-github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
-github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
-github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
-github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4=
-github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
-github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
-github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0=
-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
-go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA=
-go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
-golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
-golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20190821162956-65e3620a7ae7 h1:PVCvyir09Xgta5zksNZDkrL+eSm/Y+gQxRG3IfqNQ3A=
-golang.org/x/tools v0.0.0-20190821162956-65e3620a7ae7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485 h1:OB/uP/Puiu5vS5QMRPrXCDWUPb+kt8f1KW8oQzFejQw=
-gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk=
-google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
-gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-k8s.io/api v0.0.0-20191121015604-11707872ac1c h1:Z87my3sF4WhG0OMxzARkWY/IKBtOr+MhXZAb4ts6qFc=
-k8s.io/api v0.0.0-20191121015604-11707872ac1c/go.mod h1:R/s4gKT0V/cWEnbQa9taNRJNbWUK57/Dx6cPj6MD3A0=
-k8s.io/apiextensions-apiserver v0.0.0-20191204090421-cd61debedab5 h1:g+GvnbGqLU1Jxb/9iFm/BFcmkqG9HdsGh52+wHirpsM=
-k8s.io/apiextensions-apiserver v0.0.0-20191204090421-cd61debedab5/go.mod h1:CPw0IHz1YrWGy0+8mG/76oTHXvChlgCb3EAezKQKB2I=
-k8s.io/apiextensions-apiserver v0.17.0 h1:+XgcGxqaMztkbbvsORgCmHIb4uImHKvTjNyu7b8gRnA=
-k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8=
-k8s.io/apimachinery v0.0.0-20191121015412-41065c7a8c2a h1:9V03T5lHv/iF4fSgvMCd+iB86AgEgmzLpheMqIJy7hs=
-k8s.io/apimachinery v0.0.0-20191121015412-41065c7a8c2a/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
-k8s.io/apiserver v0.0.0-20191204084332-137a9d3b886b h1:QCZdKeWUjPS7uv9ewmHn1GFCevRLKyTURPbvi1kFFHM=
-k8s.io/apiserver v0.0.0-20191204084332-137a9d3b886b/go.mod h1:itgfam5HJbT/4b2BGfpUkkxfheMmDH+Ix+tEAP3uqZk=
-k8s.io/apiserver v0.17.0 h1:XhUix+FKFDcBygWkQNp7wKKvZL030QUlH1o8vFeSgZA=
-k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg=
-k8s.io/client-go v0.0.0-20191121015835-571c0ef67034 h1:+/ppGIi1rJThJAz/xJSSOuD82gb6E5jRv2305MSznxQ=
-k8s.io/client-go v0.0.0-20191121015835-571c0ef67034/go.mod h1:Adhj+OyDRsEXTnL9BfL7xbLWGWMCqGLWpMqGHkZI4J8=
-k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e h1:HB9Zu5ZUvJfNpLiTPhz+CebVKV8C39qTBMQkAgAZLNw=
-k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s=
-k8s.io/component-base v0.0.0-20191204083903-0d4d24e738e4/go.mod h1:8VIh1jErItC4bg9hLBkPneyS77Tin8KwSzbYepHJnQI=
-k8s.io/component-base v0.0.0-20191204083906-3ac1376c73aa h1:SenKbYwkn+6a0owQHeg565VpA0snQAYupFVHFWA2qYg=
-k8s.io/component-base v0.0.0-20191204083906-3ac1376c73aa/go.mod h1:mECWvHCPhJudDVDMtBl+AIf/YnTMp5r1F947OYFUwP0=
-k8s.io/component-base v0.17.0 h1:BnDFcmBDq+RPpxXjmuYnZXb59XNN9CaFrX8ba9+3xrA=
-k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc=
-k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
-k8s.io/gengo v0.0.0-20190822140433-26a664648505 h1:ZY6yclUKVbZ+SdWnkfY+Je5vrMpKOxmGeKRbsXVmqYM=
-k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
-k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
-k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
-k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU=
-k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
-k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo=
-k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
-modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
-modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
-modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
-modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
-modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
-sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
-sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU=
-sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18=
-sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
-sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
diff --git a/submarine-cloud/hack/boilerplate.go.txt b/submarine-cloud/hack/boilerplate.go.txt
deleted file mode 100644
index 29400e5..0000000
--- a/submarine-cloud/hack/boilerplate.go.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
diff --git a/submarine-cloud/hack/custom-boilerplate.go.txt b/submarine-cloud/hack/custom-boilerplate.go.txt
deleted file mode 100644
index 29400e5..0000000
--- a/submarine-cloud/hack/custom-boilerplate.go.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
diff --git a/submarine-cloud/hack/deploy-submarine.sh b/submarine-cloud/hack/deploy-submarine.sh
deleted file mode 100755
index 4caeca9..0000000
--- a/submarine-cloud/hack/deploy-submarine.sh
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-set -euo pipefail
-
-ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
-cd $ROOT
-SUBMARINE_HOME=${ROOT}/..
-SUBMARINE_VERSION="0.7.0-SNAPSHOT"
-
-source $ROOT/hack/lib.sh
-
-hack::ensure_kubectl
-
-# Install submarine in k8s cluster
-function install_submarine() {
-  if [ ! -d "${ROOT}/hack/conf" ]; then
-    mkdir "${ROOT}/hack/conf"
-  fi
-
-  if [ ! -f "${ROOT}/hack/conf/submarine-site.xml" ]; then
-    cp "${SUBMARINE_HOME}/conf/submarine-site.xml.template" "${ROOT}/hack/conf/submarine-site.xml"
-
-    # Replace the mysql jdbc.url in the submarine-site.xml file with the name of the submarine database ip/service
-    sed -i.bak "s/127.0.0.1:3306/${DATABASE_IP}:3306/g" "${ROOT}/hack/conf/submarine-site.xml"
-  fi
-
-  if [ ! -f "${ROOT}/hack/conf/log4j.properties" ]; then
-    cp ${SUBMARINE_HOME}/conf/log4j.properties.template ${ROOT}/hack/conf/log4j.properties
-  fi
-
-  if [[ "$TEST" == "" ]]; then
-    echo ""
-    echo -e "Have you configured the \033[31m${ROOT}/hack/conf/submarine-site.xml\033[0m file?"
-    echo -e "Have you configured the \033[31m${ROOT}/hack/conf/log4j.properties\033[0m file?"
-    echo -n "Do you want to deploy submarine in k8s cluster now? [y/n]"
-    read myselect
-  else
-    myselect="y"
-  fi
-
-  if [[ "$myselect" == "y" || "$myselect" == "Y" ]]; then
-    if $KUBECTL_BIN get configmap --namespace default | grep submarine-config >/dev/null ; then
-      $KUBECTL_BIN delete configmap --namespace default submarine-config
-    fi
-    $KUBECTL_BIN create configmap --namespace default submarine-config --from-file=${ROOT}/hack/conf/submarine-site.xml --from-file=${ROOT}/hack/conf/log4j.properties
-
-    if ! docker inspect apache/submarine:operator-${SUBMARINE_VERSION} >/dev/null ; then
-      docker pull apache/submarine:operator-${SUBMARINE_VERSION}
-    fi
-    $KIND_BIN load docker-image apache/submarine:operator-${SUBMARINE_VERSION}
-    $KUBECTL_BIN apply -f $ROOT/manifests/submarine-operator/
-
-    if ! docker inspect apache/submarine:database-${SUBMARINE_VERSION} >/dev/null ; then
-      docker pull apache/submarine:database-${SUBMARINE_VERSION}
-    fi
-    $KIND_BIN load docker-image apache/submarine:database-${SUBMARINE_VERSION}
-
-    if ! docker inspect apache/submarine:server-${SUBMARINE_VERSION} >/dev/null ; then
-      docker pull apache/submarine:server-${SUBMARINE_VERSION}
-    fi
-    $KIND_BIN load docker-image apache/submarine:server-${SUBMARINE_VERSION}
-    $KUBECTL_BIN apply -f $ROOT/manifests/submarine-cluster/
-
-    echo "NOTE: You can open your browser and access the submarine workbench at http://127.0.0.1/"
-  fi
-}
-
-# Uninstall submarine in k8s cluster
-function uninstall_submarine() {
-  if $KUBECTL_BIN get configmap --namespace default | grep submarine-config >/dev/null ; then
-    $KUBECTL_BIN delete configmap --namespace default submarine-config
-  fi
-  $KUBECTL_BIN delete -f $ROOT/manifests/submarine-operator/
-  $KUBECTL_BIN delete -f $ROOT/manifests/submarine-cluster/
-
-  cat <<EOF
-NOTE: Submarine cluster has been deleted
-EOF
-}
-
-usage() {
-    cat <<EOF
-This script use kind to create Submarine cluster, about kind please refer: https://kind.sigs.k8s.io/
-* This script will automatically install kubectr-${KUBECTL_VERSION} and kind-${KIND_VERSION} in ${OUTPUT_BIN}
-
-Options:
-       -d,--database           ip/service of submarine database, default value: submarine-database
-       -u,--uninstall          uninstall submarine cluster
-       -t,--test               auto install
-       -h,--help               prints the usage message
-Usage:
-    install: $0 --database database_ip
-     OR
-    uninstall: $0 -u
-EOF
-}
-
-while [[ $# -gt 0 ]]
-do
-key="$1"
-
-case $key in
-    -d|--database)
-    DATABASE_IP="$2"
-    shift
-    shift
-    ;;
-    -t|--test)
-    TEST="TRUE"
-    shift
-    ;;
-    -u|--uninstall)
-    UNINSTALL="TRUE"
-    shift
-    ;;
-    *)
-    echo "unknown option: $key"
-    usage
-    exit 1
-    ;;
-esac
-done
-
-TEST=${TEST:-}
-UNINSTALL=${UNINSTALL:-}
-DATABASE_IP=${DATABASE_IP:-submarine-database}
-echo "Submarine database ip: ${DATABASE_IP}"
-
-export KUBECONFIG=~/.kube/kind-config-${clusterName:-kind}
-
-if [[ "${UNINSTALL}" == "TRUE" ]]; then
-  uninstall_submarine
-else
-  install_submarine
-fi
diff --git a/submarine-cloud/hack/integration-test.sh b/submarine-cloud/hack/integration-test.sh
deleted file mode 100755
index 7a9dc81..0000000
--- a/submarine-cloud/hack/integration-test.sh
+++ /dev/null
@@ -1,137 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-set -euxo pipefail
-
-ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
-cd $ROOT
-SUBMARINE_HOME=${ROOT}/..
-
-source $ROOT/hack/lib.sh
-
-hack::ensure_kubectl
-
-export KUBECONFIG=~/.kube/kind-config-${clusterName:-kind}
-
-function start() {
-  $ROOT/hack/kind-cluster-build.sh
-  $SUBMARINE_HOME/dev-support/k8s/deploy-traefik.sh
-  $SUBMARINE_HOME/dev-support/k8s/deploy-kubeflow-operators.sh -a
-  $SUBMARINE_HOME/dev-support/k8s/deploy-notebook-controller.sh
-  $ROOT/hack/deploy-submarine.sh --test
-
-  for((i=1;i<=30;i++)); do
-    info=`curl -s -m 10 --connect-timeout 10 -I http://127.0.0.1/api/v1/cluster/address`
-    code=`echo $info | grep "HTTP" | awk '{print $2}'`
-
-    #############  DON'T DELETE NEXT DEBUG COMMAND  #############
-    # $KUBECTL_BIN get node
-    # $KUBECTL_BIN get pods
-    # $KUBECTL_BIN get svc
-    # podname=`$KUBECTL_BIN get pods | grep submarinecluster-submarine | awk '{print $1}'`
-    # $KUBECTL_BIN describe pod $podname
-    # $KUBECTL_BIN logs $podname
-    ############################################################
-
-    if [ "$code" == "200" ];then
-        echo "Start submarine on k8s success!"
-        exit;
-    else
-        echo "Request failed with response code = $code"
-    fi
-    sleep 3
-  done
-
-  #############  DON'T DELETE NEXT DEBUG COMAND  #############
-  # $KUBECTL_BIN get node
-  # podname=`$KUBECTL_BIN get pods | grep submarinecluster-submarine | awk '{print $1}'`
-  # $KUBECTL_BIN describe pod $podname
-  # $KUBECTL_BIN exec -it $podname cat /opt/submarine-current/logs/submarine.log
-  # $KUBECTL_BIN exec $podname -- bash -c "tail -500 /opt/submarine-current/logs/submarine.log"
-  # $KUBECTL_BIN get pods | grep submarinecluster-submarine | awk '{print $1}' | xargs -I {} $KUBECTL_BIN exec {} -- bash -c "tail -500 /opt/submarine-current/logs/submarine.log"
-  # kubectl get pods -n operations | grep operations | awk '{print $1}' | xargs -I {} kubectl exec -it -n operations {} cat /tmp/operations-server.INFO
-  ############################################################
-  echo "Start submarine on k8s failure!"
-}
-
-function stop() {
-  $ROOT/hack/kind delete cluster
-}
-
-function update_docker_images() {
-  $SUBMARINE_HOME/dev-support/docker-images/database/build.sh
-  $SUBMARINE_HOME/dev-support/docker-images/operator/build.sh
-  $SUBMARINE_HOME/dev-support/docker-images/submarine/build.sh
-
-  docker images
-}
-
-usage() {
-    cat <<EOF
-This script use kind to create Kubernetes cluster and deploy submarine to k8s
-
-Options:
-       -h,--help          prints the usage message
-       -s,--start         Create k8s and start submarine
-       -t,--stop          Delete k8s cluster and submarine
-       -u,--update        update submarine docker image
-Usage:
-    $0 --start --update
-EOF
-}
-
-while [[ $# -gt 0 ]]
-do
-key="$1"
-
-case $key in
-    -s|--start)
-    OPERATION="START"
-    shift
-    ;;
-    -t|--stop)
-    OPERATION="STOP"
-    shift
-    ;;
-    -u|--update)
-    UPDATE_IMAGE="TRUE"
-    shift
-    ;;
-    -h|--help)
-    usage
-    exit 0
-    ;;
-    *)
-    echo "unknown option: $key"
-    usage
-    exit 1
-    ;;
-esac
-done
-
-OPERATION=${OPERATION:-""}
-UPDATE_IMAGE=${UPDATE_IMAGE:-""}
-
-if [[ $UPDATE_IMAGE == "TRUE" ]]; then
-  update_docker_images
-fi
-
-if [[ $OPERATION == "STOP" ]]; then
-  stop
-else
-  start
-fi
diff --git a/submarine-cloud/hack/kind b/submarine-cloud/hack/kind
deleted file mode 100755
index 325d791..0000000
--- a/submarine-cloud/hack/kind
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-
-set -euo pipefail
-
-ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
-
-source $ROOT/hack/lib.sh
-
-hack::ensure_kind
-
-$KIND_BIN "$@"
diff --git a/submarine-cloud/hack/kind-cluster-build.sh b/submarine-cloud/hack/kind-cluster-build.sh
deleted file mode 100755
index ab371e4..0000000
--- a/submarine-cloud/hack/kind-cluster-build.sh
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-set -euo pipefail
-
-ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
-cd $ROOT
-
-source $ROOT/hack/lib.sh
-
-hack::ensure_kubectl
-hack::ensure_kind
-
-usage() {
-    cat <<EOF
-This script use kind to create Kubernetes cluster, about kind please refer: https://kind.sigs.k8s.io/
-* This script will automatically install kubectr-${KUBECTL_VERSION} and kind-${KIND_VERSION} in ${OUTPUT_BIN}
-
-Options:
-       -h,--help               prints the usage message
-       -n,--name               name of the Kubernetes cluster,default value: kind
-       -c,--nodeNum            the count of the cluster nodes,default value: 1
-       -k,--k8sVersion         version of the Kubernetes cluster,default value: v1.14.2
-       -v,--volumeNum          the volumes number of each kubernetes node,default value: 1
-Usage:
-    $0 --name testCluster --nodeNum 4 --k8sVersion v1.12.9
-EOF
-}
-
-while [[ $# -gt 0 ]]
-do
-key="$1"
-
-case $key in
-    -n|--name)
-    clusterName="$2"
-    shift
-    shift
-    ;;
-    -c|--nodeNum)
-    nodeNum="$2"
-    shift
-    shift
-    ;;
-    -k|--k8sVersion)
-    k8sVersion="$2"
-    shift
-    shift
-    ;;
-    -v|--volumeNum)
-    volumeNum="$2"
-    shift
-    shift
-    ;;
-    -h|--help)
-    usage
-    exit 0
-    ;;
-    *)
-    echo "unknown option: $key"
-    usage
-    exit 1
-    ;;
-esac
-done
-
-clusterName=${clusterName:-kind}
-nodeNum=${nodeNum:-1}
-k8sVersion=${k8sVersion:-v1.14.2}
-volumeNum=${volumeNum:-1}
-
-echo "clusterName: ${clusterName}"
-echo "nodeNum: ${nodeNum}"
-echo "k8sVersion: ${k8sVersion}"
-echo "volumeNum: ${volumeNum}"
-
-echo "############# start create cluster:[${clusterName}] #############"
-workDir=${HOME}/kind/${clusterName}
-mkdir -p ${workDir}
-
-data_dir=${workDir}/data
-
-echo "clean data dir: ${data_dir}"
-if [ -d ${data_dir} ]; then
-    rm -rf ${data_dir}
-fi
-
-configFile=${workDir}/kind-config.yaml
-
-cat <<EOF > ${configFile}
-kind: Cluster
-apiVersion: kind.x-k8s.io/v1alpha4
-nodes:
-- role: control-plane
-  kubeadmConfigPatches:
-  - |
-    kind: InitConfiguration
-    nodeRegistration:
-      kubeletExtraArgs:
-        node-labels: "ingress-ready=true"
-        authorization-mode: "AlwaysAllow"
-  extraPortMappings:
-  - containerPort: 5000
-    hostPort: 5000
-    listenAddress: 127.0.0.1
-    protocol: TCP
-  - containerPort: 32080
-    hostPort: 80
-    protocol: TCP
-  - containerPort: 32443
-    hostPort: 443
-    protocol: TCP
-EOF
-
-for ((i=0;i<${nodeNum};i++))
-do
-    mkdir -p ${data_dir}/worker${i}
-    cat <<EOF >>  ${configFile}
-- role: worker
-  extraMounts:
-EOF
-    for ((k=1;k<=${volumeNum};k++))
-    do
-        mkdir -p ${data_dir}/worker${i}/vol${k}
-        cat <<EOF >> ${configFile}
-  - containerPath: /mnt/disks/vol${k}
-    hostPath: ${data_dir}/worker${i}/vol${k}
-EOF
-    done
-done
-
-echo "start to create k8s cluster"
-test -d "~/.kube" || mkdir -p "~/.kube"
-export KUBECONFIG=~/.kube/kind-config-${clusterName}
-$KIND_BIN create cluster --config ${configFile} --image kindest/node:${k8sVersion} --name=${clusterName}
-$KIND_BIN export kubeconfig --kubeconfig ${KUBECONFIG}
-
-echo "deploy docker registry in kind"
-registryNode=${clusterName}-control-plane
-registryNodeIP=$($KUBECTL_BIN get nodes ${registryNode} -o template --template='{{range.status.addresses}}{{if eq .type "InternalIP"}}{{.address}}{{end}}{{end}}')
-registryFile=${workDir}/registry.yaml
-
-cat <<EOF >${registryFile}
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
-  name: registry
-spec:
-  selector:
-    matchLabels:
-      app: registry
-  template:
-    metadata:
-      labels:
-        app: registry
-    spec:
-      hostNetwork: true
-      nodeSelector:
-        kubernetes.io/hostname: ${registryNode}
-      tolerations:
-      - key: node-role.kubernetes.io/master
-        operator: "Equal"
-        effect: "NoSchedule"
-      containers:
-      - name: registry
-        image: registry:2
-        volumeMounts:
-        - name: data
-          mountPath: /data
-      volumes:
-      - name: data
-        hostPath:
-          path: /data
----
-apiVersion: apps/v1
-kind: DaemonSet
-metadata:
-  name: registry-proxy
-  labels:
-    app: registry-proxy
-spec:
-  selector:
-    matchLabels:
-      app: registry-proxy
-  template:
-    metadata:
-      labels:
-        app: registry-proxy
-    spec:
-      hostNetwork: true
-      affinity:
-        nodeAffinity:
-          requiredDuringSchedulingIgnoredDuringExecution:
-            nodeSelectorTerms:
-            - matchExpressions:
-              - key: kubernetes.io/hostname
-                operator: NotIn
-                values:
-                  - ${registryNode}
-      tolerations:
-      - key: node-role.kubernetes.io/master
-        operator: "Equal"
-        effect: "NoSchedule"
-      containers:
-        - name: socat
-          image: alpine/socat:1.0.5
-          args:
-          - tcp-listen:5000,fork,reuseaddr
-          - tcp-connect:${registryNodeIP}:5000
-EOF
-$KUBECTL_BIN apply -f ${registryFile}
-
-echo "load docker image registry:2 to kind"
-if ! docker inspect registry:2 >/dev/null ; then
-  docker pull registry:2
-fi
-$KIND_BIN load docker-image registry:2
-
-$KUBECTL_BIN get pod -A
-
-echo "############# success create cluster:[${clusterName}] #############"
-
-echo "To start using your cluster, run:"
-echo "    ./kubectl config use-context kind-${clusterName}"
-echo "    ./kubectl get pods -A"
-echo <<EOF
-NOTE: In kind, nodes run docker network and cannot access host network.
-If you configured local HTTP proxy in your docker, images may cannot be pulled
-because http proxy is inaccessible.
-
-If you cannot remove http proxy settings, you can either whitelist image
-domains in NO_PROXY environment or use 'docker pull <image> && $KIND_BIN load
-docker-image <image>' command to load images into nodes.
-EOF
diff --git a/submarine-cloud/hack/kubectl b/submarine-cloud/hack/kubectl
deleted file mode 100755
index 36a1a63..0000000
--- a/submarine-cloud/hack/kubectl
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-
-set -euo pipefail
-
-ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
-
-source $ROOT/hack/lib.sh
-
-hack::ensure_kubectl
-
-$KUBECTL_BIN "$@"
diff --git a/submarine-cloud/hack/lib.sh b/submarine-cloud/hack/lib.sh
deleted file mode 100755
index 2ac50f3..0000000
--- a/submarine-cloud/hack/lib.sh
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-
-if [ -z "$ROOT" ]; then
-    echo "error: ROOT should be initialized"
-    exit 1
-fi
-
-OS=$(go env GOOS)
-ARCH=$(go env GOARCH)
-OUTPUT=${ROOT}/hack/output
-OUTPUT_BIN=${OUTPUT}/bin
-
-KUBECTL_VERSION=1.14.2
-KUBECTL_BIN=$OUTPUT_BIN/kubectl
-
-KIND_VERSION=0.7.0
-KIND_BIN=$OUTPUT_BIN/kind
-
-test -d "$OUTPUT_BIN" || mkdir -p "$OUTPUT_BIN"
-
-function hack::verify_kubectl() {
-    if test -x "$KUBECTL_BIN"; then
-        [[ "$($KUBECTL_BIN version --client --short | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+')" == "$KUBECTL_VERSION" ]]
-        return
-    fi
-    return 1
-}
-
-function hack::ensure_kubectl() {
-    if hack::verify_kubectl; then
-        return 0
-    fi
-
-    # Use the locally installed kubectl(1.14.2).
-    # Because of the development, we are using a specific version of kubectl now.
-    # orig_kubectl_bin="$KUBECTL_BIN"
-    # if command -v kubectl > /dev/null; then
-    #     KUBECTL_BIN="$(command -v kubectl)"
-    #     if hack::verify_kubectl; then
-    #         ln -sf "$KUBECTL_BIN" "$orig_kubectl_bin"
-    #         KUBECTL_BIN="$orig_kubectl_bin"
-    #         echo $KUBECTL_BIN
-    #         return 0
-    #     fi
-    # fi
-
-    echo "Installing kubectl v$KUBECTL_VERSION..."
-    tmpfile=$(mktemp)
-    trap "test -f $tmpfile && rm $tmpfile" RETURN
-    curl --retry 10 -L -o $tmpfile https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/${OS}/${ARCH}/kubectl
-    mv $tmpfile $KUBECTL_BIN
-    chmod +x $KUBECTL_BIN
-}
-
-function hack::verify_kind() {
-    if test -x "$KIND_BIN"; then
-        [[ "$($KIND_BIN --version 2>&1 | cut -d ' ' -f 3)" == "$KIND_VERSION" ]]
-        return
-    fi
-    return 1
-}
-
-function hack::ensure_kind() {
-    if hack::verify_kind; then
-        return 0
-    fi
-
-    # Use the locally installed kind(0.7.0).
-    # Because of the development, we are using a specific version of kubectl now.
-    # orig_kind_bin="$KIND_BIN"
-    # if command -v kind > /dev/null; then
-    #     KIND_BIN="$(command -v kind)"
-    #     if hack::verify_kind; then
-    #         ln -sf "$KIND_BIN" "$orig_kind_bin"
-    #         KIND_BIN="$orig_kind_bin"
-    #         echo $KIND_BIN
-    #         return 0
-    #     fi
-    # fi
-
-    echo "Installing kind v$KIND_VERSION..."
-    tmpfile=$(mktemp)
-    trap "test -f $tmpfile && rm $tmpfile" RETURN
-    curl --retry 10 -L -o $tmpfile https://github.com/kubernetes-sigs/kind/releases/download/v${KIND_VERSION}/kind-$(uname)-amd64
-    mv $tmpfile $KIND_BIN
-    chmod +x $KIND_BIN
-}
-
-# hack::version_ge "$v1" "$v2" checks whether "v1" is greater or equal to "v2"
-function hack::version_ge() {
-    [ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ]
-}
diff --git a/submarine-cloud/hack/update-codegen.sh b/submarine-cloud/hack/update-codegen.sh
deleted file mode 100755
index e16484f..0000000
--- a/submarine-cloud/hack/update-codegen.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
-
-set -o errexit
-set -o nounset
-set -o pipefail
-
-SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
-CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo $GOPATH/src/k8s.io/code-generator/)}
-
-# generate the code with:
-# --output-base    because this script should also be able to run inside the vendor dir of
-#                  k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir
-#                  instead of the $GOPATH directly. For normal projects this can be dropped.
-bash "${CODEGEN_PKG}"/generate-groups.sh "deepcopy,client,informer,lister" \
-  "github.com/apache/submarine/submarine-cloud/pkg/client" \
-  "github.com/apache/submarine/submarine-cloud/pkg/apis" \
-  "submarine:v1alpha1" \
-  --output-base "$(dirname "${BASH_SOURCE[0]}")/.." \
-  --go-header-file "${SCRIPT_ROOT}"/hack/boilerplate.go.txt
-
-# To use your own boilerplate text append:
-#   --go-header-file "${SCRIPT_ROOT}"/hack/custom-boilerplate.go.txt
-
-cp -R "$(dirname "${BASH_SOURCE[0]}")/../github.com/apache/submarine/submarine-cloud/pkg" "$(dirname "${BASH_SOURCE[0]}")/.."
-rm -R "$(dirname "${BASH_SOURCE[0]}")/../github.com/"
diff --git a/submarine-cloud/hack/verify-codegen.sh b/submarine-cloud/hack/verify-codegen.sh
deleted file mode 100755
index 3089f80..0000000
--- a/submarine-cloud/hack/verify-codegen.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
-
-set -o errexit
-set -o nounset
-set -o pipefail
-
-SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
-
-DIFFROOT="${SCRIPT_ROOT}/pkg"
-TMP_DIFFROOT="${SCRIPT_ROOT}/_tmp/pkg"
-_tmp="${SCRIPT_ROOT}/_tmp"
-
-cleanup() {
-  rm -rf "${_tmp}"
-}
-trap "cleanup" EXIT SIGINT
-
-cleanup
-
-mkdir -p "${TMP_DIFFROOT}"
-cp -a "${DIFFROOT}"/* "${TMP_DIFFROOT}"
-
-"${SCRIPT_ROOT}/hack/update-codegen.sh"
-echo "diffing ${DIFFROOT} against freshly generated codegen"
-ret=0
-diff -Naupr "${DIFFROOT}" "${TMP_DIFFROOT}" || ret=$?
-cp -a "${TMP_DIFFROOT}"/* "${DIFFROOT}"
-if [[ $ret -eq 0 ]]
-then
-  echo "${DIFFROOT} up to date."
-else
-  echo "${DIFFROOT} is out of date. Please run hack/update-codegen.sh"
-  exit 1
-fi
diff --git a/submarine-cloud/manifests/crd.yaml b/submarine-cloud/manifests/crd.yaml
deleted file mode 100644
index 1b62032..0000000
--- a/submarine-cloud/manifests/crd.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: apiextensions.k8s.io/v1beta1
-kind: CustomResourceDefinition
-metadata:
-  creationTimestamp: "2020-01-27T03:46:24Z"
-  generation: 1
-  name: submarineclusters.submarine.apache.org
-  resourceVersion: "172901"
-  selfLink: /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/submarineclusters.submarine.apache.org
-  uid: 96ee5ef5-40b7-11ea-8e11-0242ac110002
-spec:
-  additionalPrinterColumns:
-    - JSONPath: .metadata.creationTimestamp
-      description: |-
-        CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.
-
-        Populated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
-      name: Age
-      type: date
-  group: submarine.apache.org
-  names:
-    kind: SubmarineCluster
-    listKind: SubmarineClusterList
-    plural: submarineclusters
-    shortNames:
-      - submarine
-    singular: submarinecluster
-  scope: Namespaced
-  version: v1alpha1
-  versions:
-    - name: v1alpha1
-      served: true
-      storage: true
-status:
-  acceptedNames:
-    kind: SubmarineCluster
-    listKind: SubmarineClusterList
-    plural: submarineclusters
-    shortNames:
-      - submarine
-    singular: submarinecluster
-  conditions:
-    - lastTransitionTime: "2020-01-27T03:46:24Z"
-      message: no conflicts found
-      reason: NoConflicts
-      status: "True"
-      type: NamesAccepted
-    - lastTransitionTime: null
-      message: the initial names have been accepted
-      reason: InitialNamesAccepted
-      status: "True"
-      type: Established
-  storedVersions:
-    - v1alpha1
diff --git a/submarine-cloud/manifests/submarine-cluster/rbac.yaml b/submarine-cloud/manifests/submarine-cluster/rbac.yaml
deleted file mode 100644
index 9c12225..0000000
--- a/submarine-cloud/manifests/submarine-cluster/rbac.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: v1
-kind: List
-items:
-  - apiVersion: rbac.authorization.k8s.io/v1beta1
-    kind: ClusterRole
-    metadata:
-      name: submarine-node
-    rules:
-      - apiGroups: [""]
-        resources:
-          - namespaces
-          - services
-          - endpoints
-          - pods
-          - persistentvolumes
-          - persistentvolumeclaims
-        verbs: ["*"]
-      - apiGroups: ["apps"]
-        resources:
-          - deployments
-          - deployments/status
-        verbs: ["*"]
-      - apiGroups: ["kubeflow.org"]
-        resources:
-          - tfjobs
-          - pytorchjobs
-          - notebooks
-        verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
-      - apiGroups: ["traefik.containo.us"]
-        resources:
-          - ingressroutes
-        verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
-  - apiVersion: rbac.authorization.k8s.io/v1beta1
-    kind: ClusterRoleBinding
-    metadata:
-      name: submarine-node
-    roleRef:
-      apiGroup: rbac.authorization.k8s.io
-      kind: ClusterRole
-      name: submarine-node
-    subjects:
-      - kind: ServiceAccount
-        name: submarine-node
-        namespace: default
diff --git a/submarine-cloud/manifests/submarine-cluster/serviceaccounts.yaml b/submarine-cloud/manifests/submarine-cluster/serviceaccounts.yaml
deleted file mode 100644
index 45212bb..0000000
--- a/submarine-cloud/manifests/submarine-cluster/serviceaccounts.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: v1
-kind: List
-items:
-  # The SA for the submarine operator
-  - apiVersion: v1
-    kind: ServiceAccount
-    metadata:
-      name: "submarine-node"
-      namespace: default
diff --git a/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml b/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml
deleted file mode 100644
index 037f625..0000000
--- a/submarine-cloud/manifests/submarine-cluster/submarine-database.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  name: submarine-database
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: submarine-database
-  template:
-    metadata:
-      labels:
-        app: submarine-database
-    spec:
-      containers:
-        - name: submarine-database
-          image: apache/submarine:database-0.7.0-SNAPSHOT
-          ports:
-            - containerPort: 3306
-          env:
-            - name: MYSQL_ROOT_PASSWORD
-              value: "password" # Same submarine-site.xml mysql password
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: submarine-database
-spec:
-  ports:
-    - name: submarine-database
-      port: 3306
-      targetPort: 3306
-  selector:
-    app: submarine-database
diff --git a/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml b/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml
deleted file mode 100644
index f00726d..0000000
--- a/submarine-cloud/manifests/submarine-cluster/submarine-server.yaml
+++ /dev/null
@@ -1,114 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: submarine.apache.org/v1alpha1
-kind: SubmarineCluster
-metadata:
-  name: submarine-test
-spec:
-  additionalLabels:
-    foo: bar
-  numberOfMaster: 1
-  replicationFactor: 0
-  podTemplate:
-    metadata:
-      labels:
-        app: cluster-test
-    spec:
-      serviceAccountName: "submarine-node"
-      containers:
-        - name: submarine-node
-          image: "apache/submarine:server-0.7.0-SNAPSHOT"
-          args: []
-          imagePullPolicy: IfNotPresent
-          ports:
-            - containerPort: 8080
-              name: submarine
-            - containerPort: 8081
-              name: cluster
-          env:
-            - name: POD_NAMESPACE
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.namespace
-            - name: POD_IP
-              valueFrom:
-                fieldRef:
-                  fieldPath: status.podIP
-          livenessProbe:
-            httpGet:
-              path: /api/v1/cluster/address
-              port: 8080
-            initialDelaySeconds: 10
-            timeoutSeconds: 5
-            periodSeconds: 10
-            successThreshold: 1
-            failureThreshold: 3
-          readinessProbe:
-            httpGet:
-              path: /api/v1/cluster/address
-              port: 8080
-            timeoutSeconds: 5
-            periodSeconds: 10
-            successThreshold: 1
-            failureThreshold: 3
-          volumeMounts:
-            - name: submarine-configmap
-              mountPath: /opt/submarine-current/conf/submarine-site.xml
-              subPath: submarine-site.xml
-            - name: submarine-configmap
-              mountPath: /opt/submarine-current/conf/log4j.properties
-              subPath: log4j.properties
-      volumes:
-        - name: submarine-configmap
-          configMap:
-            name: submarine-config
-            items:
-              - key: submarine-site.xml
-                path: submarine-site.xml
-              - key: log4j.properties
-                path: log4j.properties
-
----
-kind: Service
-apiVersion: v1
-metadata:
-  name: submarine-svc
-spec:
-  selector:
-    app: cluster-test
-  ports:
-    - port: 8080
-
----
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
-  name: submarine-ingress
-  annotations:
-    ingress.kubernetes.io/rewrite-target: /
-spec:
-  rules:
-    - http:
-        paths:
-          - path: /
-            backend:
-              serviceName: submarine-svc
-              servicePort: 8080
-
----
-# You can also access the submarine workbench via port-forward
-# kubectl port-forward svc/submarine-svc 18080:8080 --address 0.0.0.0
diff --git a/submarine-cloud/manifests/submarine-cluster/submarine-tensorboard.yaml b/submarine-cloud/manifests/submarine-cluster/submarine-tensorboard.yaml
deleted file mode 100644
index c1aa336..0000000
--- a/submarine-cloud/manifests/submarine-cluster/submarine-tensorboard.yaml
+++ /dev/null
@@ -1,99 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: v1
-kind: PersistentVolume
-metadata:
-  name: tensorboard-pv
-spec:
-  accessModes:
-    - ReadWriteMany
-  capacity:
-    storage: 10Gi
-  storageClassName: standard
-  hostPath:
-    path: /tmp/tfboard/
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  name: tensorboard-pvc
-spec:
-  accessModes:
-    - ReadWriteMany
-  storageClassName: standard
-  resources:
-    requests:
-      storage: 10Gi
-  volumeName: tensorboard-pv # bind to specific pv
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: tensorboard
-spec:
-  selector:
-    matchLabels:
-      app: tensorboard-pod
-  template:
-    metadata:
-      labels:
-        app: tensorboard-pod
-    spec:
-      containers:
-        - name: tensorboard-container
-          image: tensorflow/tensorflow:1.11.0
-          command:
-            - "tensorboard"
-            - "--logdir=/logs"
-            - "--path_prefix=/tensorboard"
-          imagePullPolicy: IfNotPresent
-          ports:
-            - containerPort: 6006
-          volumeMounts:
-            - mountPath: "/logs"
-              name: "volume"
-      volumes:
-        - name: "volume"
-          persistentVolumeClaim:
-            claimName: "tensorboard-pvc"
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: tensorboard-service
-spec:
-  selector:
-    app: tensorboard-pod
-  ports:
-    - protocol: TCP
-      port: 8080
-      targetPort: 6006
----
-apiVersion: traefik.containo.us/v1alpha1
-kind: IngressRoute
-metadata:
-  name: tensorboard-ingressroute
-spec:
-  entryPoints:
-    - web
-  routes:
-    - kind: Rule
-      match: PathPrefix(`/tensorboard`)
-      services:
-        - kind: Service
-          name: tensorboard-service
-          port: 8080
diff --git a/submarine-cloud/manifests/submarine-operator/deployment.yaml b/submarine-cloud/manifests/submarine-operator/deployment.yaml
deleted file mode 100644
index 3152bf2..0000000
--- a/submarine-cloud/manifests/submarine-operator/deployment.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: submarine-operator
-  namespace: default
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: "submarine-operator"
-  strategy:
-    type: Recreate
-  template:
-    metadata:
-      labels:
-        app: "submarine-operator"
-    spec:
-      serviceAccountName: "submarine-operator"
-      containers:
-        - name: op
-          image: "apache/submarine:operator-0.7.0-SNAPSHOT"
-          imagePullPolicy: IfNotPresent
-          args: ["--v=7", "--logtostderr=true", "--alsologtostderr"]
-          resources:
-            limits:
-              cpu: 100m
-              memory: 128Mi
-            requests:
-              cpu: 100m
-              memory: 128Mi
diff --git a/submarine-cloud/manifests/submarine-operator/rbac.yaml b/submarine-cloud/manifests/submarine-operator/rbac.yaml
deleted file mode 100644
index 88eec70..0000000
--- a/submarine-cloud/manifests/submarine-operator/rbac.yaml
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: v1
-kind: List
-items:
-  - apiVersion: rbac.authorization.k8s.io/v1beta1
-    kind: ClusterRole
-    metadata:
-      name: submarine-operator
-    rules:
-      - apiGroups: ["apiextensions.k8s.io"]
-        resources:
-          - customresourcedefinitions
-        verbs: ["*"]
-      - apiGroups:
-          - "submarine.apache.org"
-        resources:
-          - submarineclusters
-        verbs: ["*"]
-      - apiGroups: [""]
-        resources:
-          - pods
-          - services
-        verbs: ["*"]
-      - apiGroups: [""]
-        resources:
-          - namespaces
-        verbs: ["list"]
-      - apiGroups: ["policy"]
-        resources:
-          - poddisruptionbudgets
-        verbs: ["*"]
-  - apiVersion: rbac.authorization.k8s.io/v1beta1
-    kind: ClusterRoleBinding
-    metadata:
-      name: submarine-operator
-    roleRef:
-      apiGroup: rbac.authorization.k8s.io
-      kind: ClusterRole
-      name: submarine-operator
-    subjects:
-      - kind: ServiceAccount
-        name: "submarine-operator"
-        namespace: default
diff --git a/submarine-cloud/manifests/submarine-operator/serviceaccounts.yaml b/submarine-cloud/manifests/submarine-operator/serviceaccounts.yaml
deleted file mode 100644
index 3011f7f..0000000
--- a/submarine-cloud/manifests/submarine-operator/serviceaccounts.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-#
-apiVersion: v1
-kind: List
-items:
-  # The SA for the submarine operator
-  - apiVersion: v1
-    kind: ServiceAccount
-    metadata:
-      name: "submarine-operator"
-      namespace: default
diff --git a/submarine-cloud/pkg/apis/submarine/register.go b/submarine-cloud/pkg/apis/submarine/register.go
deleted file mode 100644
index ca705c7..0000000
--- a/submarine-cloud/pkg/apis/submarine/register.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-const (
-	GroupName = "submarine.apache.org"
-	Version   = "v1alpha1"
-)
diff --git a/submarine-cloud/pkg/apis/submarine/v1alpha1/const.go b/submarine-cloud/pkg/apis/submarine/v1alpha1/const.go
deleted file mode 100644
index afa1dba..0000000
--- a/submarine-cloud/pkg/apis/submarine/v1alpha1/const.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
-
-const (
-	// ClusterNameLabelKey Label key for the ClusterName
-	ClusterNameLabelKey string = "submarine-operator.k8s.io/cluster-name"
-	// PodSpecMD5LabelKey label key for the PodSpec MD5 hash
-	PodSpecMD5LabelKey string = "submarine-operator.k8s.io/podspec-md5"
-)
diff --git a/submarine-cloud/pkg/apis/submarine/v1alpha1/default.go b/submarine-cloud/pkg/apis/submarine/v1alpha1/default.go
deleted file mode 100644
index 4809b80..0000000
--- a/submarine-cloud/pkg/apis/submarine/v1alpha1/default.go
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 (
-	"github.com/golang/glog"
-	kapiv1 "k8s.io/api/core/v1"
-)
-
-// IsDefaultedSubmarineCluster check if the SubmarineCluster is already defaulted
-func IsDefaultedSubmarineCluster(rc *SubmarineCluster) bool {
-	if rc.Spec.NumberOfMaster == nil {
-		return false
-	}
-	if rc.Spec.ReplicationFactor == nil {
-		return false
-	}
-	return true
-}
-
-// DefaultSubmarineCluster defaults SubmarineCluster
-func DefaultSubmarineCluster(undefaultSubmarineCluster *SubmarineCluster) *SubmarineCluster {
-	glog.Infof("DefaultSubmarineCluster()")
-	rc := undefaultSubmarineCluster.DeepCopy()
-	if rc.Spec.NumberOfMaster == nil {
-		rc.Spec.NumberOfMaster = NewInt32(3)
-	}
-	if rc.Spec.ReplicationFactor == nil {
-		rc.Spec.ReplicationFactor = NewInt32(1)
-	}
-
-	if rc.Spec.PodTemplate == nil {
-		rc.Spec.PodTemplate = &kapiv1.PodTemplateSpec{}
-	}
-
-	rc.Status.Cluster.NumberOfMaster = 0
-	rc.Status.Cluster.MinReplicationFactor = 0
-	rc.Status.Cluster.MaxReplicationFactor = 0
-	rc.Status.Cluster.NbPods = 0
-	rc.Status.Cluster.NbPodsReady = 0
-	rc.Status.Cluster.NbSubmarineRunning = 0
-
-	return rc
-}
-
-// NewInt32 use to instantiate a int32 pointer
-func NewInt32(val int32) *int32 {
-	output := new(int32)
-	*output = val
-
-	return output
-}
diff --git a/submarine-cloud/pkg/apis/submarine/v1alpha1/doc.go b/submarine-cloud/pkg/apis/submarine/v1alpha1/doc.go
deleted file mode 100644
index d848b4c..0000000
--- a/submarine-cloud/pkg/apis/submarine/v1alpha1/doc.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-// +k8s:deepcopy-gen=package
-
-// +groupName=submarine.apache.org
-package v1alpha1
diff --git a/submarine-cloud/pkg/apis/submarine/v1alpha1/register.go b/submarine-cloud/pkg/apis/submarine/v1alpha1/register.go
deleted file mode 100644
index 4d53bf7..0000000
--- a/submarine-cloud/pkg/apis/submarine/v1alpha1/register.go
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-// The purpose of this file is to make the client know the
-// Submarine type API object through the addKnownTypes method:
-package v1alpha1
-
-import (
-	"github.com/apache/submarine/submarine-cloud/pkg/apis/submarine"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-)
-
-var SchemeGroupVersion = schema.GroupVersion{
-	Group:   submarine.GroupName,
-	Version: submarine.Version,
-}
-
-var (
-	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
-	AddToScheme   = SchemeBuilder.AddToScheme
-)
-
-func Resource(resource string) schema.GroupResource {
-	return SchemeGroupVersion.WithResource(resource).GroupResource()
-}
-
-func Kind(kind string) schema.GroupKind {
-	return SchemeGroupVersion.WithKind(kind).GroupKind()
-}
-
-func addKnownTypes(scheme *runtime.Scheme) error {
-	scheme.AddKnownTypes(
-		SchemeGroupVersion,
-		&SubmarineCluster{},
-		&SubmarineClusterList{},
-	)
-
-	// register the type in the scheme
-	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
-	return nil
-}
-
-const (
-	// ResourcePlural is the id to identify plurals
-	ResourcePlural = "submarineclusters"
-	// ResourceSingular represents the id for identify singular resource
-	ResourceSingular = "submarinecluster"
-	// ResourceKind represent the resource kind
-	ResourceKind = "SubmarineCluster"
-	// ResourceVersion represent the resource version
-	ResourceVersion = "v1alpha1"
-)
diff --git a/submarine-cloud/pkg/apis/submarine/v1alpha1/types.go b/submarine-cloud/pkg/apis/submarine/v1alpha1/types.go
deleted file mode 100644
index 8813e74..0000000
--- a/submarine-cloud/pkg/apis/submarine/v1alpha1/types.go
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 (
-	"fmt"
-	kapiv1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// +genclient
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// SubmarineCluster represents a Submarine Cluster
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type SubmarineCluster struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	// Spec represents the desired SubmarineCluster specification
-	Spec SubmarineClusterSpec `json:"spec,omitempty"`
-
-	// Status represents the current SubmarineCluster status
-	Status SubmarineClusterStatus `json:"status,omitempty"`
-}
-
-// SubmarineClusterList is a list of Submarine resources
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type SubmarineClusterList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata"`
-
-	Items []SubmarineCluster `json:"items"`
-}
-
-// SubmarineClusterSpec contains SubmarineCluster specification
-type SubmarineClusterSpec struct {
-	NumberOfMaster    *int32 `json:"numberOfMaster,omitempty"`
-	ReplicationFactor *int32 `json:"replicationFactor,omitempty"`
-
-	// ServiceName name used to create the Kubernetes Service that reference the Submarine Cluster nodes.
-	// if ServiceName is empty, the SubmarineCluster.Name will be use for creating the service.
-	ServiceName string `json:"serviceName,omitempty"`
-
-	// PodTemplate contains the pod specification that should run the Submarine-server process
-	PodTemplate *kapiv1.PodTemplateSpec `json:"podTemplate,omitempty"`
-
-	// Labels for created Submarine-cluster (deployment, rs, pod) (if any)
-	AdditionalLabels map[string]string `json:"AdditionalLabels,omitempty"`
-
-	Name    string `json:"name"`
-	School  string `json:"school"`
-	Email   string `json:"email"`
-	Address string `json:"address"`
-}
-
-// SubmarineClusterNode represent a SubmarineCluster Node
-type SubmarineClusterNode struct {
-	ID        string                   `json:"id"`
-	Role      SubmarineClusterNodeRole `json:"role"`
-	IP        string                   `json:"ip"`
-	Port      string                   `json:"port"`
-	Slots     []string                 `json:"slots,omitempty"`
-	MasterRef string                   `json:"masterRef,omitempty"`
-	PodName   string                   `json:"podName"`
-	Pod       *kapiv1.Pod              `json:"-"`
-}
-
-func (n SubmarineClusterNode) String() string {
-	if n.Role != SubmarineClusterNodeRoleSlave {
-		return fmt.Sprintf("(Master:%s, Addr:%s:%s, PodName:%s, Slots:%v)", n.ID, n.IP, n.Port, n.PodName, n.Slots)
-	}
-	return fmt.Sprintf("(Slave:%s, Addr:%s:%s, PodName:%s, MasterRef:%s)", n.ID, n.IP, n.Port, n.PodName, n.MasterRef)
-}
-
-// SubmarineClusterConditionType is the type of SubmarineClusterCondition
-type SubmarineClusterConditionType string
-
-const (
-	// SubmarineClusterOK means the SubmarineCluster is in a good shape
-	SubmarineClusterOK SubmarineClusterConditionType = "ClusterOK"
-
-	// SubmarineClusterScaling means the SubmarineCluster is currently in a scaling stage
-	SubmarineClusterScaling SubmarineClusterConditionType = "Scaling"
-
-	// SubmarineClusterRebalancing means the SubmarineCluster is currenlty rebalancing slots and keys
-	SubmarineClusterRebalancing SubmarineClusterConditionType = "Rebalancing"
-
-	// SubmarineClusterRollingUpdate means the SubmarineCluster is currenlty performing a rolling update of its nodes
-	SubmarineClusterRollingUpdate SubmarineClusterConditionType = "RollingUpdate"
-)
-
-// SubmarineClusterNodeRole SubmarineCluster Node Role type
-type SubmarineClusterNodeRole string
-
-const (
-	// SubmarineClusterNodeRoleMaster SubmarineCluster Master node role
-	SubmarineClusterNodeRoleMaster SubmarineClusterNodeRole = "Master"
-
-	// SubmarineClusterNodeRoleSlave SubmarineCluster Master node role
-	SubmarineClusterNodeRoleSlave SubmarineClusterNodeRole = "Slave"
-
-	// SubmarineClusterNodeRoleNone None node role
-	SubmarineClusterNodeRoleNone SubmarineClusterNodeRole = "None"
-)
-
-// ClusterStatus Submarine Cluster status
-type ClusterStatus string
-
-const (
-	// ClusterStatusOK ClusterStatus OK
-	ClusterStatusOK ClusterStatus = "OK"
-
-	// ClusterStatusError ClusterStatus Error
-	ClusterStatusError ClusterStatus = "Error"
-
-	// ClusterStatusScaling ClusterStatus Scaling
-	ClusterStatusScaling ClusterStatus = "Scaling"
-
-	// ClusterStatusCalculatingRebalancing ClusterStatus Rebalancing
-	ClusterStatusCalculatingRebalancing ClusterStatus = "Calculating Rebalancing"
-
-	// ClusterStatusRebalancing ClusterStatus Rebalancing
-	ClusterStatusRebalancing ClusterStatus = "Rebalancing"
-
-	// ClusterStatusRollingUpdate ClusterStatus RollingUpdate
-	ClusterStatusRollingUpdate ClusterStatus = "RollingUpdate"
-)
-
-// SubmarineClusterStatus contains SubmarineCluster status
-type SubmarineClusterStatus struct {
-	// Conditions represent the latest available observations of an object's current state.
-	Conditions []SubmarineClusterCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
-	// Status of the condition, one of True, False, Unknown.
-	Status kapiv1.ConditionStatus `json:"status"`
-	// StartTime represents time when the workflow was acknowledged by the Workflow controller
-	// It is not guaranteed to be set in happens-before order across separate operations.
-	// It is represented in RFC3339 form and is in UTC.
-	// StartTime doesn't consider start time of `ExternalReference`
-	StartTime *metav1.Time `json:"startTime,omitempty"`
-	// (brief) reason for the condition's last transition.
-	Reason string `json:"reason,omitempty"`
-	// Human readable message indicating details about last transition.
-	Message string `json:"message,omitempty"`
-	// Cluster a view of the current SubmarineCluster
-	Cluster SubmarineClusterClusterStatus
-}
-
-// SubmarineClusterCondition represent the condition of the SubmarineCluster
-type SubmarineClusterCondition struct {
-	// Type of workflow condition
-	Type SubmarineClusterConditionType `json:"type"`
-	// Status of the condition, one of True, False, Unknown.
-	Status kapiv1.ConditionStatus `json:"status"`
-	// Last time the condition was checked.
-	LastProbeTime metav1.Time `json:"lastProbeTime,omitempty"`
-	// Last time the condition transited from one status to another.
-	LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"`
-	// (brief) reason for the condition's last transition.
-	Reason string `json:"reason,omitempty"`
-	// Human readable message indicating details about last transition.
-	Message string `json:"message,omitempty"`
-}
-
-// SubmarineClusterClusterStatus represent the Submarine Cluster status
-type SubmarineClusterClusterStatus struct {
-	Status               ClusterStatus `json:"status"`
-	NumberOfMaster       int32         `json:"numberOfMaster,omitempty"`
-	MinReplicationFactor int32         `json:"minReplicationFactor,omitempty"`
-	MaxReplicationFactor int32         `json:"maxReplicationFactor,omitempty"`
-
-	NodesPlacement NodesPlacementInfo `json:"nodesPlacementInfo,omitempty"`
-
-	// In theory, we always have NbPods > NbSubmarineRunning > NbPodsReady
-	NbPods             int32 `json:"nbPods,omitempty"`
-	NbPodsReady        int32 `json:"nbPodsReady,omitempty"`
-	NbSubmarineRunning int32 `json:"nbSubmarineNodesRunning,omitempty"`
-
-	Nodes []SubmarineClusterNode `json:"nodes"`
-}
-
-func (s SubmarineClusterClusterStatus) String() string {
-	output := ""
-	output += fmt.Sprintf("status:%s\n", s.Status)
-	output += fmt.Sprintf("NumberOfMaster:%d\n", s.NumberOfMaster)
-	output += fmt.Sprintf("MinReplicationFactor:%d\n", s.MinReplicationFactor)
-	output += fmt.Sprintf("MaxReplicationFactor:%d\n", s.MaxReplicationFactor)
-	output += fmt.Sprintf("NodesPlacement:%s\n\n", s.NodesPlacement)
-	output += fmt.Sprintf("NbPods:%d\n", s.NbPods)
-	output += fmt.Sprintf("NbPodsReady:%d\n", s.NbPodsReady)
-	output += fmt.Sprintf("NbSubmarineRunning:%d\n\n", s.NbSubmarineRunning)
-
-	output += fmt.Sprintf("Nodes (%d): %s\n", len(s.Nodes), s.Nodes)
-
-	return output
-}
-
-// NodesPlacementInfo Submarine Nodes placement mode information
-type NodesPlacementInfo string
-
-const (
-	// NodesPlacementInfoBestEffort the cluster nodes placement is in best effort,
-	// it means you can have 2 masters (or more) on the same VM.
-	NodesPlacementInfoBestEffort NodesPlacementInfo = "BestEffort"
-	// NodesPlacementInfoOptimal the cluster nodes placement is optimal,
-	// it means on master by VM
-	NodesPlacementInfoOptimal NodesPlacementInfo = "Optimal"
-)
diff --git a/submarine-cloud/pkg/apis/submarine/v1alpha1/zz_generated.deepcopy.go b/submarine-cloud/pkg/apis/submarine/v1alpha1/zz_generated.deepcopy.go
deleted file mode 100644
index 7a9fde4..0000000
--- a/submarine-cloud/pkg/apis/submarine/v1alpha1/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,221 +0,0 @@
-// +build !ignore_autogenerated
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 deepcopy-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	v1 "k8s.io/api/core/v1"
-	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 *SubmarineCluster) DeepCopyInto(out *SubmarineCluster) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
-	in.Status.DeepCopyInto(&out.Status)
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineCluster.
-func (in *SubmarineCluster) DeepCopy() *SubmarineCluster {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineCluster)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *SubmarineCluster) 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 *SubmarineClusterClusterStatus) DeepCopyInto(out *SubmarineClusterClusterStatus) {
-	*out = *in
-	if in.Nodes != nil {
-		in, out := &in.Nodes, &out.Nodes
-		*out = make([]SubmarineClusterNode, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineClusterClusterStatus.
-func (in *SubmarineClusterClusterStatus) DeepCopy() *SubmarineClusterClusterStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineClusterClusterStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SubmarineClusterCondition) DeepCopyInto(out *SubmarineClusterCondition) {
-	*out = *in
-	in.LastProbeTime.DeepCopyInto(&out.LastProbeTime)
-	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineClusterCondition.
-func (in *SubmarineClusterCondition) DeepCopy() *SubmarineClusterCondition {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineClusterCondition)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SubmarineClusterList) DeepCopyInto(out *SubmarineClusterList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ListMeta.DeepCopyInto(&out.ListMeta)
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]SubmarineCluster, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineClusterList.
-func (in *SubmarineClusterList) DeepCopy() *SubmarineClusterList {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineClusterList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *SubmarineClusterList) 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 *SubmarineClusterNode) DeepCopyInto(out *SubmarineClusterNode) {
-	*out = *in
-	if in.Slots != nil {
-		in, out := &in.Slots, &out.Slots
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.Pod != nil {
-		in, out := &in.Pod, &out.Pod
-		*out = new(v1.Pod)
-		(*in).DeepCopyInto(*out)
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineClusterNode.
-func (in *SubmarineClusterNode) DeepCopy() *SubmarineClusterNode {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineClusterNode)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SubmarineClusterSpec) DeepCopyInto(out *SubmarineClusterSpec) {
-	*out = *in
-	if in.NumberOfMaster != nil {
-		in, out := &in.NumberOfMaster, &out.NumberOfMaster
-		*out = new(int32)
-		**out = **in
-	}
-	if in.ReplicationFactor != nil {
-		in, out := &in.ReplicationFactor, &out.ReplicationFactor
-		*out = new(int32)
-		**out = **in
-	}
-	if in.PodTemplate != nil {
-		in, out := &in.PodTemplate, &out.PodTemplate
-		*out = new(v1.PodTemplateSpec)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.AdditionalLabels != nil {
-		in, out := &in.AdditionalLabels, &out.AdditionalLabels
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineClusterSpec.
-func (in *SubmarineClusterSpec) DeepCopy() *SubmarineClusterSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineClusterSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SubmarineClusterStatus) DeepCopyInto(out *SubmarineClusterStatus) {
-	*out = *in
-	if in.Conditions != nil {
-		in, out := &in.Conditions, &out.Conditions
-		*out = make([]SubmarineClusterCondition, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.StartTime != nil {
-		in, out := &in.StartTime, &out.StartTime
-		*out = (*in).DeepCopy()
-	}
-	in.Cluster.DeepCopyInto(&out.Cluster)
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubmarineClusterStatus.
-func (in *SubmarineClusterStatus) DeepCopy() *SubmarineClusterStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(SubmarineClusterStatus)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/submarine-cloud/pkg/client/client.go b/submarine-cloud/pkg/client/client.go
deleted file mode 100644
index 3e04db2..0000000
--- a/submarine-cloud/pkg/client/client.go
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client
-
-import (
-	"reflect"
-	"time"
-
-	apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
-	apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/serializer"
-	"k8s.io/apimachinery/pkg/util/errors"
-	"k8s.io/apimachinery/pkg/util/wait"
-	"k8s.io/client-go/rest"
-
-	"github.com/golang/glog"
-
-	"github.com/apache/submarine/submarine-cloud/pkg/apis/submarine"
-	v1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned"
-)
-
-// DefineSubmarineClusterResource defines a SubmarineClusterResource as a k8s CR
-func DefineSubmarineClusterResource(clientset apiextensionsclient.Interface) (*apiextensionsv1beta1.CustomResourceDefinition, error) {
-	glog.Info("DefineSubmarineClusterResource()")
-	submarineClusterResourceName := v1.ResourcePlural + "." + submarine.GroupName
-	crd := &apiextensionsv1beta1.CustomResourceDefinition{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: submarineClusterResourceName,
-		},
-		Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
-			Group:   submarine.GroupName,
-			Version: v1.SchemeGroupVersion.Version,
-			Scope:   apiextensionsv1beta1.NamespaceScoped,
-			Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
-				Plural:     v1.ResourcePlural,
-				Singular:   v1.ResourceSingular,
-				Kind:       reflect.TypeOf(v1.SubmarineCluster{}).Name(),
-				ShortNames: []string{"submarine"},
-			},
-		},
-	}
-	_, err := clientset.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd)
-	if err != nil {
-		return nil, err
-	}
-
-	// wait for CRD being established
-	err = wait.Poll(500*time.Millisecond, 60*time.Second, func() (bool, error) {
-		crd, err = clientset.ApiextensionsV1beta1().CustomResourceDefinitions().Get(submarineClusterResourceName, metav1.GetOptions{})
-		if err != nil {
-			return false, err
-		}
-		for _, cond := range crd.Status.Conditions {
-			switch cond.Type {
-			case apiextensionsv1beta1.Established:
-				if cond.Status == apiextensionsv1beta1.ConditionTrue {
-					return true, err
-				}
-			case apiextensionsv1beta1.NamesAccepted:
-				if cond.Status == apiextensionsv1beta1.ConditionFalse {
-					glog.Errorf("Name conflict: %v\n", cond.Reason)
-				}
-			}
-		}
-		return false, err
-	})
-	if err != nil {
-		deleteErr := clientset.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(submarineClusterResourceName, nil)
-		if deleteErr != nil {
-			return nil, errors.NewAggregate([]error{err, deleteErr})
-		}
-		return nil, err
-	}
-
-	return crd, nil
-}
-
-// NewClient builds and initializes a Client and a Scheme for SubmarineCluster CR
-func NewClient(cfg *rest.Config) (versioned.Interface, error) {
-	glog.Info("NewClient()")
-	scheme := runtime.NewScheme()
-	if err := v1.AddToScheme(scheme); err != nil {
-		return nil, err
-	}
-
-	config := *cfg
-	config.GroupVersion = &v1.SchemeGroupVersion
-	config.APIPath = "/apis"
-	config.ContentType = runtime.ContentTypeJSON
-	config.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: serializer.NewCodecFactory(scheme)}
-
-	cs, err := versioned.NewForConfig(&config)
-	if err != nil {
-		return nil, err
-	}
-	return cs, nil
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/clientset.go b/submarine-cloud/pkg/client/clientset/versioned/clientset.go
deleted file mode 100644
index 53d825e..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/clientset.go
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package versioned
-
-import (
-	"fmt"
-
-	submarinev1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1"
-	discovery "k8s.io/client-go/discovery"
-	rest "k8s.io/client-go/rest"
-	flowcontrol "k8s.io/client-go/util/flowcontrol"
-)
-
-type Interface interface {
-	Discovery() discovery.DiscoveryInterface
-	SubmarineV1alpha1() submarinev1alpha1.SubmarineV1alpha1Interface
-}
-
-// Clientset contains the clients for groups. Each group has exactly one
-// version included in a Clientset.
-type Clientset struct {
-	*discovery.DiscoveryClient
-	submarineV1alpha1 *submarinev1alpha1.SubmarineV1alpha1Client
-}
-
-// SubmarineV1alpha1 retrieves the SubmarineV1alpha1Client
-func (c *Clientset) SubmarineV1alpha1() submarinev1alpha1.SubmarineV1alpha1Interface {
-	return c.submarineV1alpha1
-}
-
-// Discovery retrieves the DiscoveryClient
-func (c *Clientset) Discovery() discovery.DiscoveryInterface {
-	if c == nil {
-		return nil
-	}
-	return c.DiscoveryClient
-}
-
-// NewForConfig creates a new Clientset for the given config.
-// If config's RateLimiter is not set and QPS and Burst are acceptable,
-// NewForConfig will generate a rate-limiter in configShallowCopy.
-func NewForConfig(c *rest.Config) (*Clientset, error) {
-	configShallowCopy := *c
-	if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
-		if configShallowCopy.Burst <= 0 {
-			return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
-		}
-		configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
-	}
-	var cs Clientset
-	var err error
-	cs.submarineV1alpha1, err = submarinev1alpha1.NewForConfig(&configShallowCopy)
-	if err != nil {
-		return nil, err
-	}
-
-	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
-	if err != nil {
-		return nil, err
-	}
-	return &cs, nil
-}
-
-// NewForConfigOrDie creates a new Clientset for the given config and
-// panics if there is an error in the config.
-func NewForConfigOrDie(c *rest.Config) *Clientset {
-	var cs Clientset
-	cs.submarineV1alpha1 = submarinev1alpha1.NewForConfigOrDie(c)
-
-	cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
-	return &cs
-}
-
-// New creates a new Clientset for the given RESTClient.
-func New(c rest.Interface) *Clientset {
-	var cs Clientset
-	cs.submarineV1alpha1 = submarinev1alpha1.New(c)
-
-	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
-	return &cs
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/doc.go b/submarine-cloud/pkg/client/clientset/versioned/doc.go
deleted file mode 100644
index 6eaf748..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-// This package has the automatically generated clientset.
-package versioned
diff --git a/submarine-cloud/pkg/client/clientset/versioned/fake/clientset_generated.go b/submarine-cloud/pkg/client/clientset/versioned/fake/clientset_generated.go
deleted file mode 100644
index 0c7049d..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/fake/clientset_generated.go
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	clientset "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned"
-	submarinev1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1"
-	fakesubmarinev1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/watch"
-	"k8s.io/client-go/discovery"
-	fakediscovery "k8s.io/client-go/discovery/fake"
-	"k8s.io/client-go/testing"
-)
-
-// NewSimpleClientset returns a clientset that will respond with the provided objects.
-// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
-// without applying any validations and/or defaults. It shouldn't be considered a replacement
-// for a real clientset and is mostly useful in simple unit tests.
-func NewSimpleClientset(objects ...runtime.Object) *Clientset {
-	o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
-	for _, obj := range objects {
-		if err := o.Add(obj); err != nil {
-			panic(err)
-		}
-	}
-
-	cs := &Clientset{tracker: o}
-	cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake}
-	cs.AddReactor("*", "*", testing.ObjectReaction(o))
-	cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) {
-		gvr := action.GetResource()
-		ns := action.GetNamespace()
-		watch, err := o.Watch(gvr, ns)
-		if err != nil {
-			return false, nil, err
-		}
-		return true, watch, nil
-	})
-
-	return cs
-}
-
-// Clientset implements clientset.Interface. Meant to be embedded into a
-// struct to get a default implementation. This makes faking out just the method
-// you want to test easier.
-type Clientset struct {
-	testing.Fake
-	discovery *fakediscovery.FakeDiscovery
-	tracker   testing.ObjectTracker
-}
-
-func (c *Clientset) Discovery() discovery.DiscoveryInterface {
-	return c.discovery
-}
-
-func (c *Clientset) Tracker() testing.ObjectTracker {
-	return c.tracker
-}
-
-var _ clientset.Interface = &Clientset{}
-
-// SubmarineV1alpha1 retrieves the SubmarineV1alpha1Client
-func (c *Clientset) SubmarineV1alpha1() submarinev1alpha1.SubmarineV1alpha1Interface {
-	return &fakesubmarinev1alpha1.FakeSubmarineV1alpha1{Fake: &c.Fake}
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/fake/doc.go b/submarine-cloud/pkg/client/clientset/versioned/fake/doc.go
deleted file mode 100644
index 3f1dda9..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/fake/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-// This package has the automatically generated fake clientset.
-package fake
diff --git a/submarine-cloud/pkg/client/clientset/versioned/fake/register.go b/submarine-cloud/pkg/client/clientset/versioned/fake/register.go
deleted file mode 100644
index 3da61d2..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/fake/register.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	submarinev1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
-	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-)
-
-var scheme = runtime.NewScheme()
-var codecs = serializer.NewCodecFactory(scheme)
-var parameterCodec = runtime.NewParameterCodec(scheme)
-var localSchemeBuilder = runtime.SchemeBuilder{
-	submarinev1alpha1.AddToScheme,
-}
-
-// AddToScheme adds all types of this clientset into the given scheme. This allows composition
-// of clientsets, like in:
-//
-//   import (
-//     "k8s.io/client-go/kubernetes"
-//     clientsetscheme "k8s.io/client-go/kubernetes/scheme"
-//     aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
-//   )
-//
-//   kclientset, _ := kubernetes.NewForConfig(c)
-//   _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
-//
-// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
-// correctly.
-var AddToScheme = localSchemeBuilder.AddToScheme
-
-func init() {
-	v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
-	utilruntime.Must(AddToScheme(scheme))
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/scheme/doc.go b/submarine-cloud/pkg/client/clientset/versioned/scheme/doc.go
deleted file mode 100644
index ecbd537..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/scheme/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-// This package contains the scheme of the automatically generated clientset.
-package scheme
diff --git a/submarine-cloud/pkg/client/clientset/versioned/scheme/register.go b/submarine-cloud/pkg/client/clientset/versioned/scheme/register.go
deleted file mode 100644
index c34aeb6..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/scheme/register.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package scheme
-
-import (
-	submarinev1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
-	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-)
-
-var Scheme = runtime.NewScheme()
-var Codecs = serializer.NewCodecFactory(Scheme)
-var ParameterCodec = runtime.NewParameterCodec(Scheme)
-var localSchemeBuilder = runtime.SchemeBuilder{
-	submarinev1alpha1.AddToScheme,
-}
-
-// AddToScheme adds all types of this clientset into the given scheme. This allows composition
-// of clientsets, like in:
-//
-//   import (
-//     "k8s.io/client-go/kubernetes"
-//     clientsetscheme "k8s.io/client-go/kubernetes/scheme"
-//     aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
-//   )
-//
-//   kclientset, _ := kubernetes.NewForConfig(c)
-//   _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
-//
-// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
-// correctly.
-var AddToScheme = localSchemeBuilder.AddToScheme
-
-func init() {
-	v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
-	utilruntime.Must(AddToScheme(Scheme))
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/doc.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/doc.go
deleted file mode 100644
index 4756ab8..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-// This package has the automatically generated typed clients.
-package v1alpha1
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/doc.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/doc.go
deleted file mode 100644
index b1cba79..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-// Package fake has the automatically generated clients.
-package fake
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/fake_submarine_client.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/fake_submarine_client.go
deleted file mode 100644
index 883949b..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/fake_submarine_client.go
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1"
-	rest "k8s.io/client-go/rest"
-	testing "k8s.io/client-go/testing"
-)
-
-type FakeSubmarineV1alpha1 struct {
-	*testing.Fake
-}
-
-func (c *FakeSubmarineV1alpha1) SubmarineClusters(namespace string) v1alpha1.SubmarineClusterInterface {
-	return &FakeSubmarineClusters{c, namespace}
-}
-
-// RESTClient returns a RESTClient that is used to communicate
-// with API server by this client implementation.
-func (c *FakeSubmarineV1alpha1) RESTClient() rest.Interface {
-	var ret *rest.RESTClient
-	return ret
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/fake_submarinecluster.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/fake_submarinecluster.go
deleted file mode 100644
index b45545c..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/fake/fake_submarinecluster.go
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	labels "k8s.io/apimachinery/pkg/labels"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	testing "k8s.io/client-go/testing"
-)
-
-// FakeSubmarineClusters implements SubmarineClusterInterface
-type FakeSubmarineClusters struct {
-	Fake *FakeSubmarineV1alpha1
-	ns   string
-}
-
-var submarineclustersResource = schema.GroupVersionResource{Group: "submarine.apache.org", Version: "v1alpha1", Resource: "submarineclusters"}
-
-var submarineclustersKind = schema.GroupVersionKind{Group: "submarine.apache.org", Version: "v1alpha1", Kind: "SubmarineCluster"}
-
-// Get takes name of the submarineCluster, and returns the corresponding submarineCluster object, and an error if there is any.
-func (c *FakeSubmarineClusters) Get(name string, options v1.GetOptions) (result *v1alpha1.SubmarineCluster, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewGetAction(submarineclustersResource, c.ns, name), &v1alpha1.SubmarineCluster{})
-
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.SubmarineCluster), err
-}
-
-// List takes label and field selectors, and returns the list of SubmarineClusters that match those selectors.
-func (c *FakeSubmarineClusters) List(opts v1.ListOptions) (result *v1alpha1.SubmarineClusterList, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewListAction(submarineclustersResource, submarineclustersKind, c.ns, opts), &v1alpha1.SubmarineClusterList{})
-
-	if obj == nil {
-		return nil, err
-	}
-
-	label, _, _ := testing.ExtractFromListOptions(opts)
-	if label == nil {
-		label = labels.Everything()
-	}
-	list := &v1alpha1.SubmarineClusterList{ListMeta: obj.(*v1alpha1.SubmarineClusterList).ListMeta}
-	for _, item := range obj.(*v1alpha1.SubmarineClusterList).Items {
-		if label.Matches(labels.Set(item.Labels)) {
-			list.Items = append(list.Items, item)
-		}
-	}
-	return list, err
-}
-
-// Watch returns a watch.Interface that watches the requested submarineClusters.
-func (c *FakeSubmarineClusters) Watch(opts v1.ListOptions) (watch.Interface, error) {
-	return c.Fake.
-		InvokesWatch(testing.NewWatchAction(submarineclustersResource, c.ns, opts))
-
-}
-
-// Create takes the representation of a submarineCluster and creates it.  Returns the server's representation of the submarineCluster, and an error, if there is any.
-func (c *FakeSubmarineClusters) Create(submarineCluster *v1alpha1.SubmarineCluster) (result *v1alpha1.SubmarineCluster, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewCreateAction(submarineclustersResource, c.ns, submarineCluster), &v1alpha1.SubmarineCluster{})
-
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.SubmarineCluster), err
-}
-
-// Update takes the representation of a submarineCluster and updates it. Returns the server's representation of the submarineCluster, and an error, if there is any.
-func (c *FakeSubmarineClusters) Update(submarineCluster *v1alpha1.SubmarineCluster) (result *v1alpha1.SubmarineCluster, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewUpdateAction(submarineclustersResource, c.ns, submarineCluster), &v1alpha1.SubmarineCluster{})
-
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.SubmarineCluster), err
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeSubmarineClusters) UpdateStatus(submarineCluster *v1alpha1.SubmarineCluster) (*v1alpha1.SubmarineCluster, error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewUpdateSubresourceAction(submarineclustersResource, "status", c.ns, submarineCluster), &v1alpha1.SubmarineCluster{})
-
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.SubmarineCluster), err
-}
-
-// Delete takes name of the submarineCluster and deletes it. Returns an error if one occurs.
-func (c *FakeSubmarineClusters) Delete(name string, options *v1.DeleteOptions) error {
-	_, err := c.Fake.
-		Invokes(testing.NewDeleteAction(submarineclustersResource, c.ns, name), &v1alpha1.SubmarineCluster{})
-
-	return err
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *FakeSubmarineClusters) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
-	action := testing.NewDeleteCollectionAction(submarineclustersResource, c.ns, listOptions)
-
-	_, err := c.Fake.Invokes(action, &v1alpha1.SubmarineClusterList{})
-	return err
-}
-
-// Patch applies the patch and returns the patched submarineCluster.
-func (c *FakeSubmarineClusters) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.SubmarineCluster, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewPatchSubresourceAction(submarineclustersResource, c.ns, name, pt, data, subresources...), &v1alpha1.SubmarineCluster{})
-
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.SubmarineCluster), err
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/generated_expansion.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/generated_expansion.go
deleted file mode 100644
index 67abfe0..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/generated_expansion.go
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package v1alpha1
-
-type SubmarineClusterExpansion interface{}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/submarine_client.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/submarine_client.go
deleted file mode 100644
index f45bc70..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/submarine_client.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned/scheme"
-	rest "k8s.io/client-go/rest"
-)
-
-type SubmarineV1alpha1Interface interface {
-	RESTClient() rest.Interface
-	SubmarineClustersGetter
-}
-
-// SubmarineV1alpha1Client is used to interact with features provided by the submarine.apache.org group.
-type SubmarineV1alpha1Client struct {
-	restClient rest.Interface
-}
-
-func (c *SubmarineV1alpha1Client) SubmarineClusters(namespace string) SubmarineClusterInterface {
-	return newSubmarineClusters(c, namespace)
-}
-
-// NewForConfig creates a new SubmarineV1alpha1Client for the given config.
-func NewForConfig(c *rest.Config) (*SubmarineV1alpha1Client, error) {
-	config := *c
-	if err := setConfigDefaults(&config); err != nil {
-		return nil, err
-	}
-	client, err := rest.RESTClientFor(&config)
-	if err != nil {
-		return nil, err
-	}
-	return &SubmarineV1alpha1Client{client}, nil
-}
-
-// NewForConfigOrDie creates a new SubmarineV1alpha1Client for the given config and
-// panics if there is an error in the config.
-func NewForConfigOrDie(c *rest.Config) *SubmarineV1alpha1Client {
-	client, err := NewForConfig(c)
-	if err != nil {
-		panic(err)
-	}
-	return client
-}
-
-// New creates a new SubmarineV1alpha1Client for the given RESTClient.
-func New(c rest.Interface) *SubmarineV1alpha1Client {
-	return &SubmarineV1alpha1Client{c}
-}
-
-func setConfigDefaults(config *rest.Config) error {
-	gv := v1alpha1.SchemeGroupVersion
-	config.GroupVersion = &gv
-	config.APIPath = "/apis"
-	config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
-
-	if config.UserAgent == "" {
-		config.UserAgent = rest.DefaultKubernetesUserAgent()
-	}
-
-	return nil
-}
-
-// RESTClient returns a RESTClient that is used to communicate
-// with API server by this client implementation.
-func (c *SubmarineV1alpha1Client) RESTClient() rest.Interface {
-	if c == nil {
-		return nil
-	}
-	return c.restClient
-}
diff --git a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/submarinecluster.go b/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/submarinecluster.go
deleted file mode 100644
index d72fa81..0000000
--- a/submarine-cloud/pkg/client/clientset/versioned/typed/submarine/v1alpha1/submarinecluster.go
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 client-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"time"
-
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	scheme "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned/scheme"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	rest "k8s.io/client-go/rest"
-)
-
-// SubmarineClustersGetter has a method to return a SubmarineClusterInterface.
-// A group's client should implement this interface.
-type SubmarineClustersGetter interface {
-	SubmarineClusters(namespace string) SubmarineClusterInterface
-}
-
-// SubmarineClusterInterface has methods to work with SubmarineCluster resources.
-type SubmarineClusterInterface interface {
-	Create(*v1alpha1.SubmarineCluster) (*v1alpha1.SubmarineCluster, error)
-	Update(*v1alpha1.SubmarineCluster) (*v1alpha1.SubmarineCluster, error)
-	UpdateStatus(*v1alpha1.SubmarineCluster) (*v1alpha1.SubmarineCluster, error)
-	Delete(name string, options *v1.DeleteOptions) error
-	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
-	Get(name string, options v1.GetOptions) (*v1alpha1.SubmarineCluster, error)
-	List(opts v1.ListOptions) (*v1alpha1.SubmarineClusterList, error)
-	Watch(opts v1.ListOptions) (watch.Interface, error)
-	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.SubmarineCluster, err error)
-	SubmarineClusterExpansion
-}
-
-// submarineClusters implements SubmarineClusterInterface
-type submarineClusters struct {
-	client rest.Interface
-	ns     string
-}
-
-// newSubmarineClusters returns a SubmarineClusters
-func newSubmarineClusters(c *SubmarineV1alpha1Client, namespace string) *submarineClusters {
-	return &submarineClusters{
-		client: c.RESTClient(),
-		ns:     namespace,
-	}
-}
-
-// Get takes name of the submarineCluster, and returns the corresponding submarineCluster object, and an error if there is any.
-func (c *submarineClusters) Get(name string, options v1.GetOptions) (result *v1alpha1.SubmarineCluster, err error) {
-	result = &v1alpha1.SubmarineCluster{}
-	err = c.client.Get().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		Name(name).
-		VersionedParams(&options, scheme.ParameterCodec).
-		Do().
-		Into(result)
-	return
-}
-
-// List takes label and field selectors, and returns the list of SubmarineClusters that match those selectors.
-func (c *submarineClusters) List(opts v1.ListOptions) (result *v1alpha1.SubmarineClusterList, err error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	result = &v1alpha1.SubmarineClusterList{}
-	err = c.client.Get().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Do().
-		Into(result)
-	return
-}
-
-// Watch returns a watch.Interface that watches the requested submarineClusters.
-func (c *submarineClusters) Watch(opts v1.ListOptions) (watch.Interface, error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	opts.Watch = true
-	return c.client.Get().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Watch()
-}
-
-// Create takes the representation of a submarineCluster and creates it.  Returns the server's representation of the submarineCluster, and an error, if there is any.
-func (c *submarineClusters) Create(submarineCluster *v1alpha1.SubmarineCluster) (result *v1alpha1.SubmarineCluster, err error) {
-	result = &v1alpha1.SubmarineCluster{}
-	err = c.client.Post().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		Body(submarineCluster).
-		Do().
-		Into(result)
-	return
-}
-
-// Update takes the representation of a submarineCluster and updates it. Returns the server's representation of the submarineCluster, and an error, if there is any.
-func (c *submarineClusters) Update(submarineCluster *v1alpha1.SubmarineCluster) (result *v1alpha1.SubmarineCluster, err error) {
-	result = &v1alpha1.SubmarineCluster{}
-	err = c.client.Put().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		Name(submarineCluster.Name).
-		Body(submarineCluster).
-		Do().
-		Into(result)
-	return
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-
-func (c *submarineClusters) UpdateStatus(submarineCluster *v1alpha1.SubmarineCluster) (result *v1alpha1.SubmarineCluster, err error) {
-	result = &v1alpha1.SubmarineCluster{}
-	err = c.client.Put().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		Name(submarineCluster.Name).
-		SubResource("status").
-		Body(submarineCluster).
-		Do().
-		Into(result)
-	return
-}
-
-// Delete takes name of the submarineCluster and deletes it. Returns an error if one occurs.
-func (c *submarineClusters) Delete(name string, options *v1.DeleteOptions) error {
-	return c.client.Delete().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		Name(name).
-		Body(options).
-		Do().
-		Error()
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *submarineClusters) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
-	var timeout time.Duration
-	if listOptions.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
-	}
-	return c.client.Delete().
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		VersionedParams(&listOptions, scheme.ParameterCodec).
-		Timeout(timeout).
-		Body(options).
-		Do().
-		Error()
-}
-
-// Patch applies the patch and returns the patched submarineCluster.
-func (c *submarineClusters) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.SubmarineCluster, err error) {
-	result = &v1alpha1.SubmarineCluster{}
-	err = c.client.Patch(pt).
-		Namespace(c.ns).
-		Resource("submarineclusters").
-		SubResource(subresources...).
-		Name(name).
-		Body(data).
-		Do().
-		Into(result)
-	return
-}
diff --git a/submarine-cloud/pkg/client/informers/externalversions/factory.go b/submarine-cloud/pkg/client/informers/externalversions/factory.go
deleted file mode 100644
index 4cdf435..0000000
--- a/submarine-cloud/pkg/client/informers/externalversions/factory.go
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 informer-gen. DO NOT EDIT.
-
-package externalversions
-
-import (
-	reflect "reflect"
-	sync "sync"
-	time "time"
-
-	versioned "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned"
-	internalinterfaces "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces"
-	submarine "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions/submarine"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	cache "k8s.io/client-go/tools/cache"
-)
-
-// SharedInformerOption defines the functional option type for SharedInformerFactory.
-type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory
-
-type sharedInformerFactory struct {
-	client           versioned.Interface
-	namespace        string
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-	lock             sync.Mutex
-	defaultResync    time.Duration
-	customResync     map[reflect.Type]time.Duration
-
-	informers map[reflect.Type]cache.SharedIndexInformer
-	// startedInformers is used for tracking which informers have been started.
-	// This allows Start() to be called multiple times safely.
-	startedInformers map[reflect.Type]bool
-}
-
-// WithCustomResyncConfig sets a custom resync period for the specified informer types.
-func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption {
-	return func(factory *sharedInformerFactory) *sharedInformerFactory {
-		for k, v := range resyncConfig {
-			factory.customResync[reflect.TypeOf(k)] = v
-		}
-		return factory
-	}
-}
-
-// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory.
-func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption {
-	return func(factory *sharedInformerFactory) *sharedInformerFactory {
-		factory.tweakListOptions = tweakListOptions
-		return factory
-	}
-}
-
-// WithNamespace limits the SharedInformerFactory to the specified namespace.
-func WithNamespace(namespace string) SharedInformerOption {
-	return func(factory *sharedInformerFactory) *sharedInformerFactory {
-		factory.namespace = namespace
-		return factory
-	}
-}
-
-// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces.
-func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
-	return NewSharedInformerFactoryWithOptions(client, defaultResync)
-}
-
-// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory.
-// Listers obtained via this SharedInformerFactory will be subject to the same filters
-// as specified here.
-// Deprecated: Please use NewSharedInformerFactoryWithOptions instead
-func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
-	return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions))
-}
-
-// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options.
-func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory {
-	factory := &sharedInformerFactory{
-		client:           client,
-		namespace:        v1.NamespaceAll,
-		defaultResync:    defaultResync,
-		informers:        make(map[reflect.Type]cache.SharedIndexInformer),
-		startedInformers: make(map[reflect.Type]bool),
-		customResync:     make(map[reflect.Type]time.Duration),
-	}
-
-	// Apply all options
-	for _, opt := range options {
-		factory = opt(factory)
-	}
-
-	return factory
-}
-
-// Start initializes all requested informers.
-func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
-	f.lock.Lock()
-	defer f.lock.Unlock()
-
-	for informerType, informer := range f.informers {
-		if !f.startedInformers[informerType] {
-			go informer.Run(stopCh)
-			f.startedInformers[informerType] = true
-		}
-	}
-}
-
-// WaitForCacheSync waits for all started informers' cache were synced.
-func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
-	informers := func() map[reflect.Type]cache.SharedIndexInformer {
-		f.lock.Lock()
-		defer f.lock.Unlock()
-
-		informers := map[reflect.Type]cache.SharedIndexInformer{}
-		for informerType, informer := range f.informers {
-			if f.startedInformers[informerType] {
-				informers[informerType] = informer
-			}
-		}
-		return informers
-	}()
-
-	res := map[reflect.Type]bool{}
-	for informType, informer := range informers {
-		res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
-	}
-	return res
-}
-
-// InternalInformerFor returns the SharedIndexInformer for obj using an internal
-// client.
-func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer {
-	f.lock.Lock()
-	defer f.lock.Unlock()
-
-	informerType := reflect.TypeOf(obj)
-	informer, exists := f.informers[informerType]
-	if exists {
-		return informer
-	}
-
-	resyncPeriod, exists := f.customResync[informerType]
-	if !exists {
-		resyncPeriod = f.defaultResync
-	}
-
-	informer = newFunc(f.client, resyncPeriod)
-	f.informers[informerType] = informer
-
-	return informer
-}
-
-// SharedInformerFactory provides shared informers for resources in all known
-// API group versions.
-type SharedInformerFactory interface {
-	internalinterfaces.SharedInformerFactory
-	ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
-	WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
-
-	Submarine() submarine.Interface
-}
-
-func (f *sharedInformerFactory) Submarine() submarine.Interface {
-	return submarine.New(f, f.namespace, f.tweakListOptions)
-}
diff --git a/submarine-cloud/pkg/client/informers/externalversions/generic.go b/submarine-cloud/pkg/client/informers/externalversions/generic.go
deleted file mode 100644
index bbf7ac7..0000000
--- a/submarine-cloud/pkg/client/informers/externalversions/generic.go
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 informer-gen. DO NOT EDIT.
-
-package externalversions
-
-import (
-	"fmt"
-
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	cache "k8s.io/client-go/tools/cache"
-)
-
-// GenericInformer is type of SharedIndexInformer which will locate and delegate to other
-// sharedInformers based on type
-type GenericInformer interface {
-	Informer() cache.SharedIndexInformer
-	Lister() cache.GenericLister
-}
-
-type genericInformer struct {
-	informer cache.SharedIndexInformer
-	resource schema.GroupResource
-}
-
-// Informer returns the SharedIndexInformer.
-func (f *genericInformer) Informer() cache.SharedIndexInformer {
-	return f.informer
-}
-
-// Lister returns the GenericLister.
-func (f *genericInformer) Lister() cache.GenericLister {
-	return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource)
-}
-
-// ForResource gives generic access to a shared informer of the matching type
-// TODO extend this to unknown resources with a client pool
-func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
-	switch resource {
-	// Group=submarine.apache.org, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithResource("submarineclusters"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Submarine().V1alpha1().SubmarineClusters().Informer()}, nil
-
-	}
-
-	return nil, fmt.Errorf("no informer found for %v", resource)
-}
diff --git a/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
deleted file mode 100644
index b5e5352..0000000
--- a/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 informer-gen. DO NOT EDIT.
-
-package internalinterfaces
-
-import (
-	time "time"
-
-	versioned "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	cache "k8s.io/client-go/tools/cache"
-)
-
-// NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
-type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer
-
-// SharedInformerFactory a small interface to allow for adding an informer without an import cycle
-type SharedInformerFactory interface {
-	Start(stopCh <-chan struct{})
-	InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
-}
-
-// TweakListOptionsFunc is a function that transforms a v1.ListOptions.
-type TweakListOptionsFunc func(*v1.ListOptions)
diff --git a/submarine-cloud/pkg/client/informers/externalversions/submarine/interface.go b/submarine-cloud/pkg/client/informers/externalversions/submarine/interface.go
deleted file mode 100644
index a2122e5..0000000
--- a/submarine-cloud/pkg/client/informers/externalversions/submarine/interface.go
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 informer-gen. DO NOT EDIT.
-
-package submarine
-
-import (
-	internalinterfaces "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces"
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1"
-)
-
-// Interface provides access to each of this group's versions.
-type Interface interface {
-	// V1alpha1 provides access to shared informers for resources in V1alpha1.
-	V1alpha1() v1alpha1.Interface
-}
-
-type group struct {
-	factory          internalinterfaces.SharedInformerFactory
-	namespace        string
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-}
-
-// New returns a new Interface.
-func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
-	return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
-}
-
-// V1alpha1 returns a new v1alpha1.Interface.
-func (g *group) V1alpha1() v1alpha1.Interface {
-	return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions)
-}
diff --git a/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1/interface.go b/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1/interface.go
deleted file mode 100644
index 59af52f..0000000
--- a/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1/interface.go
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 informer-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	internalinterfaces "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces"
-)
-
-// Interface provides access to all the informers in this group version.
-type Interface interface {
-	// SubmarineClusters returns a SubmarineClusterInformer.
-	SubmarineClusters() SubmarineClusterInformer
-}
-
-type version struct {
-	factory          internalinterfaces.SharedInformerFactory
-	namespace        string
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-}
-
-// New returns a new Interface.
-func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
-	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
-}
-
-// SubmarineClusters returns a SubmarineClusterInformer.
-func (v *version) SubmarineClusters() SubmarineClusterInformer {
-	return &submarineClusterInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
-}
diff --git a/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1/submarinecluster.go b/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1/submarinecluster.go
deleted file mode 100644
index 35c510e..0000000
--- a/submarine-cloud/pkg/client/informers/externalversions/submarine/v1alpha1/submarinecluster.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 informer-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	time "time"
-
-	submarinev1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	versioned "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned"
-	internalinterfaces "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions/internalinterfaces"
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/client/listers/submarine/v1alpha1"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	watch "k8s.io/apimachinery/pkg/watch"
-	cache "k8s.io/client-go/tools/cache"
-)
-
-// SubmarineClusterInformer provides access to a shared informer and lister for
-// SubmarineClusters.
-type SubmarineClusterInformer interface {
-	Informer() cache.SharedIndexInformer
-	Lister() v1alpha1.SubmarineClusterLister
-}
-
-type submarineClusterInformer struct {
-	factory          internalinterfaces.SharedInformerFactory
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-	namespace        string
-}
-
-// NewSubmarineClusterInformer constructs a new informer for SubmarineCluster type.
-// Always prefer using an informer factory to get a shared informer instead of getting an independent
-// one. This reduces memory footprint and number of connections to the server.
-func NewSubmarineClusterInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
-	return NewFilteredSubmarineClusterInformer(client, namespace, resyncPeriod, indexers, nil)
-}
-
-// NewFilteredSubmarineClusterInformer constructs a new informer for SubmarineCluster type.
-// Always prefer using an informer factory to get a shared informer instead of getting an independent
-// one. This reduces memory footprint and number of connections to the server.
-func NewFilteredSubmarineClusterInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
-	return cache.NewSharedIndexInformer(
-		&cache.ListWatch{
-			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
-				if tweakListOptions != nil {
-					tweakListOptions(&options)
-				}
-				return client.SubmarineV1alpha1().SubmarineClusters(namespace).List(options)
-			},
-			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
-				if tweakListOptions != nil {
-					tweakListOptions(&options)
-				}
-				return client.SubmarineV1alpha1().SubmarineClusters(namespace).Watch(options)
-			},
-		},
-		&submarinev1alpha1.SubmarineCluster{},
-		resyncPeriod,
-		indexers,
-	)
-}
-
-func (f *submarineClusterInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
-	return NewFilteredSubmarineClusterInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
-}
-
-func (f *submarineClusterInformer) Informer() cache.SharedIndexInformer {
-	return f.factory.InformerFor(&submarinev1alpha1.SubmarineCluster{}, f.defaultInformer)
-}
-
-func (f *submarineClusterInformer) Lister() v1alpha1.SubmarineClusterLister {
-	return v1alpha1.NewSubmarineClusterLister(f.Informer().GetIndexer())
-}
diff --git a/submarine-cloud/pkg/client/listers/submarine/v1alpha1/expansion_generated.go b/submarine-cloud/pkg/client/listers/submarine/v1alpha1/expansion_generated.go
deleted file mode 100644
index 1265463..0000000
--- a/submarine-cloud/pkg/client/listers/submarine/v1alpha1/expansion_generated.go
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-// SubmarineClusterListerExpansion allows custom methods to be added to
-// SubmarineClusterLister.
-type SubmarineClusterListerExpansion interface{}
-
-// SubmarineClusterNamespaceListerExpansion allows custom methods to be added to
-// SubmarineClusterNamespaceLister.
-type SubmarineClusterNamespaceListerExpansion interface{}
diff --git a/submarine-cloud/pkg/client/listers/submarine/v1alpha1/submarinecluster.go b/submarine-cloud/pkg/client/listers/submarine/v1alpha1/submarinecluster.go
deleted file mode 100644
index f2acaa3..0000000
--- a/submarine-cloud/pkg/client/listers/submarine/v1alpha1/submarinecluster.go
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	v1alpha1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/client-go/tools/cache"
-)
-
-// SubmarineClusterLister helps list SubmarineClusters.
-type SubmarineClusterLister interface {
-	// List lists all SubmarineClusters in the indexer.
-	List(selector labels.Selector) (ret []*v1alpha1.SubmarineCluster, err error)
-	// SubmarineClusters returns an object that can list and get SubmarineClusters.
-	SubmarineClusters(namespace string) SubmarineClusterNamespaceLister
-	SubmarineClusterListerExpansion
-}
-
-// submarineClusterLister implements the SubmarineClusterLister interface.
-type submarineClusterLister struct {
-	indexer cache.Indexer
-}
-
-// NewSubmarineClusterLister returns a new SubmarineClusterLister.
-func NewSubmarineClusterLister(indexer cache.Indexer) SubmarineClusterLister {
-	return &submarineClusterLister{indexer: indexer}
-}
-
-// List lists all SubmarineClusters in the indexer.
-func (s *submarineClusterLister) List(selector labels.Selector) (ret []*v1alpha1.SubmarineCluster, err error) {
-	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
-		ret = append(ret, m.(*v1alpha1.SubmarineCluster))
-	})
-	return ret, err
-}
-
-// SubmarineClusters returns an object that can list and get SubmarineClusters.
-func (s *submarineClusterLister) SubmarineClusters(namespace string) SubmarineClusterNamespaceLister {
-	return submarineClusterNamespaceLister{indexer: s.indexer, namespace: namespace}
-}
-
-// SubmarineClusterNamespaceLister helps list and get SubmarineClusters.
-type SubmarineClusterNamespaceLister interface {
-	// List lists all SubmarineClusters in the indexer for a given namespace.
-	List(selector labels.Selector) (ret []*v1alpha1.SubmarineCluster, err error)
-	// Get retrieves the SubmarineCluster from the indexer for a given namespace and name.
-	Get(name string) (*v1alpha1.SubmarineCluster, error)
-	SubmarineClusterNamespaceListerExpansion
-}
-
-// submarineClusterNamespaceLister implements the SubmarineClusterNamespaceLister
-// interface.
-type submarineClusterNamespaceLister struct {
-	indexer   cache.Indexer
-	namespace string
-}
-
-// List lists all SubmarineClusters in the indexer for a given namespace.
-func (s submarineClusterNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.SubmarineCluster, err error) {
-	err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
-		ret = append(ret, m.(*v1alpha1.SubmarineCluster))
-	})
-	return ret, err
-}
-
-// Get retrieves the SubmarineCluster from the indexer for a given namespace and name.
-func (s submarineClusterNamespaceLister) Get(name string) (*v1alpha1.SubmarineCluster, error) {
-	obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
-	if err != nil {
-		return nil, err
-	}
-	if !exists {
-		return nil, errors.NewNotFound(v1alpha1.Resource("submarinecluster"), name)
-	}
-	return obj.(*v1alpha1.SubmarineCluster), nil
-}
diff --git a/submarine-cloud/pkg/config/cluster.go b/submarine-cloud/pkg/config/cluster.go
deleted file mode 100644
index 2f5b6dd..0000000
--- a/submarine-cloud/pkg/config/cluster.go
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 config
-
-import "github.com/spf13/pflag"
-
-// Cluster used to store all Submarine Cluster configuration information
-type Cluster struct {
-	Namespace   string
-	NodeService string
-}
-
-// AddFlags use to add the Submarine-Cluster Config flags to the command line
-func (c *Cluster) AddFlags(fs *pflag.FlagSet) {
-	fs.StringVar(&c.Namespace, "ns", "", "Submarine-node k8s namespace")
-	fs.StringVar(&c.NodeService, "rs", "", "Submarine-node k8s service name")
-
-}
diff --git a/submarine-cloud/pkg/config/submarine.go b/submarine-cloud/pkg/config/submarine.go
deleted file mode 100644
index bb4dd58..0000000
--- a/submarine-cloud/pkg/config/submarine.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 config
-
-import (
-	"fmt"
-	"path"
-
-	"github.com/spf13/pflag"
-)
-
-const (
-	// DefaultSubmarineTimeout default Submarine timeout (ms)
-	DefaultSubmarineTimeout = 2000
-	//DefaultClusterNodeTimeout default cluster node timeout (ms)
-	//The maximum amount of time a Submarine Cluster node can be unavailable, without it being considered as failing
-	DefaultClusterNodeTimeout = 2000
-	// SubmarineRenameCommandsDefaultPath default path to volume storing rename commands
-	SubmarineRenameCommandsDefaultPath = "/etc/secret-volume"
-	// SubmarineRenameCommandsDefaultFile default file name containing rename commands
-	SubmarineRenameCommandsDefaultFile = ""
-	// SubmarineConfigFileDefault default config file path
-	SubmarineConfigFileDefault = "/submarine-conf/submarine.conf"
-	// SubmarineServerBinDefault default binary name
-	SubmarineServerBinDefault = "submarine-server"
-	// SubmarineServerPortDefault default Submarine port
-	SubmarineServerPortDefault = "6379"
-	// SubmarineMaxMemoryDefault default Submarine max memory
-	SubmarineMaxMemoryDefault = 0
-	// SubmarineMaxMemoryPolicyDefault default Submarine max memory eviction policy
-	SubmarineMaxMemoryPolicyDefault = "noeviction"
-)
-
-// Submarine used to store all Submarine configuration information
-type Submarine struct {
-	DialTimeout        int
-	ClusterNodeTimeout int
-	ConfigFileName     string
-	renameCommandsPath string
-	renameCommandsFile string
-	HTTPServerAddr     string
-	ServerBin          string
-	ServerPort         string
-	ServerIP           string
-	MaxMemory          uint32
-	MaxMemoryPolicy    string
-	ConfigFiles        []string
-}
-
-// AddFlags use to add the Submarine Config flags to the command line
-func (r *Submarine) AddFlags(fs *pflag.FlagSet) {
-	fs.IntVar(&r.DialTimeout, "rdt", DefaultSubmarineTimeout, "Submarine dial timeout (ms)")
-	fs.IntVar(&r.ClusterNodeTimeout, "cluster-node-timeout", DefaultClusterNodeTimeout, "Submarine node timeout (ms)")
-	fs.StringVar(&r.ConfigFileName, "c", SubmarineConfigFileDefault, "Submarine config file path")
-	fs.StringVar(&r.renameCommandsPath, "rename-command-path", SubmarineRenameCommandsDefaultPath, "Path to the folder where rename-commands option for Submarine are available")
-	fs.StringVar(&r.renameCommandsFile, "rename-command-file", SubmarineRenameCommandsDefaultFile, "Name of the file where rename-commands option for Submarine are available, disabled if empty")
-	fs.Uint32Var(&r.MaxMemory, "max-memory", SubmarineMaxMemoryDefault, "Submarine max memory")
-	fs.StringVar(&r.MaxMemoryPolicy, "max-memory-policy", SubmarineMaxMemoryPolicyDefault, "Submarine max memory evition policy")
-	fs.StringVar(&r.ServerBin, "bin", SubmarineServerBinDefault, "Submarine server binary file name")
-	fs.StringVar(&r.ServerPort, "port", SubmarineServerPortDefault, "Submarine server listen port")
-	fs.StringVar(&r.ServerIP, "ip", "", "Submarine server listen ip")
-	fs.StringArrayVar(&r.ConfigFiles, "config-file", []string{}, "Location of Submarine configuration file that will be include in the ")
-
-}
-
-// GetRenameCommandsFile return the path to the rename command file, or empty string if not define
-func (r *Submarine) GetRenameCommandsFile() string {
-	if r.renameCommandsFile == "" {
-		return ""
-	}
-	return path.Join(r.renameCommandsPath, r.renameCommandsFile)
-}
-
-// String stringer interface
-func (r Submarine) String() string {
-	var output string
-	output += fmt.Sprintln("[ Submarine Configuration ]")
-	output += fmt.Sprintln("- DialTimeout:", r.DialTimeout)
-	output += fmt.Sprintln("- ClusterNodeTimeout:", r.ClusterNodeTimeout)
-	output += fmt.Sprintln("- Rename commands:", r.GetRenameCommandsFile())
-	output += fmt.Sprintln("- max-memory:", r.MaxMemory)
-	output += fmt.Sprintln("- max-memory-policy:", r.MaxMemoryPolicy)
-	output += fmt.Sprintln("- server-bin:", r.ServerBin)
-	output += fmt.Sprintln("- server-port:", r.ServerPort)
-	return output
-}
diff --git a/submarine-cloud/pkg/controller/actions.go b/submarine-cloud/pkg/controller/actions.go
deleted file mode 100644
index 9b8a9e6..0000000
--- a/submarine-cloud/pkg/controller/actions.go
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/apache/submarine/submarine-cloud/pkg/controller/clustering"
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-	"github.com/golang/glog"
-	"time"
-)
-
-// Perform various management operations on Submarine Pod and Submarine clusters to approximate the desired state
-func (c *Controller) clusterAction(admin submarine.AdminInterface, cluster *rapi.SubmarineCluster, infos *submarine.ClusterInfos) (bool, error) {
-	glog.Info("clusterAction()")
-	var err error
-	/* run sanity check if needed
-	needSanity, err := sanitycheck.RunSanityChecks(admin, &c.config.submarine, c.podControl, cluster, infos, true)
-	if err != nil {
-		glog.Errorf("[clusterAction] cluster %s/%s, an error occurs during sanitycheck: %v ", cluster.Namespace, cluster.Name, err)
-		return false, err
-	}
-	if needSanity {
-		glog.V(3).Infof("[clusterAction] run sanitycheck cluster: %s/%s", cluster.Namespace, cluster.Name)
-		return sanitycheck.RunSanityChecks(admin, &c.config.submarine, c.podControl, cluster, infos, false)
-	}*/
-
-	// Start more pods in needed
-	if needMorePods(cluster) {
-		if setScalingCondition(&cluster.Status, true) {
-			if cluster, err = c.updateHandler(cluster); err != nil {
-				return false, err
-			}
-		}
-		pod, err2 := c.podControl.CreatePod(cluster)
-		if err2 != nil {
-			glog.Errorf("[clusterAction] unable to create a pod associated to the SubmarineCluster: %s/%s, err: %v", cluster.Namespace, cluster.Name, err2)
-			return false, err2
-		}
-
-		glog.V(3).Infof("[clusterAction]create a Pod %s/%s", pod.Namespace, pod.Name)
-		return true, nil
-	}
-	if setScalingCondition(&cluster.Status, false) {
-		if cluster, err = c.updateHandler(cluster); err != nil {
-			return false, err
-		}
-	}
-
-	// Reconfigure the Cluster if needed
-	hasChanged, err := c.applyConfiguration(admin, cluster)
-	if err != nil {
-		glog.Errorf("[clusterAction] cluster %s/%s, an error occurs: %v ", cluster.Namespace, cluster.Name, err)
-		return false, err
-	}
-
-	if hasChanged {
-		glog.V(6).Infof("[clusterAction] cluster has changed cluster: %s/%s", cluster.Namespace, cluster.Name)
-		return true, nil
-	}
-
-	glog.Infof("[clusterAction] cluster hasn't changed cluster: %s/%s", cluster.Namespace, cluster.Name)
-	return false, nil
-}
-
-// applyConfiguration apply new configuration if needed:
-// - add or delete pods
-// - configure the submarine-server process
-func (c *Controller) applyConfiguration(admin submarine.AdminInterface, cluster *rapi.SubmarineCluster) (bool, error) {
-	glog.Info("applyConfiguration START")
-	defer glog.Info("applyConfiguration STOP")
-
-	asChanged := false
-
-	// expected replication factor and number of master nodes
-	cReplicaFactor := *cluster.Spec.ReplicationFactor
-	cNbMaster := *cluster.Spec.NumberOfMaster
-	// Adapt, convert CR to structure in submarine package
-	rCluster, nodes, err := newSubmarineCluster(admin, cluster)
-	if err != nil {
-		glog.Errorf("Unable to create the SubmarineCluster view, error:%v", err)
-		return false, err
-	}
-	// PodTemplate changes require rolling updates
-	if needRollingUpdate(cluster) {
-		if setRollingUpdateCondition(&cluster.Status, true) {
-			if cluster, err = c.updateHandler(cluster); err != nil {
-				return false, err
-			}
-		}
-
-		glog.Info("applyConfiguration needRollingUpdate")
-		return c.manageRollingUpdate(admin, cluster, rCluster, nodes)
-	}
-	if setRollingUpdateCondition(&cluster.Status, false) {
-		if cluster, err = c.updateHandler(cluster); err != nil {
-			return false, err
-		}
-	}
-
-	// if the number of Pods is greater than expected
-	if needLessPods(cluster) {
-		if setRebalancingCondition(&cluster.Status, true) {
-			if cluster, err = c.updateHandler(cluster); err != nil {
-				return false, err
-			}
-		}
-		glog.Info("applyConfiguration needLessPods")
-		// Configure Submarine cluster
-		return c.managePodScaleDown(admin, cluster, rCluster, nodes)
-	}
-	// If it is not a rolling update, modify the Condition
-	if setRebalancingCondition(&cluster.Status, false) {
-		if cluster, err = c.updateHandler(cluster); err != nil {
-			return false, err
-		}
-	}
-
-	clusterStatus := &cluster.Status.Cluster
-	if (clusterStatus.NbPods - clusterStatus.NbSubmarineRunning) != 0 {
-		glog.V(3).Infof("All pods not ready wait to be ready, nbPods: %d, nbPodsReady: %d", clusterStatus.NbPods, clusterStatus.NbSubmarineRunning)
-		return false, err
-	}
-
-	// First, we define the new masters
-	// Select the desired number of Masters and assign Hashslots to each Master. The Master will be distributed to different K8S nodes as much as possible
-	// Set the cluster status to Calculating Rebalancing
-	newMasters, curMasters, allMaster, err := clustering.DispatchMasters(rCluster, nodes, cNbMaster, admin)
-	if err != nil {
-		glog.Errorf("Cannot dispatch slots to masters: %v", err)
-		rCluster.Status = rapi.ClusterStatusError
-		return false, err
-	}
-	// If the number of new and old masters is not the same
-	if len(newMasters) != len(curMasters) {
-		asChanged = true
-	}
-
-	// Second select Node that is already a slave
-	currentSlaveNodes := nodes.FilterByFunc(submarine.IsSlave)
-
-	//New slaves are slaves which is currently a master with no slots
-	newSlave := nodes.FilterByFunc(func(nodeA *submarine.Node) bool {
-		for _, nodeB := range newMasters {
-			if nodeA.ID == nodeB.ID {
-				return false
-			}
-		}
-		for _, nodeB := range currentSlaveNodes {
-			if nodeA.ID == nodeB.ID {
-				return false
-			}
-		}
-		return true
-	})
-
-	// Depending on whether we scale up or down, we will dispatch slaves before/after the dispatch of slots
-	if cNbMaster < int32(len(curMasters)) {
-		// this happens usually after a scale down of the cluster
-		// we should dispatch slots before dispatching slaves
-		if err := clustering.DispatchSlotToNewMasters(rCluster, admin, newMasters, curMasters, allMaster); err != nil {
-			glog.Error("Unable to dispatch slot on new master, err:", err)
-			return false, err
-		}
-
-		// assign master/slave roles
-		newSubmarineSlavesByMaster, bestEffort := clustering.PlaceSlaves(rCluster, newMasters, currentSlaveNodes, newSlave, cReplicaFactor)
-		if bestEffort {
-			rCluster.NodesPlacement = rapi.NodesPlacementInfoBestEffort
-		}
-
-		if err := clustering.AttachingSlavesToMaster(rCluster, admin, newSubmarineSlavesByMaster); err != nil {
-			glog.Error("Unable to dispatch slave on new master, err:", err)
-			return false, err
-		}
-	} else {
-		// We are scaling up the nbmaster or the nbmaster doesn't change.
-		// assign master/slave roles
-		newSubmarineSlavesByMaster, bestEffort := clustering.PlaceSlaves(rCluster, newMasters, currentSlaveNodes, newSlave, cReplicaFactor)
-		if bestEffort {
-			rCluster.NodesPlacement = rapi.NodesPlacementInfoBestEffort
-		}
-
-		if err := clustering.AttachingSlavesToMaster(rCluster, admin, newSubmarineSlavesByMaster); err != nil {
-			glog.Error("Unable to dispatch slave on new master, err:", err)
-			return false, err
-		}
-
-		if err := clustering.DispatchSlotToNewMasters(rCluster, admin, newMasters, curMasters, allMaster); err != nil {
-			glog.Error("Unable to dispatch slot on new master, err:", err)
-			return false, err
-		}
-	}
-
-	glog.V(4).Infof("new nodes status: \n %v", nodes)
-
-	// Set the cluster status
-	rCluster.Status = rapi.ClusterStatusOK
-	// wait a bit for the cluster to propagate configuration to reduce warning logs because of temporary inconsistency
-	time.Sleep(1 * time.Second)
-	return asChanged, nil
-}
-
-func newSubmarineCluster(admin submarine.AdminInterface, cluster *rapi.SubmarineCluster) (*submarine.Cluster, submarine.Nodes, error) {
-	infos, err := admin.GetClusterInfos()
-	if submarine.IsPartialError(err) {
-		glog.Errorf("Error getting consolidated view of the cluster err: %v", err)
-		return nil, nil, err
-	}
-
-	// now we can trigger the rebalance
-	nodes := infos.GetNodes()
-
-	// build submarine cluster vision
-	rCluster := &submarine.Cluster{
-		Name:      cluster.Name,
-		Namespace: cluster.Namespace,
-		Nodes:     make(map[string]*submarine.Node),
-	}
-
-	for _, node := range nodes {
-		rCluster.Nodes[node.ID] = node
-	}
-
-	for _, node := range cluster.Status.Cluster.Nodes {
-		if rNode, ok := rCluster.Nodes[node.ID]; ok {
-			rNode.Pod = node.Pod
-		}
-	}
-
-	return rCluster, nodes, nil
-}
-
-// manageRollingUpdate used to manage properly a cluster rolling update if the podtemplate spec has changed
-func (c *Controller) manageRollingUpdate(admin submarine.AdminInterface, cluster *rapi.SubmarineCluster, rCluster *submarine.Cluster, nodes submarine.Nodes) (bool, error) {
-	return true, nil
-}
-
-// managePodScaleDown used to manage properly the scale down of a cluster
-func (c *Controller) managePodScaleDown(admin submarine.AdminInterface, cluster *rapi.SubmarineCluster, rCluster *submarine.Cluster, nodes submarine.Nodes) (bool, error) {
-	return true, nil
-}
diff --git a/submarine-cloud/pkg/controller/checks.go b/submarine-cloud/pkg/controller/checks.go
deleted file mode 100644
index 4b99ef3..0000000
--- a/submarine-cloud/pkg/controller/checks.go
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	"reflect"
-
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	podctrl "github.com/apache/submarine/submarine-cloud/pkg/controller/pod"
-	"github.com/golang/glog"
-	kapi "k8s.io/api/core/v1"
-)
-
-// Divide pods for lost and other
-func filterLostNodes(pods []*kapi.Pod) (ok []*kapi.Pod, ko []*kapi.Pod) {
-	for _, pod := range pods {
-		if pod.Status.Reason == "NodeLost" {
-			ko = append(ko, pod)
-		} else {
-			ok = append(ok, pod)
-		}
-	}
-	return ok, ko
-}
-
-func compareStatus(old, new *rapi.SubmarineClusterClusterStatus) bool {
-	if compareStringValue("ClusterStatus", string(old.Status), string(new.Status)) {
-		return true
-	}
-	if compareInts("NbPods", old.NbPods, new.NbPods) {
-		return true
-	}
-	if compareInts("NbPodsReady", old.NbPodsReady, new.NbPodsReady) {
-		return true
-	}
-	if compareInts("NbSubmarineRunning", old.NbSubmarineRunning, new.NbSubmarineRunning) {
-		return true
-	}
-	if compareInts("NumberOfMaster", old.NumberOfMaster, new.NumberOfMaster) {
-		return true
-	}
-	if compareInts("MinReplicationFactor", old.MinReplicationFactor, new.MinReplicationFactor) {
-		return true
-	}
-	if compareInts("MaxReplicationFactor", old.MaxReplicationFactor, new.MaxReplicationFactor) {
-		return true
-	}
-	if compareStringValue("ClusterStatus", string(old.Status), string(new.Status)) {
-		return true
-	}
-	if compareStringValue("NodesPlacement", string(old.NodesPlacement), string(new.NodesPlacement)) {
-		return true
-	}
-	if compareInts("len(Nodes)", int32(len(old.Nodes)), int32(len(new.Nodes))) {
-		return true
-	}
-
-	if len(old.Nodes) != len(new.Nodes) {
-		return true
-	}
-	for _, nodeA := range old.Nodes {
-		found := false
-		for _, nodeB := range new.Nodes {
-			if nodeA.ID == nodeB.ID {
-				found = true
-				if compareNodes(&nodeA, &nodeB) {
-					return true
-				}
-			}
-		}
-		if !found {
-			return true
-		}
-	}
-
-	return false
-}
-
-func compareStringValue(name string, old, new string) bool {
-	if old != new {
-		glog.V(6).Infof("compare %s: %s - %s", name, old, new)
-		return true
-	}
-
-	return false
-}
-
-func compareInts(name string, old, new int32) bool {
-	if old != new {
-		glog.Infof("compare status.%s: %d - %d", name, old, new)
-		return true
-	}
-
-	return false
-}
-
-func compareNodes(nodeA, nodeB *rapi.SubmarineClusterNode) bool {
-	if compareStringValue("Node.IP", nodeA.IP, nodeB.IP) {
-		return true
-	}
-	if compareStringValue("Node.MasterRef", nodeA.MasterRef, nodeB.MasterRef) {
-		return true
-	}
-	if compareStringValue("Node.PodName", nodeA.PodName, nodeB.PodName) {
-		return true
-	}
-	if compareStringValue("Node.Port", nodeA.Port, nodeB.Port) {
-		return true
-	}
-	if compareStringValue("Node.Role", string(nodeA.Role), string(nodeB.Role)) {
-		return true
-	}
-
-	sizeSlotsA := 0
-	sizeSlotsB := 0
-	if nodeA.Slots != nil {
-		sizeSlotsA = len(nodeA.Slots)
-	}
-	if nodeB.Slots != nil {
-		sizeSlotsB = len(nodeB.Slots)
-	}
-	if sizeSlotsA != sizeSlotsB {
-		glog.Infof("compare Node.Slots size: %d - %d", sizeSlotsA, sizeSlotsB)
-		return true
-	}
-
-	if (sizeSlotsA != 0) && !reflect.DeepEqual(nodeA.Slots, nodeB.Slots) {
-		glog.Infof("compare Node.Slots deepEqual: %v - %v", nodeA.Slots, nodeB.Slots)
-		return true
-	}
-
-	return false
-}
-
-func needClusterOperation(cluster *rapi.SubmarineCluster) bool {
-	/*
-		if needRollingUpdate(cluster) {
-			glog.V(6).Info("needClusterOperation---needRollingUpdate")
-			return true
-		}
-
-		if needMorePods(cluster) {
-			glog.V(6).Info("needClusterOperation---needMorePods")
-			return true
-		}
-
-		if needLessPods(cluster) {
-			glog.Info("needClusterOperation---needLessPods")
-			return true
-		}
-
-		if compareIntValue("NumberOfMaster", &cluster.Status.Cluster.NumberOfMaster, cluster.Spec.NumberOfMaster) {
-			glog.V(6).Info("needClusterOperation---NumberOfMaster")
-			return true
-		}
-
-		if compareIntValue("MinReplicationFactor", &cluster.Status.Cluster.MinReplicationFactor, cluster.Spec.ReplicationFactor) {
-			glog.V(6).Info("needClusterOperation---MinReplicationFactor")
-			return true
-		}
-
-		if compareIntValue("MaxReplicationFactor", &cluster.Status.Cluster.MaxReplicationFactor, cluster.Spec.ReplicationFactor) {
-			glog.V(6).Info("needClusterOperation---MaxReplicationFactor")
-			return true
-		}*/
-
-	return false
-}
-
-func needMorePods(cluster *rapi.SubmarineCluster) bool {
-	// Expected number of Pods depends on replication factor and Master number
-	nbPodNeed := *cluster.Spec.NumberOfMaster * (1 + *cluster.Spec.ReplicationFactor)
-	glog.Infof("nbPodNeed=%d, *cluster.Spec.NumberOfMaster=%d, *cluster.Spec.ReplicationFactor=%d", nbPodNeed, *cluster.Spec.NumberOfMaster, *cluster.Spec.ReplicationFactor)
-
-	// If not all Pods are ready, do nothing
-	glog.Infof("cluster.Status.Cluster.NbPods=%d", cluster.Status.Cluster.NbPods)
-	glog.Infof("cluster.Status.Cluster.NbPodsReady=%d", cluster.Status.Cluster.NbPodsReady)
-	if cluster.Status.Cluster.NbPods != cluster.Status.Cluster.NbPodsReady {
-		return false
-	}
-	output := false
-	if cluster.Status.Cluster.NbPods < nbPodNeed {
-		glog.V(4).Infof("Not enough Pods running to apply the cluster [%s-%s] spec, current %d, needed %d ", cluster.Namespace, cluster.Name, cluster.Status.Cluster.NbPodsReady, nbPodNeed)
-		output = true
-	}
-
-	return output
-}
-
-func needLessPods(cluster *rapi.SubmarineCluster) bool {
-	nbPodNeed := *cluster.Spec.NumberOfMaster * (1 + *cluster.Spec.ReplicationFactor)
-
-	if cluster.Status.Cluster.NbPods != cluster.Status.Cluster.NbPodsReady {
-		return false
-	}
-	output := false
-	if cluster.Status.Cluster.NbPods > nbPodNeed {
-		glog.V(4).Infof("To many Pods running, needs to scale down the cluster [%s-%s], current %d, needed %d ", cluster.Namespace, cluster.Name, cluster.Status.Cluster.NbPods, nbPodNeed)
-		output = true
-	}
-	return output
-}
-
-func needRollingUpdate(cluster *rapi.SubmarineCluster) bool {
-	return !comparePodsWithPodTemplate(cluster)
-}
-
-func comparePodsWithPodTemplate(cluster *rapi.SubmarineCluster) bool {
-	clusterPodSpecHash, _ := podctrl.GenerateMD5Spec(&cluster.Spec.PodTemplate.Spec)
-	for _, node := range cluster.Status.Cluster.Nodes {
-		if node.Pod == nil {
-			continue
-		}
-		if !comparePodSpecMD5Hash(clusterPodSpecHash, node.Pod) {
-			return false
-		}
-	}
-
-	return true
-}
-
-func comparePodSpecMD5Hash(hash string, pod *kapi.Pod) bool {
-	if val, ok := pod.Annotations[rapi.PodSpecMD5LabelKey]; ok {
-		if val != hash {
-			return false
-		}
-	} else {
-		return false
-	}
-
-	return true
-}
diff --git a/submarine-cloud/pkg/controller/clustering/cluster-migration.go b/submarine-cloud/pkg/controller/clustering/cluster-migration.go
deleted file mode 100644
index 3b0cc64..0000000
--- a/submarine-cloud/pkg/controller/clustering/cluster-migration.go
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 clustering
-
-import (
-	"fmt"
-	v1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-	"github.com/golang/glog"
-)
-
-// DispatchMasters used to select nodes with master roles
-func DispatchMasters(cluster *submarine.Cluster, nodes submarine.Nodes, nbMaster int32, admin submarine.AdminInterface) (submarine.Nodes, submarine.Nodes, submarine.Nodes, error) {
-	glog.Info("Start dispatching slots to masters nb nodes: ", len(nodes))
-	var allMasterNodes submarine.Nodes
-	// First loop get Master with already Slots assign on it
-	currentMasterNodes := nodes.FilterByFunc(submarine.IsMasterWithSlot)
-	allMasterNodes = append(allMasterNodes, currentMasterNodes...)
-
-	// add also available Master without slot
-	currentMasterWithNoSlot := nodes.FilterByFunc(submarine.IsMasterWithNoSlot)
-	allMasterNodes = append(allMasterNodes, currentMasterWithNoSlot...)
-	glog.V(2).Info("Master with No slot:", len(currentMasterWithNoSlot))
-
-	newMasterNodesSmartSelection, besteffort, err := PlaceMasters(cluster, currentMasterNodes, currentMasterWithNoSlot, nbMaster)
-
-	glog.V(2).Infof("Total masters: %d - target %d - selected: %d", len(allMasterNodes), nbMaster, len(newMasterNodesSmartSelection))
-	if err != nil {
-		return submarine.Nodes{}, submarine.Nodes{}, submarine.Nodes{}, fmt.Errorf("Not Enough Master available current:%d target:%d, err:%v", len(allMasterNodes), nbMaster, err)
-	}
-
-	newMasterNodesSmartSelection = newMasterNodesSmartSelection.SortByFunc(func(a, b *submarine.Node) bool { return a.ID < b.ID })
-
-	cluster.Status = v1.ClusterStatusCalculatingRebalancing
-	if besteffort {
-		cluster.NodesPlacement = v1.NodesPlacementInfoBestEffort
-	} else {
-		cluster.NodesPlacement = v1.NodesPlacementInfoOptimal
-	}
-
-	return newMasterNodesSmartSelection, currentMasterNodes, allMasterNodes, nil
-}
-
-// DispatchSlotToNewMasters used to dispatch Slot to the new master nodes
-func DispatchSlotToNewMasters(cluster *submarine.Cluster, admin submarine.AdminInterface, newMasterNodes, currentMasterNodes, allMasterNodes submarine.Nodes) error {
-	return nil
-}
diff --git a/submarine-cloud/pkg/controller/clustering/cluster-placement.go b/submarine-cloud/pkg/controller/clustering/cluster-placement.go
deleted file mode 100644
index b9530a0..0000000
--- a/submarine-cloud/pkg/controller/clustering/cluster-placement.go
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 clustering
-
-import (
-	"fmt"
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-	"github.com/golang/glog"
-)
-
-const unknownVMName = "unknown" // <-- I hope nobody will ever name a VM "unknown" because this will impact the algorithm inside that package. Maybe you should generate a mangled name or a more complex name here to reduce probability.
-
-// PlaceMasters used to select Submarine Node knowing on which VM they are running in order to spread as possible
-// the masters on different VMs.
-// Improvement: Use Kube Node labeling instead of the "NodeName", (availability zone and so)
-func PlaceMasters(cluster *submarine.Cluster, currentMaster submarine.Nodes, allPossibleMasters submarine.Nodes, nbMaster int32) (submarine.Nodes, bool, error) {
-	selection := submarine.Nodes{}
-	selection = append(selection, currentMaster...)
-
-	// in case of scale down the current number of master is superior to
-	// the number of needed master so we limit the size of the selection.
-	if len(selection) > int(nbMaster) {
-		selection = selection[0:nbMaster]
-	}
-
-	masterByVM := sortSubmarineNodeByVM(cluster, allPossibleMasters)
-	vmWithAlreadyMaster := sortSubmarineNodeByVM(cluster, currentMaster)
-
-	bestEffort := false
-	for len(selection) < int(nbMaster) {
-		isProgress := false
-		for vmName, nodes := range masterByVM {
-			if !bestEffort {
-				// discard vm with already Master(s) when we are not in best effort
-				if _, ok := vmWithAlreadyMaster[vmName]; ok {
-					continue
-				}
-			}
-			if len(nodes) == 0 {
-				continue
-			}
-			glog.Infof("- add node:%s to the master selection", nodes[0].ID)
-			selection = append(selection, nodes[0])
-			masterByVM[vmName] = nodes[1:]
-			isProgress = true
-			if len(selection) >= int(nbMaster) {
-				return selection, bestEffort, nil
-			}
-		}
-		if bestEffort && !isProgress {
-			glog.Errorf("Nothing appends since last loop, it means no more master available")
-			break
-		}
-		bestEffort = true
-		if glog.V(4) {
-			glog.Warning("the Pod are not spread enough on VMs to have only one Master by VM.")
-		}
-	}
-	glog.Infof("- bestEffort %v", bestEffort)
-	for _, node := range selection {
-		glog.Infof("- Master %s, ip:%s", node.ID, node.IP)
-	}
-	if len(selection) >= int(nbMaster) {
-		return selection, bestEffort, nil
-	}
-	return selection, bestEffort, fmt.Errorf("unable to found enough node for have the request number of master")
-}
-
-func sortSubmarineNodeByVM(cluster *submarine.Cluster, nodes submarine.Nodes) map[string]submarine.Nodes {
-	nodesByVM := make(map[string]submarine.Nodes)
-
-	for _, rnode := range nodes {
-		cnode, err := cluster.GetNodeByID(rnode.ID)
-		if err != nil {
-			glog.Errorf("[sortSubmarineNodeByVM] unable fo found the Cluster.Node with submarine ID:%s", rnode.ID)
-			continue // if not then next line with cnode.Pod will cause a panic since cnode is nil
-		}
-		vmName := unknownVMName
-		if cnode.Pod != nil && cnode.Pod.Spec.NodeName != "" {
-			vmName = cnode.Pod.Spec.NodeName
-		}
-		if _, ok := nodesByVM[vmName]; !ok {
-			nodesByVM[vmName] = submarine.Nodes{}
-		}
-		nodesByVM[vmName] = append(nodesByVM[vmName], rnode)
-	}
-
-	return nodesByVM
-}
-
-// PlaceSlaves used to select Submarine Node knowing on which VM they are running in order to spread as possible
-func PlaceSlaves(cluster *submarine.Cluster, masters, oldSlaves, newSlaves submarine.Nodes, replicationFactor int32) (map[string]submarine.Nodes, bool) {
-	slavesByMaster := make(map[string]submarine.Nodes)
-
-	// be sure that no oldSlaves is present in newSlaves
-	for _, newSlave := range newSlaves {
-		for _, oldSlaves := range oldSlaves {
-			if newSlave.ID == oldSlaves.ID {
-				removeIDFunc := func(node *submarine.Node) bool {
-					return node.ID == newSlave.ID
-				}
-				newSlaves.FilterByFunc(removeIDFunc)
-				if glog.V(4) {
-					glog.Warning("Remove oldSlave for newSlave, id:", newSlave.ID)
-				}
-			}
-		}
-	}
-
-	newSlavesByVM := sortSubmarineNodeByVM(cluster, newSlaves)
-
-	for _, node := range masters {
-		slavesByMaster[node.ID] = submarine.Nodes{}
-	}
-
-	for _, slave := range oldSlaves {
-		for _, master := range masters {
-			if slave.MasterReferent == master.ID {
-				if len(slavesByMaster[slave.MasterReferent]) >= int(replicationFactor) {
-					if node, err := cluster.GetNodeByID(slave.ID); err != nil {
-						vmName := unknownVMName
-						if node.Pod != nil && node.Pod.Spec.NodeName != "" {
-							vmName = node.Pod.Spec.NodeName
-						}
-						newSlavesByVM[vmName] = append(newSlavesByVM[vmName], slave)
-					}
-				} else {
-					//The master of this slave is among the new master nodes
-					slavesByMaster[slave.MasterReferent] = append(slavesByMaster[slave.MasterReferent], slave)
-					break
-				}
-			}
-		}
-	}
-
-	slavesByVMNotUsed := make(map[string]submarine.Nodes)
-	isSlaveNodeUsed := false
-
-	// we iterate on free slaves by Vms
-	for vmName, slaves := range newSlavesByVM {
-		// then for this VM "vmName" we try to attach those slaves on a Master
-		for idPossibleSlave, possibleSlave := range slaves {
-			// Now we iterate on the Master and check if the current VM is already used for a Slave attach
-			// to the current master "idMaster"
-			slaveUsed := false
-			for idMaster, currentSlaves := range slavesByMaster {
-				if len(currentSlaves) >= int(replicationFactor) {
-					// already enough slaves attached to this master
-					continue
-				}
-
-				if checkIfSameVM(cluster, idMaster, vmName) {
-					continue
-				}
-
-				// lets check if the VM already host a slave for this master
-				vmAlreadyUsedForSlave := false
-				for _, currentSlave := range currentSlaves {
-					vmSlaveNode, err := cluster.GetNodeByID(currentSlave.ID)
-					if err != nil {
-						glog.Error("unable to find in the cluster the slave with id:", currentSlave.ID)
-						continue
-					}
-					vmSlaveName := unknownVMName
-					if vmSlaveNode.Pod != nil {
-						vmSlaveName = vmSlaveNode.Pod.Spec.NodeName
-					}
-					if vmName == vmSlaveName {
-						vmAlreadyUsedForSlave = true
-						break
-					}
-				}
-				if !vmAlreadyUsedForSlave {
-					// This vm is not already used for hosting a slave for this master so we can attach this slave to it.
-					slavesByMaster[idMaster] = append(slavesByMaster[idMaster], slaves[idPossibleSlave])
-					slaveUsed = true
-					break
-				}
-			}
-			if !slaveUsed {
-				isSlaveNodeUsed = true
-				// store unused slave for later dispatch
-				slavesByVMNotUsed[vmName] = append(slavesByVMNotUsed[vmName], possibleSlave)
-			}
-		}
-	}
-
-	bestEffort := false
-	if isSlaveNodeUsed {
-		bestEffort = true
-		if glog.V(4) {
-			glog.Warning("Unable to spread properly all the Slave on different VMs, we start best effort")
-		}
-		for _, freeSlaves := range slavesByVMNotUsed {
-			for _, freeSlave := range freeSlaves {
-				for masterID, slaves := range slavesByMaster {
-					if len(slaves) >= int(replicationFactor) {
-						continue
-					}
-					slavesByMaster[masterID] = append(slavesByMaster[masterID], freeSlave)
-					break
-				}
-			}
-		}
-	}
-
-	return slavesByMaster, bestEffort
-}
-
-func checkIfSameVM(cluster *submarine.Cluster, submarineID, vmName string) bool {
-	nodeVMName := unknownVMName
-	if vmNode, err := cluster.GetNodeByID(submarineID); err == nil {
-		if vmNode.Pod != nil {
-			nodeVMName = vmNode.Pod.Spec.NodeName
-		}
-	}
-
-	if vmName == nodeVMName {
-		return true
-	}
-
-	return false
-}
diff --git a/submarine-cloud/pkg/controller/clustering/cluster-roles.go b/submarine-cloud/pkg/controller/clustering/cluster-roles.go
deleted file mode 100644
index c3be565..0000000
--- a/submarine-cloud/pkg/controller/clustering/cluster-roles.go
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 clustering
-
-import (
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-	"github.com/golang/glog"
-)
-
-// AttachingSlavesToMaster used to attach slaves to there masters
-func AttachingSlavesToMaster(cluster *submarine.Cluster, admin submarine.AdminInterface, slavesByMaster map[string]submarine.Nodes) error {
-	var globalErr error
-	for masterID, slaves := range slavesByMaster {
-		masterNode, err := cluster.GetNodeByID(masterID)
-		if err != nil {
-			glog.Errorf("[AttachingSlavesToMaster] unable fo found the Cluster.Node with submarine ID:%s", masterID)
-			continue
-		}
-		for _, slave := range slaves {
-			glog.V(2).Infof("[AttachingSlavesToMaster] Attaching node %s to master %s", slave.ID, masterID)
-
-			err := admin.AttachSlaveToMaster(slave, masterNode)
-			if err != nil {
-				glog.Errorf("Error while attaching node %s to master %s: %v", slave.ID, masterID, err)
-				globalErr = err
-			}
-		}
-	}
-	return globalErr
-}
diff --git a/submarine-cloud/pkg/controller/condition.go b/submarine-cloud/pkg/controller/condition.go
deleted file mode 100644
index 280e971..0000000
--- a/submarine-cloud/pkg/controller/condition.go
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	apiv1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-func setRebalancingCondition(clusterStatus *rapi.SubmarineClusterStatus, status bool) bool {
-	statusCondition := apiv1.ConditionFalse
-	if status {
-		statusCondition = apiv1.ConditionTrue
-	}
-	return setCondition(clusterStatus, rapi.SubmarineClusterRebalancing, statusCondition, metav1.Now(), "topology as changed", "reconfigure on-going after topology changed")
-}
-
-func setCondition(clusterStatus *rapi.SubmarineClusterStatus, conditionType rapi.SubmarineClusterConditionType, status apiv1.ConditionStatus, now metav1.Time, reason, message string) bool {
-	updated := false
-	found := false
-	for i, c := range clusterStatus.Conditions {
-		if c.Type == conditionType {
-			found = true
-			if c.Status != status {
-				updated = true
-				clusterStatus.Conditions[i] = updateCondition(c, status, now, reason, message)
-			}
-		}
-	}
-	if !found {
-		updated = true
-		clusterStatus.Conditions = append(clusterStatus.Conditions, newCondition(conditionType, status, now, reason, message))
-	}
-	return updated
-}
-
-func setRollingUpdateCondition(clusterStatus *rapi.SubmarineClusterStatus, status bool) bool {
-	statusCondition := apiv1.ConditionFalse
-	if status {
-		statusCondition = apiv1.ConditionTrue
-	}
-	return setCondition(clusterStatus, rapi.SubmarineClusterRollingUpdate, statusCondition, metav1.Now(), "Rolling update ongoing", "a Rolling update is ongoing")
-}
-
-func setScalingCondition(clusterStatus *rapi.SubmarineClusterStatus, status bool) bool {
-	statusCondition := apiv1.ConditionFalse
-	if status {
-		statusCondition = apiv1.ConditionTrue
-	}
-	return setCondition(clusterStatus, rapi.SubmarineClusterScaling, statusCondition, metav1.Now(), "cluster needs more pods", "cluster needs more pods")
-}
-
-// updateCondition return an updated version of the SubmarineClusterCondition
-func updateCondition(from rapi.SubmarineClusterCondition, status apiv1.ConditionStatus, now metav1.Time, reason, message string) rapi.SubmarineClusterCondition {
-	newCondition := from.DeepCopy()
-	newCondition.LastProbeTime = now
-	newCondition.Message = message
-	newCondition.Reason = reason
-	if status != newCondition.Status {
-		newCondition.Status = status
-		newCondition.LastTransitionTime = now
-	}
-
-	return *newCondition
-}
-
-// newCondition return a new defaulted instance of a SubmarineClusterCondition
-func newCondition(conditionType rapi.SubmarineClusterConditionType, status apiv1.ConditionStatus, now metav1.Time, reason, message string) rapi.SubmarineClusterCondition {
-	return rapi.SubmarineClusterCondition{
-		Type:               conditionType,
-		Status:             status,
-		LastProbeTime:      now,
-		LastTransitionTime: now,
-		Reason:             reason,
-		Message:            message,
-	}
-}
-
-func setClusterStatusCondition(clusterStatus *rapi.SubmarineClusterStatus, status bool) bool {
-	statusCondition := apiv1.ConditionFalse
-	if status {
-		statusCondition = apiv1.ConditionTrue
-	}
-	return setCondition(clusterStatus, rapi.SubmarineClusterOK, statusCondition, metav1.Now(), "submarine-cluster is correctly configure", "submarine-cluster is correctly configure")
-}
diff --git a/submarine-cloud/pkg/controller/config.go b/submarine-cloud/pkg/controller/config.go
deleted file mode 100644
index 786865c..0000000
--- a/submarine-cloud/pkg/controller/config.go
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import "github.com/apache/submarine/submarine-cloud/pkg/config"
-
-// Config contains the Controller settings
-type Config struct {
-	NbWorker  int
-	submarine config.Submarine
-}
-
-// NewConfig builds and returns new Config instance
-func NewConfig(nbWorker int, submarine config.Submarine) *Config {
-	return &Config{
-		NbWorker:  nbWorker,
-		submarine: submarine,
-	}
-}
diff --git a/submarine-cloud/pkg/controller/controller.go b/submarine-cloud/pkg/controller/controller.go
deleted file mode 100644
index db7436c..0000000
--- a/submarine-cloud/pkg/controller/controller.go
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	"fmt"
-	"github.com/apache/submarine/submarine-cloud/pkg/controller/pod"
-	"github.com/apache/submarine/submarine-cloud/pkg/controller/sanitycheck"
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-	"github.com/golang/glog"
-	apiv1 "k8s.io/api/core/v1"
-	policyv1 "k8s.io/api/policy/v1beta1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	"k8s.io/apimachinery/pkg/util/wait"
-	kubeinformers "k8s.io/client-go/informers"
-	"k8s.io/client-go/kubernetes/scheme"
-	typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
-	corev1listers "k8s.io/client-go/listers/core/v1"
-	policyv1listers "k8s.io/client-go/listers/policy/v1beta1"
-	"k8s.io/client-go/tools/cache"
-	"k8s.io/client-go/tools/record"
-	"k8s.io/client-go/util/workqueue"
-	"math"
-	"reflect"
-	"time"
-
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	sClient "github.com/apache/submarine/submarine-cloud/pkg/client/clientset/versioned"
-	sInformers "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions"
-	sListers "github.com/apache/submarine/submarine-cloud/pkg/client/listers/submarine/v1alpha1"
-	clientset "k8s.io/client-go/kubernetes"
-)
-
-// Controller contains all controller fields
-type Controller struct {
-	kubeClient      clientset.Interface
-	submarineClient sClient.Interface
-
-	submarineClusterLister sListers.SubmarineClusterLister
-	SubmarineClusterSynced cache.InformerSynced
-
-	podLister corev1listers.PodLister
-	PodSynced cache.InformerSynced
-
-	serviceLister corev1listers.ServiceLister
-	ServiceSynced cache.InformerSynced
-
-	podDisruptionBudgetLister  policyv1listers.PodDisruptionBudgetLister
-	PodDiscruptionBudgetSynced cache.InformerSynced
-
-	podControl                 pod.SubmarineClusterControlInterface
-	serviceControl             ServicesControlInterface
-	podDisruptionBudgetControl PodDisruptionBudgetsControlInterface
-
-	updateHandler func(cluster *rapi.SubmarineCluster) (*rapi.SubmarineCluster, error) // callback to update SubmarineCluster. Added as member for testing
-
-	queue    workqueue.RateLimitingInterface // SubmarineClusters to be synced
-	recorder record.EventRecorder
-
-	config *Config
-}
-
-// NewController builds and return new controller instance
-func NewController(cfg *Config, kubeClient clientset.Interface, submarineClient sClient.Interface, kubeInformer kubeinformers.SharedInformerFactory, rInformer sInformers.SharedInformerFactory) *Controller {
-	glog.Info("NewController()")
-	eventBroadcaster := record.NewBroadcaster()
-	eventBroadcaster.StartLogging(glog.Infof)
-	eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
-
-	serviceInformer := kubeInformer.Core().V1().Services()
-	podInformer := kubeInformer.Core().V1().Pods()
-	submarineInformer := rInformer.Submarine().V1alpha1().SubmarineClusters()
-	podDisruptionBudgetInformer := kubeInformer.Policy().V1beta1().PodDisruptionBudgets()
-
-	ctrl := &Controller{
-		kubeClient:                 kubeClient,
-		submarineClient:            submarineClient,
-		submarineClusterLister:     submarineInformer.Lister(),
-		SubmarineClusterSynced:     submarineInformer.Informer().HasSynced,
-		podLister:                  podInformer.Lister(),
-		PodSynced:                  podInformer.Informer().HasSynced,
-		serviceLister:              serviceInformer.Lister(),
-		ServiceSynced:              serviceInformer.Informer().HasSynced,
-		podDisruptionBudgetLister:  podDisruptionBudgetInformer.Lister(),
-		PodDiscruptionBudgetSynced: podDisruptionBudgetInformer.Informer().HasSynced,
-
-		queue:    workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "submarinecluster"),
-		recorder: eventBroadcaster.NewRecorder(scheme.Scheme, apiv1.EventSource{Component: "submarinecluster-controller"}),
-
-		config: cfg,
-	}
-
-	submarineInformer.Informer().AddEventHandler(
-		cache.ResourceEventHandlerFuncs{
-			AddFunc:    ctrl.onAddSubmarineCluster,
-			UpdateFunc: ctrl.onUpdateSubmarineCluster,
-			DeleteFunc: ctrl.onDeleteSubmarineCluster,
-		},
-	)
-
-	podInformer.Informer().AddEventHandler(
-		cache.ResourceEventHandlerFuncs{
-			AddFunc:    ctrl.onAddPod,
-			UpdateFunc: ctrl.onUpdatePod,
-			DeleteFunc: ctrl.onDeletePod,
-		},
-	)
-
-	ctrl.updateHandler = ctrl.updateSubmarineCluster
-	ctrl.podControl = pod.NewSubmarineClusterControl(ctrl.podLister, ctrl.kubeClient, ctrl.recorder)
-	ctrl.serviceControl = NewServicesControl(ctrl.kubeClient, ctrl.recorder)
-	ctrl.podDisruptionBudgetControl = NewPodDisruptionBudgetsControl(ctrl.kubeClient, ctrl.recorder)
-
-	return ctrl
-}
-
-// Run executes the Controller
-func (c *Controller) Run(stop <-chan struct{}) error {
-	glog.Infof("Starting SubmarineCluster controller")
-
-	if !cache.WaitForCacheSync(stop, c.PodSynced, c.SubmarineClusterSynced, c.ServiceSynced) {
-		return fmt.Errorf("Timed out waiting for caches to sync")
-	}
-
-	for i := 0; i < c.config.NbWorker; i++ {
-		go wait.Until(c.runWorker, time.Second, stop)
-	}
-
-	<-stop
-	return nil
-}
-
-func (c *Controller) runWorker() {
-	for c.processNextItem() {
-	}
-}
-
-func (c *Controller) processNextItem() bool {
-	glog.Infof("processNextItem")
-	key, quit := c.queue.Get()
-	if quit {
-		return false
-	}
-	defer c.queue.Done(key)
-	needRequeue, err := c.sync(key.(string))
-	if err == nil {
-		c.queue.Forget(key)
-	} else {
-		utilruntime.HandleError(fmt.Errorf("Error syncing submarinecluster: %v", err))
-		c.queue.AddRateLimited(key)
-		return true
-	}
-
-	if needRequeue {
-		glog.V(4).Info("processNextItem: Requeue key:", key)
-		c.queue.AddRateLimited(key)
-	}
-
-	return true
-}
-
-func (c *Controller) sync(key string) (bool, error) {
-	glog.V(2).Infof("sync() key:%s", key)
-	startTime := metav1.Now()
-	defer func() {
-		glog.V(2).Infof("Finished syncing SubmarineCluster %q (%v", key, time.Since(startTime.Time))
-	}()
-	namespace, name, err := cache.SplitMetaNamespaceKey(key)
-	if err != nil {
-		return false, err
-	}
-	glog.V(6).Infof("Syncing %s/%s", namespace, name)
-	sharedSubmarineCluster, err := c.submarineClusterLister.SubmarineClusters(namespace).Get(name)
-	if err != nil {
-		glog.Errorf("unable to get SubmarineCluster %s/%s: %v. Maybe deleted", namespace, name, err)
-		return false, nil
-	}
-
-	if !rapi.IsDefaultedSubmarineCluster(sharedSubmarineCluster) {
-		defaultedSubmarineCluster := rapi.DefaultSubmarineCluster(sharedSubmarineCluster)
-		if _, err = c.updateHandler(defaultedSubmarineCluster); err != nil {
-			glog.Errorf("SubmarineCluster %s/%s updated error:, err", namespace, name)
-			return false, fmt.Errorf("unable to default SubmarineCluster %s/%s: %v", namespace, name, err)
-		}
-		glog.V(6).Infof("SubmarineCluster-Operator.sync Defaulted %s/%s", namespace, name)
-		return false, nil
-	}
-
-	// TODO add validation
-
-	// TODO: add test the case of graceful deletion
-	if sharedSubmarineCluster.DeletionTimestamp != nil {
-		return false, nil
-	}
-
-	submarinecluster := sharedSubmarineCluster.DeepCopy()
-
-	// Init status.StartTime
-	if submarinecluster.Status.StartTime == nil {
-		submarinecluster.Status.StartTime = &startTime
-		if _, err := c.updateHandler(submarinecluster); err != nil {
-			glog.Errorf("SubmarineCluster %s/%s: unable init startTime: %v", namespace, name, err)
-			return false, nil
-		}
-		glog.V(4).Infof("SubmarineCluster %s/%s: startTime updated", namespace, name)
-		return false, nil
-	}
-	return c.syncCluster(submarinecluster)
-}
-
-func (c *Controller) syncCluster(submarineCluster *rapi.SubmarineCluster) (forceRequeue bool, err error) {
-	glog.Info("syncCluster START")
-	defer glog.Info("syncCluster STOP")
-	forceRequeue = false
-	submarineClusterService, err := c.getSubmarineClusterService(submarineCluster)
-	if err != nil {
-		glog.Errorf("SubmarineCluster-Operator.sync unable to retrieves service associated to the SubmarineCluster: %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-		return forceRequeue, err
-	}
-	if submarineClusterService == nil {
-		if _, err = c.serviceControl.CreateSubmarineClusterService(submarineCluster); err != nil {
-			glog.Errorf("SubmarineCluster-Operator.sync unable to create service associated to the SubmarineCluster: %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-			return forceRequeue, err
-		}
-	}
-
-	submarineClusterPodDisruptionBudget, err := c.getSubmarineClusterPodDisruptionBudget(submarineCluster)
-	if err != nil {
-		glog.Errorf("SubmarineCluster-Operator.sync unable to retrieves podDisruptionBudget associated to the SubmarineCluster: %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-		return forceRequeue, err
-	}
-	if submarineClusterPodDisruptionBudget == nil {
-		if _, err = c.podDisruptionBudgetControl.CreateSubmarineClusterPodDisruptionBudget(submarineCluster); err != nil {
-			glog.Errorf("SubmarineCluster-Operator.sync unable to create podDisruptionBudget associated to the SubmarineCluster: %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-			return forceRequeue, err
-		}
-	}
-
-	submarineClusterPods, err := c.podControl.GetSubmarineClusterPods(submarineCluster)
-	if err != nil {
-		glog.Errorf("SubmarineCluster-Operator.sync unable to retrieves pod associated to the SubmarineCluster: %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-		return forceRequeue, err
-	}
-
-	Pods, LostPods := filterLostNodes(submarineClusterPods)
-	if len(LostPods) != 0 {
-		for _, p := range LostPods {
-			err := c.podControl.DeletePodNow(submarineCluster, p.Name)
-			glog.Errorf("Lost node with pod %s. Deleting... %v", p.Name, err)
-		}
-		submarineClusterPods = Pods
-	}
-
-	// SubmarineAdmin is used access the Submarine process in the different pods.
-	admin, err := NewSubmarineAdmin(submarineClusterPods, &c.config.submarine)
-	if err != nil {
-		return forceRequeue, fmt.Errorf("unable to create the submarine.Admin, err:%v", err)
-	}
-	defer admin.Close()
-
-	clusterInfos, errGetInfos := admin.GetClusterInfos()
-	if errGetInfos != nil {
-		glog.Errorf("Error when get cluster infos to rebuild bom : %v", errGetInfos)
-		if clusterInfos.Status == submarine.ClusterInfosPartial {
-			return false, fmt.Errorf("partial Cluster infos")
-		}
-	}
-
-	// From the Submarine cluster nodes connections, build the cluster status
-	// Calculate the actual cluster status through node information, cluster Pod list, and CR
-	// The cluster status includes: whether it is normal, the number of Ready Pods, the number of Masters,
-	// the number of Submarine instances in operation, the list of Submarine instances, replication factors, etc.
-	clusterStatus, err := c.buildClusterStatus(clusterInfos, submarineClusterPods)
-	if err != nil {
-		glog.Errorf("unable to build the SubmarineClusterStatus, err:%v", err)
-		return forceRequeue, fmt.Errorf("unable to build clusterStatus, err:%v", err)
-	}
-
-	// If the cluster status (Status.Cluster) in the CR does not match the actual situation, update
-	updated, err := c.updateClusterIfNeed(submarineCluster, clusterStatus)
-	if err != nil {
-		return forceRequeue, err
-	}
-	if updated {
-		// If the cluster status changes requeue the key. Because we want to apply Submarine Cluster operation only on stable cluster,
-		// already stored in the API server.
-		glog.V(3).Infof("cluster updated %s-%s", submarineCluster.Namespace, submarineCluster.Name)
-		forceRequeue = true
-		return forceRequeue, nil
-	}
-
-	// If the CR state matches the actual state of the Submarine cluster, then check if reconciliation is required-let the actual state match the expected state
-	allPodsNotReady := true
-	if (clusterStatus.NbPods - clusterStatus.NbSubmarineRunning) != 0 {
-		glog.V(3).Infof("All pods not ready wait to be ready, nbPods: %d, nbPodsReady: %d", clusterStatus.NbPods, clusterStatus.NbSubmarineRunning)
-		allPodsNotReady = false
-	}
-
-	// Now check if the Operator need to execute some operation the submarine cluster. if yes run the clusterAction(...) method.
-	needSanitize, err := c.checkSanityCheck(submarineCluster, admin, clusterInfos)
-	if err != nil {
-		glog.Errorf("checkSanityCheck, error happened in dryrun mode, err:%v", err)
-		return false, err
-	}
-
-	// If all Pods are not ready and need rolling updates (Pod and PodTemplate do not match), more or fewer Pods are needed,
-	// or the number of master nodes and replication factor are incorrect
-	// Or, need to perform "clean up"
-	// Then, perform Submarine cluster management operations to approximate the expected state and update the status of SubmarineCluster
-	if (allPodsNotReady && needClusterOperation(submarineCluster)) || needSanitize {
-		var requeue bool
-		forceRequeue = false
-		// Perform cluster management operations, including creating / deleting pods and configuring Submarine
-		requeue, err = c.clusterAction(admin, submarineCluster, clusterInfos)
-		if err != nil {
-			glog.Errorf("error during action on cluster: %s-%s, err: %v", submarineCluster.Namespace, submarineCluster.Name, err)
-		} else if requeue {
-			forceRequeue = true
-		}
-		_, err = c.updateSubmarineCluster(submarineCluster)
-		return forceRequeue, err
-	}
-
-	// Reset all conditions and reconcile
-	if setRebalancingCondition(&submarineCluster.Status, false) ||
-		setRollingUpdateCondition(&submarineCluster.Status, false) ||
-		setScalingCondition(&submarineCluster.Status, false) ||
-		setClusterStatusCondition(&submarineCluster.Status, true) {
-		_, err = c.updateHandler(submarineCluster)
-		return forceRequeue, err
-	}
-
-	return false, nil
-}
-
-func (c *Controller) onAddSubmarineCluster(obj interface{}) {
-	glog.Infof("onAddSubmarineCluster(%v)", obj)
-	submarineCluster, ok := obj.(*rapi.SubmarineCluster)
-	if !ok {
-		glog.Errorf("adding SubmarineCluster, expected SubmarineCluster object. Got: %+v", obj)
-		return
-	}
-	glog.V(6).Infof("onAddSubmarineCluster %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-	if !reflect.DeepEqual(submarineCluster.Status, rapi.SubmarineClusterStatus{}) {
-		glog.Errorf("submarinecluster %s/%s created with non empty status. Going to be removed", submarineCluster.Namespace, submarineCluster.Name)
-
-		if _, err := cache.MetaNamespaceKeyFunc(submarineCluster); err != nil {
-			glog.Errorf("couldn't get key for SubmarineCluster (to be deleted) %s/%s: %v", submarineCluster.Namespace, submarineCluster.Name, err)
-			return
-		}
-		// TODO: how to remove a submarineCluster created with an invalid or even with a valid status. What in case of error for this delete?
-		if err := c.deleteSubmarineCluster(submarineCluster.Namespace, submarineCluster.Name); err != nil {
-			glog.Errorf("unable to delete non empty status SubmarineCluster %s/%s: %v. No retry will be performed.", submarineCluster.Namespace, submarineCluster.Name, err)
-		}
-
-		return
-	}
-
-	c.enqueue(submarineCluster)
-}
-
-func (c *Controller) onDeleteSubmarineCluster(obj interface{}) {
-	glog.Infof("onDeleteSubmarineCluster(%v)", obj)
-}
-
-func (c *Controller) onUpdateSubmarineCluster(oldObj, newObj interface{}) {
-	glog.Infof("onUpdateSubmarineCluster(%v, %v)", oldObj, newObj)
-
-	submarineCluster, ok := newObj.(*rapi.SubmarineCluster)
-	if !ok {
-		glog.Errorf("Expected SubmarineCluster object. Got: %+v", newObj)
-		return
-	}
-	glog.V(6).Infof("onUpdateSubmarineCluster %s/%s", submarineCluster.Namespace, submarineCluster.Name)
-	c.enqueue(submarineCluster)
-}
-
-func (c *Controller) onAddPod(obj interface{}) {
-	glog.Infof("onAddPod()")
-	pod, ok := obj.(*apiv1.Pod)
-	if !ok {
-		glog.Errorf("adding Pod, expected Pod object. Got: %+v", obj)
-		return
-	}
-	if _, ok := pod.GetObjectMeta().GetLabels()[rapi.ClusterNameLabelKey]; !ok {
-		return
-	}
-	submarineCluster, err := c.getSubmarineClusterFromPod(pod)
-	if err != nil {
-		glog.Errorf("unable to retrieve the associated submarinecluster for pod %s/%s:%v", pod.Namespace, pod.Name, err)
-		return
-	}
-	if submarineCluster == nil {
-		glog.Errorf("empty submarineCluster. Unable to retrieve the associated submarinecluster for the pod  %s/%s", pod.Namespace, pod.Name)
-		return
-	}
-
-	c.enqueue(submarineCluster)
-}
-
-func (c *Controller) onUpdatePod(oldObj, newObj interface{}) {
-	glog.Infof("onUpdatePod()")
-	oldPod := oldObj.(*apiv1.Pod)
-	newPod := newObj.(*apiv1.Pod)
-	if oldPod.ResourceVersion == newPod.ResourceVersion { // Since periodic resync will send update events for all known Pods.
-		return
-	}
-	if _, ok := newPod.GetObjectMeta().GetLabels()[rapi.ClusterNameLabelKey]; !ok {
-		return
-	}
-	glog.V(6).Infof("onUpdatePod old=%v, cur=%v ", oldPod.Name, newPod.Name)
-	submarineCluster, err := c.getSubmarineClusterFromPod(newPod)
-	if err != nil {
-		glog.Errorf("SubmarineCluster-Operator.onUpdateJob cannot get submarineclusters for Pod %s/%s: %v", newPod.Namespace, newPod.Name, err)
-		return
-	}
-	if submarineCluster == nil {
-		glog.Errorf("empty submarineCluster .onUpdateJob cannot get submarineclusters for Pod %s/%s", newPod.Namespace, newPod.Name)
-		return
-	}
-
-	c.enqueue(submarineCluster)
-
-	// TODO: in case of relabelling ?
-	// TODO: in case of labelSelector relabelling?
-}
-
-func (c *Controller) onDeletePod(obj interface{}) {
-	glog.Infof("onDeletePod()")
-	pod, ok := obj.(*apiv1.Pod)
-	if _, ok := pod.GetObjectMeta().GetLabels()[rapi.ClusterNameLabelKey]; !ok {
-		return
-	}
-	glog.V(6).Infof("onDeletePod old=%v", pod.Name)
-	if !ok {
-		tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
-		if !ok {
-			glog.Errorf("Couldn't get object from tombstone %+v", obj)
-			return
-		}
-		pod, ok = tombstone.Obj.(*apiv1.Pod)
-		if !ok {
-			glog.Errorf("Tombstone contained object that is not a pod %+v", obj)
-			return
-		}
-	}
-
-	submarineCluster, err := c.getSubmarineClusterFromPod(pod)
-	if err != nil {
-		glog.Errorf("SubmarineCluster-Operator.onDeletePod: %v", err)
-		return
-	}
-	if submarineCluster == nil {
-		glog.Errorf("empty submarineCluster . SubmarineCluster-Operator.onDeletePod")
-		return
-	}
-
-	c.enqueue(submarineCluster)
-}
-
-func (c *Controller) updateSubmarineCluster(submarineCluster *rapi.SubmarineCluster) (*rapi.SubmarineCluster, error) {
-	rc, err := c.submarineClient.SubmarineV1alpha1().SubmarineClusters(submarineCluster.Namespace).Update(submarineCluster)
-	if err != nil {
-		glog.Errorf("updateSubmarineCluster cluster: [%v] error: %v", *submarineCluster, err)
-		return rc, err
-	}
-
-	glog.V(6).Infof("SubmarineCluster %s/%s updated", submarineCluster.Namespace, submarineCluster.Name)
-	return rc, nil
-}
-
-// enqueue adds key in the controller queue
-func (c *Controller) enqueue(submarinecluster *rapi.SubmarineCluster) {
-	key, err := cache.MetaNamespaceKeyFunc(submarinecluster)
-	if err != nil {
-		glog.Errorf("SubmarineCluster-Controller:enqueue: couldn't get key for SubmarineCluster %s/%s: %v", submarinecluster.Namespace, submarinecluster.Name, err)
-		return
-	}
-	c.queue.Add(key)
-}
-
-func (c *Controller) getSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) (*apiv1.Service, error) {
-	serviceName := getServiceName(submarineCluster)
-	labels, err := pod.GetLabelsSet(submarineCluster)
-	if err != nil {
-		return nil, fmt.Errorf("couldn't get cluster label, err: %v ", err)
-	}
-
-	svcList, err := c.serviceLister.Services(submarineCluster.Namespace).List(labels.AsSelector())
-	if err != nil {
-		return nil, fmt.Errorf("couldn't list service with label:%s, err:%v ", labels.String(), err)
-	}
-	var svc *apiv1.Service
-	for i, s := range svcList {
-		if s.Name == serviceName {
-			svc = svcList[i]
-		}
-	}
-	return svc, nil
-}
-
-func (c *Controller) getSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) (*policyv1.PodDisruptionBudget, error) {
-	podDisruptionBudgetName := submarineCluster.Name
-	labels, err := pod.GetLabelsSet(submarineCluster)
-	if err != nil {
-		return nil, fmt.Errorf("couldn't get cluster label, err: %v ", err)
-	}
-
-	pdbList, err := c.podDisruptionBudgetLister.PodDisruptionBudgets(submarineCluster.Namespace).List(labels.AsSelector())
-	if err != nil {
-		return nil, fmt.Errorf("couldn't list PodDisruptionBudget with label:%s, err:%v ", labels.String(), err)
-	}
-	var pdb *policyv1.PodDisruptionBudget
-	for i, p := range pdbList {
-		if p.Name == podDisruptionBudgetName {
-			pdb = pdbList[i]
-		}
-	}
-	return pdb, nil
-}
-
-func (c *Controller) buildClusterStatus(clusterInfos *submarine.ClusterInfos, pods []*apiv1.Pod) (*rapi.SubmarineClusterClusterStatus, error) {
-	clusterStatus := &rapi.SubmarineClusterClusterStatus{}
-	clusterStatus.NbPodsReady = 0
-	clusterStatus.NbSubmarineRunning = 0
-	clusterStatus.MaxReplicationFactor = 0
-	clusterStatus.MinReplicationFactor = 0
-
-	clusterStatus.NbPods = int32(len(pods))
-	var nbSubmarineRunning, nbPodsReady int32
-
-	nbMaster := int32(0)
-	nbSlaveByMaster := map[string]int{}
-
-	for _, pod := range pods {
-		if podready, _ := IsPodReady(pod); podready {
-			nbPodsReady++
-		}
-
-		newNode := rapi.SubmarineClusterNode{
-			PodName: pod.Name,
-			IP:      pod.Status.PodIP,
-			Pod:     pod,
-			Slots:   []string{},
-		}
-		// find corresponding Submarine node
-		submarineNodes, err := clusterInfos.GetNodes().GetNodesByFunc(func(node *submarine.Node) bool {
-			return node.IP == pod.Status.PodIP
-		})
-		if err != nil {
-			glog.Errorf("Unable to retrieve the associated Submarine Node with the pod: %s, ip:%s, err:%v", pod.Name, pod.Status.PodIP, err)
-			continue
-		}
-		if len(submarineNodes) == 1 {
-			submarineNode := submarineNodes[0]
-			if submarine.IsMasterWithSlot(submarineNode) {
-				if _, ok := nbSlaveByMaster[submarineNode.ID]; !ok {
-					nbSlaveByMaster[submarineNode.ID] = 0
-				}
-				nbMaster++
-			}
-
-			newNode.ID = submarineNode.ID
-			newNode.Role = submarineNode.GetRole()
-			newNode.Port = submarineNode.Port
-			newNode.Slots = []string{}
-			if submarine.IsSlave(submarineNode) && submarineNode.MasterReferent != "" {
-				nbSlaveByMaster[submarineNode.MasterReferent] = nbSlaveByMaster[submarineNode.MasterReferent] + 1
-				newNode.MasterRef = submarineNode.MasterReferent
-			}
-			///if len(submarineNode.Slots) > 0 {
-			///	slots := submarine.SlotRangesFromSlots(submarineNode.Slots)
-			///	for _, slot := range slots {
-			///		newNode.Slots = append(newNode.Slots, slot.String())
-			///	}
-			///}
-			nbSubmarineRunning++
-		}
-		clusterStatus.Nodes = append(clusterStatus.Nodes, newNode)
-	}
-	clusterStatus.NbSubmarineRunning = nbSubmarineRunning
-	clusterStatus.NumberOfMaster = nbMaster
-	clusterStatus.NbPodsReady = nbPodsReady
-	clusterStatus.Status = rapi.ClusterStatusOK
-
-	minReplicationFactor := math.MaxInt32
-	maxReplicationFactor := 0
-	for _, counter := range nbSlaveByMaster {
-		if counter > maxReplicationFactor {
-			maxReplicationFactor = counter
-		}
-		if counter < minReplicationFactor {
-			minReplicationFactor = counter
-		}
-	}
-	if len(nbSlaveByMaster) == 0 {
-		minReplicationFactor = 0
-	}
-	clusterStatus.MaxReplicationFactor = int32(maxReplicationFactor)
-	clusterStatus.MinReplicationFactor = int32(minReplicationFactor)
-
-	glog.V(3).Infof("Build Bom, current Node list : %s ", clusterStatus.String())
-
-	return clusterStatus, nil
-}
-
-func (c *Controller) updateClusterIfNeed(cluster *rapi.SubmarineCluster, newStatus *rapi.SubmarineClusterClusterStatus) (bool, error) {
-	if compareStatus(&cluster.Status.Cluster, newStatus) {
-		glog.V(3).Infof("Status changed for cluster: %s-%s", cluster.Namespace, cluster.Name)
-		// the status have been update, needs to update the SubmarineCluster
-		cluster.Status.Cluster = *newStatus
-		_, err := c.updateSubmarineCluster(cluster)
-		return true, err
-	}
-	// TODO improve this by checking properly the kapi.Pod informations inside each Node
-	cluster.Status.Cluster.Nodes = newStatus.Nodes
-	return false, nil
-}
-
-func (c *Controller) checkSanityCheck(cluster *rapi.SubmarineCluster, admin submarine.AdminInterface, infos *submarine.ClusterInfos) (bool, error) {
-	return sanitycheck.RunSanityChecks(admin, &c.config.submarine, c.podControl, cluster, infos, true)
-}
-
-func (c *Controller) deleteSubmarineCluster(namespace, name string) error {
-	return nil
-}
-
-func (c *Controller) getSubmarineClusterFromPod(pod *apiv1.Pod) (*rapi.SubmarineCluster, error) {
-	if len(pod.Labels) == 0 {
-		return nil, fmt.Errorf("no submarineCluster found for pod. Pod %s/%s has no labels", pod.Namespace, pod.Name)
-	}
-
-	clusterName, ok := pod.Labels[rapi.ClusterNameLabelKey]
-	if !ok {
-		return nil, fmt.Errorf("no submarineCluster name found for pod. Pod %s/%s has no labels %s", pod.Namespace, pod.Name, rapi.ClusterNameLabelKey)
-	}
-	return c.submarineClusterLister.SubmarineClusters(pod.Namespace).Get(clusterName)
-}
diff --git a/submarine-cloud/pkg/controller/pod/control.go b/submarine-cloud/pkg/controller/pod/control.go
deleted file mode 100644
index 6c89d6e..0000000
--- a/submarine-cloud/pkg/controller/pod/control.go
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 pod
-
-import (
-	"bytes"
-	"crypto/md5"
-	"encoding/hex"
-	"encoding/json"
-	"fmt"
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/golang/glog"
-	"io"
-	kapiv1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	clientset "k8s.io/client-go/kubernetes"
-	corev1listers "k8s.io/client-go/listers/core/v1"
-	"k8s.io/client-go/tools/record"
-)
-
-// SubmarineClusterControlInterface interface for the SubmarineClusterPodControl
-type SubmarineClusterControlInterface interface {
-	// GetSubmarineClusterPods return list of Pod attached to a SubmarineCluster
-	GetSubmarineClusterPods(submarineCluster *rapi.SubmarineCluster) ([]*kapiv1.Pod, error)
-	// CreatePod used to create a Pod from the SubmarineCluster pod template
-	CreatePod(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Pod, error)
-	// DeletePod used to delete a pod from its name
-	DeletePod(submarineCluster *rapi.SubmarineCluster, podName string) error
-	// DeletePodNow used to delete now (force) a pod from its name
-	DeletePodNow(submarineCluster *rapi.SubmarineCluster, podName string) error
-}
-
-// SubmarineClusterControl contains requires accessor to managing the SubmarineCluster pods
-type SubmarineClusterControl struct {
-	PodLister  corev1listers.PodLister
-	KubeClient clientset.Interface
-	Recorder   record.EventRecorder
-}
-
-// NewSubmarineClusterControl builds and returns new NewSubmarineClusterControl instance
-func NewSubmarineClusterControl(lister corev1listers.PodLister, client clientset.Interface, rec record.EventRecorder) *SubmarineClusterControl {
-	glog.Infof("NewSubmarineClusterControl()")
-	ctrl := &SubmarineClusterControl{
-		PodLister:  lister,
-		KubeClient: client,
-		Recorder:   rec,
-	}
-	return ctrl
-}
-
-// GetSubmarineClusterPods return list of Pod attached to a SubmarineCluster
-func (p *SubmarineClusterControl) GetSubmarineClusterPods(submarineCluster *rapi.SubmarineCluster) ([]*kapiv1.Pod, error) {
-	glog.Infof("GetSubmarineClusterPods()")
-	selector, err := CreateSubmarineClusterLabelSelector(submarineCluster)
-	if err != nil {
-		return nil, err
-	}
-	return p.PodLister.Pods(submarineCluster.Namespace).List(selector)
-}
-
-// CreatePod used to create a Pod from the SubmarineCluster pod template
-func (p *SubmarineClusterControl) CreatePod(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Pod, error) {
-	glog.Infof("CreatePod()")
-	pod, err := initPod(submarineCluster)
-	if err != nil {
-		return pod, err
-	}
-	glog.V(6).Infof("CreatePod: %s/%s", submarineCluster.Namespace, pod.Name)
-	return p.KubeClient.CoreV1().Pods(submarineCluster.Namespace).Create(pod)
-}
-
-// DeletePod used to delete a pod from its name
-func (p *SubmarineClusterControl) DeletePod(submarineCluster *rapi.SubmarineCluster, podName string) error {
-	glog.V(6).Infof("DeletePod: %s/%s", submarineCluster.Namespace, podName)
-	return p.deletePodGracefullperiode(submarineCluster, podName, nil)
-}
-
-// DeletePodNow used to delete now (force) a pod from its name
-func (p *SubmarineClusterControl) DeletePodNow(submarineCluster *rapi.SubmarineCluster, podName string) error {
-	glog.V(6).Infof("DeletePod: %s/%s", submarineCluster.Namespace, podName)
-	now := int64(0)
-	return p.deletePodGracefullperiode(submarineCluster, podName, &now)
-}
-
-// DeletePodNow used to delete now (force) a pod from its name
-func (p *SubmarineClusterControl) deletePodGracefullperiode(submarineCluster *rapi.SubmarineCluster, podName string, period *int64) error {
-	glog.Infof("deletePodGracefullperiode()")
-	return p.KubeClient.CoreV1().Pods(submarineCluster.Namespace).Delete(podName, &metav1.DeleteOptions{GracePeriodSeconds: period})
-}
-
-// GenerateMD5Spec used to generate the PodSpec MD5 hash
-func GenerateMD5Spec(spec *kapiv1.PodSpec) (string, error) {
-	b, err := json.Marshal(spec)
-	if err != nil {
-		return "", err
-	}
-	hash := md5.New()
-	io.Copy(hash, bytes.NewReader(b))
-	return hex.EncodeToString(hash.Sum(nil)), nil
-}
-
-// Add the necessary tags to the Pod. These tags are used to determine whether a Pod is managed by the Operator and associated with a SubmarineCluster
-func initPod(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Pod, error) {
-	if submarineCluster == nil {
-		return nil, fmt.Errorf("submarinecluster nil pointer")
-	}
-
-	desiredLabels, err := GetLabelsSet(submarineCluster)
-	if err != nil {
-		return nil, err
-	}
-	desiredAnnotations, err := GetAnnotationsSet(submarineCluster)
-	if err != nil {
-		return nil, err
-	}
-	PodName := fmt.Sprintf("submarinecluster-%s-", submarineCluster.Name)
-	pod := &kapiv1.Pod{
-		ObjectMeta: metav1.ObjectMeta{
-			Namespace:       submarineCluster.Namespace,
-			Labels:          desiredLabels,
-			Annotations:     desiredAnnotations,
-			GenerateName:    PodName,
-			OwnerReferences: []metav1.OwnerReference{BuildOwnerReference(submarineCluster)},
-		},
-	}
-
-	if submarineCluster.Spec.PodTemplate == nil {
-		return nil, fmt.Errorf("submarinecluster[%s/%s] PodTemplate missing", submarineCluster.Namespace, submarineCluster.Name)
-	}
-	pod.Spec = *submarineCluster.Spec.PodTemplate.Spec.DeepCopy()
-
-	// Generate a MD5 representing the PodSpec send
-	hash, err := GenerateMD5Spec(&pod.Spec)
-	if err != nil {
-		return nil, err
-	}
-	pod.Annotations[rapi.PodSpecMD5LabelKey] = hash
-
-	return pod, nil
-}
-
-// BuildOwnerReference used to build the OwnerReference from a SubmarineCluster
-func BuildOwnerReference(cluster *rapi.SubmarineCluster) metav1.OwnerReference {
-	controllerRef := metav1.OwnerReference{
-		APIVersion: rapi.SchemeGroupVersion.String(),
-		Kind:       rapi.ResourceKind,
-		Name:       cluster.Name,
-		UID:        cluster.UID,
-		Controller: boolPtr(true),
-	}
-
-	return controllerRef
-}
-
-func boolPtr(value bool) *bool {
-	return &value
-}
diff --git a/submarine-cloud/pkg/controller/pod/utils.go b/submarine-cloud/pkg/controller/pod/utils.go
deleted file mode 100644
index 843ecf4..0000000
--- a/submarine-cloud/pkg/controller/pod/utils.go
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 pod
-
-import (
-	"fmt"
-	"k8s.io/apimachinery/pkg/labels"
-
-	sapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-)
-
-// GetLabelsSet return labels associated to the submarine-node pods
-func GetLabelsSet(submarineCluster *sapi.SubmarineCluster) (labels.Set, error) {
-	desiredLabels := labels.Set{}
-	if submarineCluster == nil {
-		return desiredLabels, fmt.Errorf("submarineCluster nil pointer")
-	}
-	if submarineCluster.Spec.AdditionalLabels != nil {
-		desiredLabels = submarineCluster.Spec.AdditionalLabels
-	}
-	if submarineCluster.Spec.PodTemplate != nil {
-		for k, v := range submarineCluster.Spec.PodTemplate.Labels {
-			desiredLabels[k] = v
-		}
-	}
-	desiredLabels[sapi.ClusterNameLabelKey] = submarineCluster.Name // add submarineCluster name to the Pod labels
-	return desiredLabels, nil
-}
-
-// CreateSubmarineClusterLabelSelector creates label selector to select the jobs related to a submarineCluster, stepName
-func CreateSubmarineClusterLabelSelector(submarineCluster *sapi.SubmarineCluster) (labels.Selector, error) {
-	set, err := GetLabelsSet(submarineCluster)
-	if err != nil {
-		return nil, err
-	}
-	return labels.SelectorFromSet(set), nil
-}
-
-// GetAnnotationsSet return a labels.Set of annotation from the SubmarineCluster
-func GetAnnotationsSet(submarineCluster *sapi.SubmarineCluster) (labels.Set, error) {
-	desiredAnnotations := make(labels.Set)
-	for k, v := range submarineCluster.Annotations {
-		desiredAnnotations[k] = v
-	}
-
-	// TODO: add createdByRef
-	return desiredAnnotations, nil // no error for the moment, when we'll add createdByRef an error could be returned
-}
diff --git a/submarine-cloud/pkg/controller/poddisruptionbudgets_control.go b/submarine-cloud/pkg/controller/poddisruptionbudgets_control.go
deleted file mode 100644
index 776c7cf..0000000
--- a/submarine-cloud/pkg/controller/poddisruptionbudgets_control.go
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	policyv1 "k8s.io/api/policy/v1beta1"
-	clientset "k8s.io/client-go/kubernetes"
-	"k8s.io/client-go/tools/record"
-)
-
-// PodDisruptionBudgetsControlInterface interface for the PodDisruptionBudgetsControl
-type PodDisruptionBudgetsControlInterface interface {
-	// CreateSubmarineClusterPodDisruptionBudget used to create the Kubernetes PodDisruptionBudget needed to access the Submarine Cluster
-	CreateSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) (*policyv1.PodDisruptionBudget, error)
-	// DeleteSubmarineClusterPodDisruptionBudget used to delete the Kubernetes PodDisruptionBudget linked to the Submarine Cluster
-	DeleteSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) error
-	// GetSubmarineClusterPodDisruptionBudget used to retrieve the Kubernetes PodDisruptionBudget associated to the SubmarineCluster
-	GetSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) (*policyv1.PodDisruptionBudget, error)
-}
-
-// PodDisruptionBudgetsControl contains all information for managing Kube PodDisruptionBudgets
-type PodDisruptionBudgetsControl struct {
-	KubeClient clientset.Interface
-	Recorder   record.EventRecorder
-}
-
-// NewPodDisruptionBudgetsControl builds and returns new PodDisruptionBudgetsControl instance
-func NewPodDisruptionBudgetsControl(client clientset.Interface, rec record.EventRecorder) *PodDisruptionBudgetsControl {
-	ctrl := &PodDisruptionBudgetsControl{
-		KubeClient: client,
-		Recorder:   rec,
-	}
-
-	return ctrl
-}
-
-// GetSubmarineClusterPodDisruptionBudget used to retrieve the Kubernetes PodDisruptionBudget associated to the SubmarineCluster
-func (s *PodDisruptionBudgetsControl) GetSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) (*policyv1.PodDisruptionBudget, error) {
-	return nil, nil
-}
-
-// DeleteSubmarineClusterPodDisruptionBudget used to delete the Kubernetes PodDisruptionBudget linked to the Submarine Cluster
-func (s *PodDisruptionBudgetsControl) DeleteSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) error {
-	return nil
-}
-
-// CreateSubmarineClusterPodDisruptionBudget used to create the Kubernetes PodDisruptionBudget needed to access the Submarine Cluster
-func (s *PodDisruptionBudgetsControl) CreateSubmarineClusterPodDisruptionBudget(submarineCluster *rapi.SubmarineCluster) (*policyv1.PodDisruptionBudget, error) {
-
-	return nil, nil
-}
diff --git a/submarine-cloud/pkg/controller/sanitycheck/process.go b/submarine-cloud/pkg/controller/sanitycheck/process.go
deleted file mode 100644
index 963bbd9..0000000
--- a/submarine-cloud/pkg/controller/sanitycheck/process.go
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 sanitycheck
-
-import (
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/apache/submarine/submarine-cloud/pkg/config"
-	"github.com/apache/submarine/submarine-cloud/pkg/controller/pod"
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-)
-
-// RunSanityChecks function used to run all the sanity check on the current cluster
-// Return actionDone = true if a modification has been made on the cluster
-func RunSanityChecks(admin submarine.AdminInterface, config *config.Submarine, podControl pod.SubmarineClusterControlInterface, cluster *rapi.SubmarineCluster, infos *submarine.ClusterInfos, dryRun bool) (actionDone bool, err error) {
-	/*
-		// * fix failed nodes: in some cases (cluster without enough master after crash or scale down), some nodes may still know about fail nodes
-		if actionDone, err = FixFailedNodes(admin, cluster, infos, dryRun); err != nil {
-			return actionDone, err
-		} else if actionDone {
-			glog.V(2).Infof("FixFailedNodes done an action on the cluster (dryRun:%v)", dryRun)
-			return actionDone, nil
-		}
-
-		// forget nodes and delete pods when a submarine node is untrusted.
-		if actionDone, err = FixUntrustedNodes(admin, podControl, cluster, infos, dryRun); err != nil {
-			return actionDone, err
-		} else if actionDone {
-			glog.V(2).Infof("FixUntrustedNodes done an action on the cluster (dryRun:%v)", dryRun)
-			return actionDone, nil
-		}
-
-		// forget nodes and delete pods when a submarine node is untrusted.
-		if actionDone, err = FixTerminatingPods(cluster, podControl, 5*time.Minute, dryRun); err != nil {
-			return actionDone, err
-		} else if actionDone {
-			glog.V(2).Infof("FixTerminatingPods done an action on the cluster (dryRun:%v)", dryRun)
-			return actionDone, nil
-		}
-
-		// forget nodes and delete pods when a submarine node is untrusted.
-		if actionDone, err = FixClusterSplit(admin, config, infos, dryRun); err != nil {
-			return actionDone, err
-		} else if actionDone {
-			glog.V(2).Infof("FixClusterSplit done an action on the cluster (dryRun:%v)", dryRun)
-			return actionDone, nil
-		}*/
-
-	return true, nil ///actionDone, err
-}
diff --git a/submarine-cloud/pkg/controller/services_control.go b/submarine-cloud/pkg/controller/services_control.go
deleted file mode 100644
index 2354b12..0000000
--- a/submarine-cloud/pkg/controller/services_control.go
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	rapi "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	"github.com/golang/glog"
-	kapiv1 "k8s.io/api/core/v1"
-	clientset "k8s.io/client-go/kubernetes"
-	"k8s.io/client-go/tools/record"
-)
-
-// ServicesControlInterface interface for the ServicesControl
-type ServicesControlInterface interface {
-	// CreateSubmarineClusterService used to create the Kubernetes Service needed to access the Submarine Cluster
-	CreateSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Service, error)
-	// DeleteSubmarineClusterService used to delete the Kubernetes Service linked to the Submarine Cluster
-	DeleteSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) error
-	// GetSubmarineClusterService used to retrieve the Kubernetes Service associated to the SubmarineCluster
-	GetSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Service, error)
-}
-
-// ServicesControl contains all information for managing Kube Services
-type ServicesControl struct {
-	KubeClient clientset.Interface
-	Recorder   record.EventRecorder
-}
-
-// NewServicesControl builds and returns new ServicesControl instance
-func NewServicesControl(client clientset.Interface, rec record.EventRecorder) *ServicesControl {
-	glog.Infof("NewServicesControl()")
-	ctrl := &ServicesControl{
-		KubeClient: client,
-		Recorder:   rec,
-	}
-
-	return ctrl
-}
-
-// GetSubmarineClusterService used to retrieve the Kubernetes Service associated to the SubmarineCluster
-func (s *ServicesControl) GetSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Service, error) {
-	glog.Infof("GetSubmarineClusterService()")
-	return nil, nil
-}
-
-// CreateSubmarineClusterService used to create the Kubernetes Service needed to access the Submarine Cluster
-func (s *ServicesControl) CreateSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) (*kapiv1.Service, error) {
-	glog.Infof("CreateSubmarineClusterService()")
-	return nil, nil
-}
-
-// DeleteSubmarineClusterService used to delete the Kubernetes Service linked to the Submarine Cluster
-func (s *ServicesControl) DeleteSubmarineClusterService(submarineCluster *rapi.SubmarineCluster) error {
-	glog.Infof("DeleteSubmarineClusterService()")
-	return nil
-}
-
-func getServiceName(submarineCluster *rapi.SubmarineCluster) string {
-	serviceName := submarineCluster.Name
-	if submarineCluster.Spec.ServiceName != "" {
-		serviceName = submarineCluster.Spec.ServiceName
-	}
-	return serviceName
-}
diff --git a/submarine-cloud/pkg/controller/utils.go b/submarine-cloud/pkg/controller/utils.go
deleted file mode 100644
index 8d9eaa1..0000000
--- a/submarine-cloud/pkg/controller/utils.go
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 controller
-
-import (
-	"errors"
-	"fmt"
-	"github.com/golang/glog"
-	apiv1 "k8s.io/api/core/v1"
-	"net"
-	"time"
-
-	"github.com/apache/submarine/submarine-cloud/pkg/config"
-	"github.com/apache/submarine/submarine-cloud/pkg/submarine"
-)
-
-// NewSubmarineAdmin builds and returns new submarine.Admin from the list of pods
-func NewSubmarineAdmin(pods []*apiv1.Pod, cfg *config.Submarine) (submarine.AdminInterface, error) {
-	nodesAddrs := []string{}
-	for _, pod := range pods {
-		submarinePort := submarine.DefaultSubmarinePort
-		glog.Info("pod = %v", pod)
-		for _, container := range pod.Spec.Containers {
-			if container.Name == "submarine-node" {
-				for _, port := range container.Ports {
-					if port.Name == "submarine" {
-						submarinePort = fmt.Sprintf("%d", port.ContainerPort)
-					}
-				}
-			}
-		}
-		nodesAddrs = append(nodesAddrs, net.JoinHostPort(pod.Status.PodIP, submarinePort))
-	}
-	adminConfig := submarine.AdminOptions{
-		ConnectionTimeout:  time.Duration(cfg.DialTimeout) * time.Millisecond,
-		RenameCommandsFile: cfg.GetRenameCommandsFile(),
-	}
-
-	return submarine.NewAdmin(nodesAddrs, &adminConfig), nil
-}
-
-// IsPodReady check if pod is in ready condition, return the error message otherwise
-func IsPodReady(pod *apiv1.Pod) (bool, error) {
-	if pod == nil {
-		return false, errors.New("No Pod")
-	}
-
-	// get ready condition
-	var readycondition apiv1.PodCondition
-	found := false
-	for _, cond := range pod.Status.Conditions {
-		if cond.Type == apiv1.PodReady {
-			readycondition = cond
-			found = true
-			break
-		}
-	}
-
-	if !found {
-		return false, errors.New("Cound't find ready condition")
-	}
-
-	if readycondition.Status != apiv1.ConditionTrue {
-		return false, errors.New(readycondition.Message)
-	}
-
-	return true, nil
-}
diff --git a/submarine-cloud/pkg/operator/config.go b/submarine-cloud/pkg/operator/config.go
deleted file mode 100644
index 7caec95..0000000
--- a/submarine-cloud/pkg/operator/config.go
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 operator
-
-import (
-	"github.com/apache/submarine/submarine-cloud/pkg/config"
-	"github.com/spf13/pflag"
-)
-
-// Config contains configuration for submarine-operator
-type Config struct {
-	KubeConfigFile string
-	Master         string
-	ListenAddr     string
-	Submarine      config.Submarine
-}
-
-// NewSubmarineOperatorConfig builds and returns a submarine-operator Config
-func NewSubmarineOperatorConfig() *Config {
-	return &Config{}
-}
-
-// AddFlags add cobra flags to populate Config
-func (c *Config) AddFlags(fs *pflag.FlagSet) {
-	fs.StringVar(&c.KubeConfigFile, "kubeconfig", c.KubeConfigFile, "Location of kubecfg file for access to kubernetes master service")
-	fs.StringVar(&c.Master, "master", c.Master, "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
-	fs.StringVar(&c.ListenAddr, "addr", "0.0.0.0:8080", "listen address of the http server which serves kubernetes probes and prometheus endpoints")
-	c.Submarine.AddFlags(fs)
-}
diff --git a/submarine-cloud/pkg/operator/operator.go b/submarine-cloud/pkg/operator/operator.go
deleted file mode 100644
index 67fb3a3..0000000
--- a/submarine-cloud/pkg/operator/operator.go
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 operator
-
-import (
-	"context"
-	"fmt"
-	"github.com/apache/submarine/submarine-cloud/pkg/client"
-	"github.com/apache/submarine/submarine-cloud/pkg/controller"
-	"github.com/heptiolabs/healthcheck"
-	apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
-	"k8s.io/client-go/rest"
-	"k8s.io/client-go/tools/clientcmd"
-	"net/http"
-	"time"
-
-	submarineInformers "github.com/apache/submarine/submarine-cloud/pkg/client/informers/externalversions"
-	kubeinformers "k8s.io/client-go/informers"
-	clientset "k8s.io/client-go/kubernetes"
-
-	"github.com/golang/glog"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
-)
-
-// Controller is the controller implementation for Student resources
-type SubmarineOperator struct {
-	kubeInformerFactory      kubeinformers.SharedInformerFactory
-	submarineInformerFactory submarineInformers.SharedInformerFactory
-	controller               *controller.Controller
-	// Kubernetes Probes handler
-	health     healthcheck.Handler
-	httpServer *http.Server
-}
-
-func NewSubmarineOperator(cfg *Config) *SubmarineOperator {
-	kubeConfig, err := initKubeConfig(cfg)
-	if err != nil {
-		glog.Fatalf("Unable to init submarinecluster controller: %v", err)
-	}
-
-	extClient, err := apiextensionsclient.NewForConfig(kubeConfig)
-	if err != nil {
-		glog.Fatalf("Unable to init submarineClientset from kubeconfig:%v", err)
-	}
-	_, err = client.DefineSubmarineClusterResource(extClient)
-	if err != nil && !apierrors.IsAlreadyExists(err) {
-		glog.Fatalf("Unable to define SubmarineCluster resource:%v", err)
-	}
-
-	kubeClient, err := clientset.NewForConfig(kubeConfig)
-	if err != nil {
-		glog.Fatalf("Unable to initialize kubeClient:%v", err)
-	}
-
-	submarineClient, err := client.NewClient(kubeConfig)
-	if err != nil {
-		glog.Fatalf("Unable to init submarine.submarinClientset from kubeconfig:%v", err)
-	}
-
-	kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30)
-	submarineInformerFactory := submarineInformers.NewSharedInformerFactory(submarineClient, time.Second*30)
-	op := &SubmarineOperator{
-		kubeInformerFactory:      kubeInformerFactory,
-		submarineInformerFactory: submarineInformerFactory,
-		controller:               controller.NewController(controller.NewConfig(1, cfg.Submarine), kubeClient, submarineClient, kubeInformerFactory, submarineInformerFactory),
-	}
-
-	op.configureHealth()
-	op.httpServer = &http.Server{Addr: cfg.ListenAddr, Handler: op.health}
-
-	return op
-}
-
-func initKubeConfig(c *Config) (*rest.Config, error) {
-	if len(c.KubeConfigFile) > 0 {
-		return clientcmd.BuildConfigFromFlags(c.Master, c.KubeConfigFile) // out of cluster config
-	}
-	return rest.InClusterConfig()
-}
-
-// Run executes the Submarine Operator
-func (op *SubmarineOperator) Run(stop <-chan struct{}) error {
-	var err error
-	if op.controller != nil {
-		op.kubeInformerFactory.Start(stop)
-		op.submarineInformerFactory.Start(stop)
-		go op.runHTTPServer(stop)
-		err = op.controller.Run(stop)
-	}
-
-	return err
-}
-
-func (op *SubmarineOperator) configureHealth() {
-	op.health = healthcheck.NewHandler()
-	op.health.AddReadinessCheck("SubmarineCluster_cache_sync", func() error {
-		if op.controller.SubmarineClusterSynced() {
-			return nil
-		}
-		return fmt.Errorf("SubmarineCluster cache not sync")
-	})
-	op.health.AddReadinessCheck("Pod_cache_sync", func() error {
-		if op.controller.PodSynced() {
-			return nil
-		}
-		return fmt.Errorf("Pod cache not sync")
-	})
-	op.health.AddReadinessCheck("Service_cache_sync", func() error {
-		if op.controller.ServiceSynced() {
-			return nil
-		}
-		return fmt.Errorf("Service cache not sync")
-	})
-	op.health.AddReadinessCheck("PodDiscruptionBudget_cache_sync", func() error {
-		if op.controller.PodDiscruptionBudgetSynced() {
-			return nil
-		}
-		return fmt.Errorf("PodDiscruptionBudget cache not sync")
-	})
-}
-
-func (op *SubmarineOperator) runHTTPServer(stop <-chan struct{}) error {
-	go func() {
-		glog.Infof("Listening on http://%s\n", op.httpServer.Addr)
-
-		if err := op.httpServer.ListenAndServe(); err != nil {
-			glog.Error("Http server error: ", err)
-		}
-	}()
-
-	<-stop
-	glog.Info("Shutting down the http server...")
-	return op.httpServer.Shutdown(context.Background())
-}
diff --git a/submarine-cloud/pkg/signal/signal.go b/submarine-cloud/pkg/signal/signal.go
deleted file mode 100644
index c494127..0000000
--- a/submarine-cloud/pkg/signal/signal.go
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 signal
-
-import (
-	"context"
-	"os"
-	"os/signal"
-	"syscall"
-
-	"github.com/golang/glog"
-)
-
-// HandleSignal used to listen several os signal and then execute the cancel function
-func HandleSignal(cancelFunc context.CancelFunc) {
-	sigc := make(chan os.Signal, 1)
-	signal.Notify(sigc,
-		syscall.SIGHUP,
-		syscall.SIGINT,
-		syscall.SIGTERM,
-		syscall.SIGQUIT)
-	sig := <-sigc
-	glog.Infof("Signal received: %s, stop the process", sig.String())
-	cancelFunc()
-}
diff --git a/submarine-cloud/pkg/submarine/admin.go b/submarine-cloud/pkg/submarine/admin.go
deleted file mode 100644
index 9fdf6db..0000000
--- a/submarine-cloud/pkg/submarine/admin.go
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-import (
-	"github.com/golang/glog"
-	"time"
-)
-
-// AdminInterface submarine cluster admin interface
-type AdminInterface interface {
-	// Connections returns the connection map of all clients
-	Connections() AdminConnectionsInterface
-	// Close the admin connections
-	Close()
-	// InitSubmarineCluster used to configure the first node of a cluster
-	InitSubmarineCluster(addr string) error
-	// GetClusterInfos get node infos for all nodes
-	GetClusterInfos() (*ClusterInfos, error)
-	// GetClusterInfosSelected return the Nodes infos for all nodes selected in the cluster
-	//GetClusterInfosSelected(addrs []string) (*ClusterInfos, error)
-	// AttachNodeToCluster command use to connect a Node to the cluster
-	// the connection will be done on a random node part of the connection pool
-	AttachNodeToCluster(addr string) error
-	// AttachSlaveToMaster attach a slave to a master node
-	AttachSlaveToMaster(slave *Node, master *Node) error
-	// DetachSlave detach a slave to its master
-	//DetachSlave(slave *Node) error
-	// StartFailover execute the failover of the Submarine Master corresponding to the addr
-	StartFailover(addr string) error
-	// ForgetNode execute the Submarine command to force the cluster to forgot the the Node
-	ForgetNode(id string) error
-	// ForgetNodeByAddr execute the Submarine command to force the cluster to forgot the the Node
-	ForgetNodeByAddr(id string) error
-	// SetSlots exec the submarine command to set slots in a pipeline, provide
-	// and empty nodeID if the set slots commands doesn't take a nodeID in parameter
-	//SetSlots(addr string, action string, slots []Slot, nodeID string) error
-	// AddSlots exec the submarine command to add slots in a pipeline
-	//AddSlots(addr string, slots []Slot) error
-	// DelSlots exec the submarine command to del slots in a pipeline
-	//DelSlots(addr string, slots []Slot) error
-	// GetKeysInSlot exec the submarine command to get the keys in the given slot on the node we are connected to
-	//GetKeysInSlot(addr string, slot Slot, batch int, limit bool) ([]string, error)
-	// CountKeysInSlot exec the submarine command to count the keys given slot on the node
-	//CountKeysInSlot(addr string, slot Slot) (int64, error)
-	// MigrateKeys from addr to destination node. returns number of slot migrated. If replace is true, replace key on busy error
-	//MigrateKeys(addr string, dest *Node, slots []Slot, batch, timeout int, replace bool) (int, error)
-	// FlushAndReset reset the cluster configuration of the node, the node is flushed in the same pipe to ensure reset works
-	FlushAndReset(addr string, mode string) error
-	// FlushAll flush all keys in cluster
-	FlushAll()
-	// GetHashMaxSlot get the max slot value
-	//GetHashMaxSlot() Slot
-	//RebuildConnectionMap rebuild the connection map according to the given addresses
-	//RebuildConnectionMap(addrs []string, options *AdminOptions)
-}
-
-// AdminOptions optional options for submarine admin
-type AdminOptions struct {
-	ConnectionTimeout  time.Duration
-	ClientName         string
-	RenameCommandsFile string
-}
-
-// Admin wraps submarine cluster admin logic
-type Admin struct {
-	///hashMaxSlots Slot
-	cnx AdminConnectionsInterface
-}
-
-func (a Admin) Connections() AdminConnectionsInterface {
-	return a.cnx
-}
-
-func (a Admin) Close() {
-	a.Connections().Reset()
-}
-
-func (a Admin) InitSubmarineCluster(addr string) error {
-	panic("implement me")
-}
-
-func (a Admin) GetClusterInfos() (*ClusterInfos, error) {
-	glog.V(1).Info("GetClusterInfos")
-
-	infos := NewClusterInfos()
-	clusterErr := NewClusterInfosError()
-
-	for addr, c := range a.Connections().GetAll() {
-		nodeinfos, err := a.getInfos(c, addr)
-		if err != nil {
-			infos.Status = ClusterInfosPartial
-			clusterErr.partial = true
-			clusterErr.errs[addr] = err
-			continue
-		}
-		if nodeinfos.Node != nil && nodeinfos.Node.IPPort() == addr {
-			infos.Infos[addr] = nodeinfos
-		} else {
-			glog.Warningf("Bad node info retrieved from %s", addr)
-		}
-	}
-
-	if len(clusterErr.errs) == 0 {
-		clusterErr.inconsistent = !infos.ComputeStatus()
-	}
-	if infos.Status == ClusterInfosConsistent {
-		return infos, nil
-	}
-	return infos, clusterErr
-}
-
-func (a Admin) AttachNodeToCluster(addr string) error {
-	panic("implement me")
-}
-
-func (a Admin) AttachSlaveToMaster(slave *Node, master *Node) error {
-	panic("implement me")
-}
-
-func (a Admin) StartFailover(addr string) error {
-	panic("implement me")
-}
-
-func (a Admin) ForgetNode(id string) error {
-	panic("implement me")
-}
-
-func (a Admin) ForgetNodeByAddr(id string) error {
-	panic("implement me")
-}
-
-func (a Admin) FlushAndReset(addr string, mode string) error {
-	panic("implement me")
-}
-
-func (a Admin) FlushAll() {
-	panic("implement me")
-}
-
-// NewAdmin returns new AdminInterface instance
-// at the same time it connects to all Submarine Nodes thanks to the addrs list
-func NewAdmin(addrs []string, options *AdminOptions) AdminInterface {
-	a := &Admin{
-		//hashMaxSlots: defaultHashMaxSlots,
-	}
-
-	// perform initial connections
-	a.cnx = NewAdminConnections(addrs, options)
-
-	return a
-}
-
-func (a *Admin) getInfos(c ClientInterface, addr string) (*NodeInfos, error) {
-	/*
-		resp := c.Cmd("CLUSTER", "NODES")
-		if err := a.Connections().ValidateResp(resp, addr, "Unable to retrieve Node Info"); err != nil {
-			return nil, err
-		}
-
-		var raw string
-		var err error
-		raw, err = resp.Str()
-
-		if err != nil {
-			return nil, fmt.Errorf("Wrong format from CLUSTER NODES: %v", err)
-		}
-	*/
-	var raw string = ""
-	nodeInfos := DecodeNodeInfos(&raw, addr)
-
-	/*
-		if glog.V(3) {
-			//Retrieve server info for debugging
-			resp = c.Cmd("INFO", "SERVER")
-			if err = a.Connections().ValidateResp(resp, addr, "Unable to retrieve Node Info"); err != nil {
-				return nil, err
-			}
-			raw, err = resp.Str()
-			if err != nil {
-				return nil, fmt.Errorf("Wrong format from INFO SERVER: %v", err)
-			}
-
-			var serverStartTime time.Time
-			serverStartTime, err = DecodeNodeStartTime(&raw)
-
-			if err != nil {
-				return nil, err
-			}
-
-			nodeInfos.Node.ServerStartTime = serverStartTime
-		}*/
-
-	return nodeInfos, nil
-}
diff --git a/submarine-cloud/pkg/submarine/client.go b/submarine-cloud/pkg/submarine/client.go
deleted file mode 100644
index d283f58..0000000
--- a/submarine-cloud/pkg/submarine/client.go
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-import (
-	"bytes"
-	"encoding/json"
-	"github.com/golang/glog"
-	"io"
-	"net/http"
-	"time"
-)
-
-// ClientInterface submarine client interface
-type ClientInterface interface {
-	// Close closes the connection.
-	Close() error
-
-	// Cmd calls the given Submarine command.
-	///Cmd(cmd string, args ...interface{}) *submarine.Resp
-
-	// PipeAppend adds the given call to the pipeline queue.
-	// Use PipeResp() to read the response.
-	///PipeAppend(cmd string, args ...interface{})
-
-	// PipeResp returns the reply for the next request in the pipeline queue. Err
-	// with ErrPipelineEmpty is returned if the pipeline queue is empty.
-	///PipeResp() *submarine.Resp
-
-	// PipeClear clears the contents of the current pipeline queue, both commands
-	// queued by PipeAppend which have yet to be sent and responses which have yet
-	// to be retrieved through PipeResp. The first returned int will be the number
-	// of pending commands dropped, the second will be the number of pending
-	// responses dropped
-	PipeClear() (int, int)
-
-	// ReadResp will read a Resp off of the connection without sending anything
-	// first (useful after you've sent a SUBSCRIBE command). This will block until
-	// a reply is received or the timeout is reached (returning the IOErr). You can
-	// use IsTimeout to check if the Resp is due to a Timeout
-	//
-	// Note: this is a more low-level function, you really shouldn't have to
-	// actually use it unless you're writing your own pub/sub code
-	///ReadResp() *submarine.Resp
-
-	// GetClusterAddress calls the given Submarine cluster server address list
-	GetClusterAddress() ([]string, error)
-}
-
-// Client structure representing a client connection to submarine
-type Client struct {
-	commandsMapping map[string]string
-	///client          *submarine.Client
-	client ClientInterface
-}
-
-const getClusterAddressUrl = "/api/v1/cluster/address"
-const getClusterNodesUrl = "/api/v1/cluster/nodes"
-
-// NewClient build a client connection and connect to a submarine address
-func NewClient(addr string, cnxTimeout time.Duration, commandsMapping map[string]string) (ClientInterface, error) {
-	var err error
-	c := &Client{
-		commandsMapping: commandsMapping,
-	}
-
-	// c.client, err = submarine.DialTimeout("tcp", addr, cnxTimeout)
-	// TODO error!!!!
-
-	return c.client, err
-}
-
-// GetClusterAddress calls the given Submarine cluster server address list.
-func (c *Client) GetClusterAddress(host string) ([]string, error) {
-	clusterAddrBuff := httpGet(host + getClusterAddressUrl)
-	var clusterAddress []string
-	err := json.Unmarshal(clusterAddrBuff.Bytes(), &clusterAddress)
-	if err != nil {
-		glog.Error("Unmarshal failure: %s", clusterAddrBuff.String())
-	}
-
-	return clusterAddress, nil
-}
-
-func httpGet(url string) *bytes.Buffer {
-	client := &http.Client{Timeout: 5 * time.Second}
-	resp, err := client.Get(url)
-	if err != nil {
-		panic(err)
-	}
-	defer resp.Body.Close()
-	var buffer [4096]byte
-	result := bytes.NewBuffer(nil)
-	for {
-		n, err := resp.Body.Read(buffer[0:])
-		result.Write(buffer[0:n])
-		if err != nil && err == io.EOF {
-			break
-		} else if err != nil {
-			panic(err)
-		}
-	}
-
-	return result
-}
diff --git a/submarine-cloud/pkg/submarine/cluster.go b/submarine-cloud/pkg/submarine/cluster.go
deleted file mode 100644
index a13c97c..0000000
--- a/submarine-cloud/pkg/submarine/cluster.go
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-import v1 "github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-
-// Cluster represents a Submarine Cluster
-type Cluster struct {
-	Name           string
-	Namespace      string
-	Nodes          map[string]*Node
-	Status         v1.ClusterStatus
-	NodesPlacement v1.NodesPlacementInfo
-	ActionsInfo    ClusterActionsInfo
-}
-
-// ClusterActionsInfo use to store information about current action on the Cluster
-type ClusterActionsInfo struct {
-	NbslotsToMigrate int32
-}
-
-// GetNodeByID returns a Cluster Node by its ID
-// if not present in the cluster return an error
-func (c *Cluster) GetNodeByID(id string) (*Node, error) {
-	if n, ok := c.Nodes[id]; ok {
-		return n, nil
-	}
-	return nil, nodeNotFoundedError
-}
diff --git a/submarine-cloud/pkg/submarine/clusterinfo.go b/submarine-cloud/pkg/submarine/clusterinfo.go
deleted file mode 100644
index ee201ad..0000000
--- a/submarine-cloud/pkg/submarine/clusterinfo.go
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-const (
-	// ClusterInfosUnset status of the cluster info: no data set
-	ClusterInfosUnset = "Unset"
-	// ClusterInfosPartial status of the cluster info: data is not complete (some nodes didn't respond)
-	ClusterInfosPartial = "Partial"
-	// ClusterInfosInconsistent status of the cluster info: nodesinfos is not consistent between nodes
-	ClusterInfosInconsistent = "Inconsistent"
-	// ClusterInfosConsistent status of the cluster info: nodeinfos is complete and consistent between nodes
-	ClusterInfosConsistent = "Consistent"
-)
-
-// ClusterInfos represents the node infos for all nodes of the cluster
-type ClusterInfos struct {
-	Infos  map[string]*NodeInfos
-	Status string
-}
-
-// NodeInfos representation of a node info, i.e. data returned by the CLUSTER NODE submarine command
-// Node is the information of the targetted node
-// Friends are the view of the other nodes from the targetted node
-type NodeInfos struct {
-	Node    *Node
-	Friends Nodes
-}
-
-// GetNodes returns a nodeSlice view of the cluster
-// the slice if formed from how each node see itself
-// you should check the Status before doing it, to wait for a consistent view
-func (c *ClusterInfos) GetNodes() Nodes {
-	nodes := Nodes{}
-	for _, nodeinfos := range c.Infos {
-		nodes = append(nodes, nodeinfos.Node)
-	}
-	return nodes
-}
-
-// NewNodeInfos returns an instance of NodeInfo
-func NewNodeInfos() *NodeInfos {
-	return &NodeInfos{
-		Node:    NewDefaultNode(),
-		Friends: Nodes{},
-	}
-}
-
-// NewClusterInfos returns an instance of ClusterInfos
-func NewClusterInfos() *ClusterInfos {
-	return &ClusterInfos{
-		Infos:  make(map[string]*NodeInfos),
-		Status: ClusterInfosUnset,
-	}
-}
-
-// DecodeNodeInfos decode from the cmd output the Submarine nodes info. Second argument is the node on which we are connected to request info
-func DecodeNodeInfos(input *string, addr string) *NodeInfos {
-	infos := NewNodeInfos()
-	/*
-		lines := strings.Split(*input, "\n")
-		for _, line := range lines {
-			values := strings.Split(line, " ")
-			if len(values) < 8 {
-				// last line is always empty
-				glog.V(7).Infof("Not enough values in line split, ignoring line: '%s'", line)
-				continue
-			} else {
-				node := NewDefaultNode()
-
-				node.ID = values[0]
-				//remove trailing port for cluster internal protocol
-				ipPort := strings.Split(values[1], "@")
-				if ip, port, err := net.SplitHostPort(ipPort[0]); err == nil {
-					node.IP = ip
-					node.Port = port
-					if ip == "" {
-						// ip of the node we are connecting to is sometime empty
-						node.IP, _, _ = net.SplitHostPort(addr)
-					}
-				} else {
-					glog.Errorf("Error while decoding node info for node '%s', cannot split ip:port ('%s'): %v", node.ID, values[1], err)
-				}
-				node.SetRole(values[2])
-				node.SetFailureStatus(values[2])
-				node.SetReferentMaster(values[3])
-				if i, err := strconv.ParseInt(values[4], 10, 64); err == nil {
-					node.PingSent = i
-				}
-				if i, err := strconv.ParseInt(values[5], 10, 64); err == nil {
-					node.PongRecv = i
-				}
-				if i, err := strconv.ParseInt(values[6], 10, 64); err == nil {
-					node.ConfigEpoch = i
-				}
-				node.SetLinkStatus(values[7])
-
-				for _, slot := range values[8:] {
-					if s, importing, migrating, err := DecodeSlotRange(slot); err == nil {
-						node.Slots = append(node.Slots, s...)
-						if importing != nil {
-							node.ImportingSlots[importing.SlotID] = importing.FromNodeID
-						}
-						if migrating != nil {
-							node.MigratingSlots[migrating.SlotID] = migrating.ToNodeID
-						}
-					}
-				}
-
-				if strings.HasPrefix(values[2], "myself") {
-					infos.Node = node
-					glog.V(7).Infof("Getting node info for node: '%s'", node)
-				} else {
-					infos.Friends = append(infos.Friends, node)
-					glog.V(7).Infof("Adding node to slice: '%s'", node)
-				}
-			}
-		}*/
-
-	return infos
-}
-
-// ComputeStatus check the ClusterInfos status based on the current data
-// the status ClusterInfosPartial is set while building the clusterinfos
-// if already set, do nothing
-// returns true if consistent or if another error
-func (c *ClusterInfos) ComputeStatus() bool {
-	if c.Status != ClusterInfosUnset {
-		return false
-	}
-	return true
-
-	/*
-		consistencyStatus := false
-
-		consolidatedView := c.GetNodes().SortByFunc(LessByID)
-		consolidatedSignature := getConfigSignature(consolidatedView)
-		glog.V(7).Infof("Consolidated view:\n%s", consolidatedSignature)
-		for addr, nodeinfos := range c.Infos {
-			nodesView := append(nodeinfos.Friends, nodeinfos.Node).SortByFunc(LessByID)
-			nodeSignature := getConfigSignature(nodesView)
-			glog.V(7).Infof("Node view from %s (ID: %s):\n%s", addr, nodeinfos.Node.ID, nodeSignature)
-			if !reflect.DeepEqual(consolidatedSignature, nodeSignature) {
-				glog.V(4).Info("Temporary inconsistency between nodes is possible. If the following inconsistency message persists for more than 20 mins, any cluster operation (scale, rolling update) should be avoided before the message is gone")
-				glog.V(4).Infof("Inconsistency from %s: \n%s\nVS\n%s", addr, consolidatedSignature, nodeSignature)
-				c.Status = ClusterInfosInconsistent
-			}
-		}
-		if c.Status == ClusterInfosUnset {
-			c.Status = ClusterInfosConsistent
-			consistencyStatus = true
-		}
-		return consistencyStatus*/
-}
diff --git a/submarine-cloud/pkg/submarine/connections.go b/submarine-cloud/pkg/submarine/connections.go
deleted file mode 100644
index f860fa1..0000000
--- a/submarine-cloud/pkg/submarine/connections.go
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-import (
-	"bufio"
-	"errors"
-	"github.com/golang/glog"
-	"math/rand"
-	"os"
-	"strings"
-	"time"
-)
-
-const (
-	defaultClientTimeout = 2 * time.Second
-	defaultClientName    = ""
-
-	// ErrNotFound cannot find a node to connect to
-	ErrNotFound = "Unable to find a node to connect"
-)
-
-// AdminConnectionsInterface interface representing the map of admin connections to submarine cluster nodes
-type AdminConnectionsInterface interface {
-	// Add connect to the given address and
-	// register the client connection to the pool
-	Add(addr string) error
-	// Remove disconnect and remove the client connection from the map
-	Remove(addr string)
-	// Get returns a client connection for the given address,
-	// connects if the connection is not in the map yet
-	Get(addr string) (ClientInterface, error)
-	// GetRandom returns a client connection to a random node of the client map
-	GetRandom() (ClientInterface, error)
-	// GetDifferentFrom returns a random client connection different from given address
-	GetDifferentFrom(addr string) (ClientInterface, error)
-	// GetAll returns a map of all clients per address
-	GetAll() map[string]ClientInterface
-	//GetSelected returns a map of clients based on the input addresses
-	GetSelected(addrs []string) map[string]ClientInterface
-	// Reconnect force a reconnection on the given address
-	// if the address is not part of the map, act like Add
-	Reconnect(addr string) error
-	// AddAll connect to the given list of addresses and
-	// register them in the map
-	// fail silently
-	AddAll(addrs []string)
-	// ReplaceAll clear the map and re-populate it with new connections
-	// fail silently
-	ReplaceAll(addrs []string)
-	// ValidateResp check the submarine resp, eventually reconnect on connection error
-	// in case of error, customize the error, log it and return it
-	///ValidateResp(resp *submarine.Resp, addr, errMessage string) error
-	// ValidatePipeResp wait for all answers in the pipe and validate the response
-	// in case of network issue clear the pipe and return
-	// in case of error return false
-	// ValidatePipeResp(c ClientInterface, addr, errMessage string) bool
-	// Reset close all connections and clear the connection map
-	Reset()
-}
-
-// AdminConnections connection map for submarine cluster
-// currently the admin connection is not threadSafe since it is only use in the Events thread.
-type AdminConnections struct {
-	clients           map[string]ClientInterface
-	connectionTimeout time.Duration
-	commandsMapping   map[string]string
-	clientName        string
-}
-
-// Add connect to the given address and
-// register the client connection to the map
-func (cnx *AdminConnections) Add(addr string) error {
-	_, err := cnx.Update(addr)
-	return err
-}
-
-// Update returns a client connection for the given adress,
-// connects if the connection is not in the map yet
-func (cnx *AdminConnections) Update(addr string) (ClientInterface, error) {
-	// if already exist close the current connection
-	if c, ok := cnx.clients[addr]; ok {
-		c.Close()
-	}
-
-	c, err := cnx.connect(addr)
-	if err == nil && c != nil {
-		cnx.clients[addr] = c
-	} else {
-		glog.V(3).Infof("Cannot connect to %s ", addr)
-	}
-	return c, err
-}
-
-func (cnx *AdminConnections) connect(addr string) (ClientInterface, error) {
-	c, err := NewClient(addr, cnx.connectionTimeout, cnx.commandsMapping)
-	if err != nil {
-		return nil, err
-	}
-	if cnx.clientName != "" {
-		///resp := c.Cmd("CLIENT", "SETNAME", cnx.clientName)
-		///return c, cnx.ValidateResp(resp, addr, "Unable to run command CLIENT SETNAME")
-	}
-
-	return c, nil
-}
-
-// AddAll connect to the given list of addresses and
-// register them in the map
-// fail silently
-func (cnx *AdminConnections) AddAll(addrs []string) {
-	for _, addr := range addrs {
-		cnx.Add(addr)
-	}
-}
-
-// buildCommandReplaceMapping reads the config file with the command-replace lines and build a mapping of
-// bad lines are ignored silently
-func buildCommandReplaceMapping(filePath string) map[string]string {
-	mapping := make(map[string]string)
-	file, err := os.Open(filePath)
-	if err != nil {
-		glog.Errorf("Cannot open %s: %v", filePath, err)
-		return mapping
-	}
-	defer file.Close()
-
-	scanner := bufio.NewScanner(file)
-	for scanner.Scan() {
-		elems := strings.Fields(scanner.Text())
-		if len(elems) == 3 && strings.ToLower(elems[0]) == "rename-command" {
-			mapping[strings.ToUpper(elems[1])] = elems[2]
-		}
-	}
-
-	if err := scanner.Err(); err != nil {
-		glog.Errorf("Cannot parse %s: %v", filePath, err)
-		return mapping
-	}
-	return mapping
-}
-
-// NewAdminConnections returns and instance of AdminConnectionsInterface
-func NewAdminConnections(addrs []string, options *AdminOptions) AdminConnectionsInterface {
-	cnx := &AdminConnections{
-		clients:           make(map[string]ClientInterface),
-		connectionTimeout: defaultClientTimeout,
-		commandsMapping:   make(map[string]string),
-		clientName:        defaultClientName,
-	}
-	if options != nil {
-		if options.ConnectionTimeout != 0 {
-			cnx.connectionTimeout = options.ConnectionTimeout
-		}
-		if _, err := os.Stat(options.RenameCommandsFile); err == nil {
-			cnx.commandsMapping = buildCommandReplaceMapping(options.RenameCommandsFile)
-		}
-		cnx.clientName = options.ClientName
-	}
-	cnx.AddAll(addrs)
-	return cnx
-}
-
-// ReplaceAll clear the pool and re-populate it with new connections
-// fail silently
-func (cnx *AdminConnections) ReplaceAll(addrs []string) {
-	cnx.Reset()
-	cnx.AddAll(addrs)
-}
-
-// Reset close all connections and clear the connection map
-func (cnx *AdminConnections) Reset() {
-	for _, c := range cnx.clients {
-		c.Close()
-	}
-	cnx.clients = map[string]ClientInterface{}
-}
-
-// Remove disconnect and remove the client connection from the map
-func (cnx *AdminConnections) Remove(addr string) {
-	if c, ok := cnx.clients[addr]; ok {
-		c.Close()
-		delete(cnx.clients, addr)
-	}
-}
-
-// Get returns a client connection for the given adress,
-// connects if the connection is not in the map yet
-func (cnx *AdminConnections) Get(addr string) (ClientInterface, error) {
-	if c, ok := cnx.clients[addr]; ok {
-		return c, nil
-	}
-	c, err := cnx.connect(addr)
-	if err == nil && c != nil {
-		cnx.clients[addr] = c
-	}
-	return c, err
-}
-
-// GetRandom returns a client connection to a random node of the client map
-func (cnx *AdminConnections) GetRandom() (ClientInterface, error) {
-	_, c, err := cnx.getRandomKeyClient()
-	return c, err
-}
-
-// GetRandom returns a client connection to a random node of the client map
-func (cnx *AdminConnections) getRandomKeyClient() (string, ClientInterface, error) {
-	nbClient := len(cnx.clients)
-	if nbClient == 0 {
-		return "", nil, errors.New(ErrNotFound)
-	}
-	randNumber := rand.Intn(nbClient)
-	for k, c := range cnx.clients {
-		if randNumber == 0 {
-			return k, c, nil
-		}
-		randNumber--
-	}
-
-	return "", nil, errors.New(ErrNotFound)
-}
-
-// GetDifferentFrom returns random a client connection different from given address
-func (cnx *AdminConnections) GetDifferentFrom(addr string) (ClientInterface, error) {
-	if len(cnx.clients) == 1 {
-		for a, c := range cnx.clients {
-			if a != addr {
-				return c, nil
-			}
-			return nil, errors.New(ErrNotFound)
-		}
-	}
-
-	for {
-		a, c, err := cnx.getRandomKeyClient()
-		if err != nil {
-			return nil, err
-		}
-		if a != addr {
-			return c, nil
-		}
-	}
-}
-
-// GetAll returns a map of all clients per address
-func (cnx *AdminConnections) GetAll() map[string]ClientInterface {
-	return cnx.clients
-}
-
-//GetSelected returns a map of clients based on the input addresses
-func (cnx *AdminConnections) GetSelected(addrs []string) map[string]ClientInterface {
-	clientsSelected := make(map[string]ClientInterface)
-	for _, addr := range addrs {
-		if client, ok := cnx.clients[addr]; ok {
-			clientsSelected[addr] = client
-		}
-	}
-	return clientsSelected
-}
-
-// Reconnect force a reconnection on the given address
-// is the adress is not part of the map, act like Add
-func (cnx *AdminConnections) Reconnect(addr string) error {
-	glog.Infof("Reconnecting to %s", addr)
-	cnx.Remove(addr)
-	return cnx.Add(addr)
-}
diff --git a/submarine-cloud/pkg/submarine/errors.go b/submarine-cloud/pkg/submarine/errors.go
deleted file mode 100644
index 64116f3..0000000
--- a/submarine-cloud/pkg/submarine/errors.go
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-import "fmt"
-
-// Error used to represent an error
-type Error string
-
-func (e Error) Error() string { return string(e) }
-
-// ClusterInfosError error type for submarine cluster infos access
-type ClusterInfosError struct {
-	errs         map[string]error
-	partial      bool
-	inconsistent bool
-}
-
-// nodeNotFoundedError returns when a node is not present in the cluster
-const nodeNotFoundedError = Error("node not founded")
-
-// Partial true if the some nodes of the cluster didn't answer
-func (e ClusterInfosError) Partial() bool {
-	return e.partial
-}
-
-// Error error string
-func (e ClusterInfosError) Error() string {
-	s := ""
-	if e.partial {
-		s += "Cluster infos partial: "
-		for addr, err := range e.errs {
-			s += fmt.Sprintf("%s: '%s'", addr, err)
-		}
-		return s
-	}
-	if e.inconsistent {
-		s += "Cluster view is inconsistent"
-	}
-	return s
-}
-
-// IsPartialError returns true if the error is due to partial data recovery
-func IsPartialError(err error) bool {
-	e, ok := err.(ClusterInfosError)
-	return ok && e.Partial()
-}
-
-// NewClusterInfosError returns an instance of cluster infos error
-func NewClusterInfosError() ClusterInfosError {
-	return ClusterInfosError{
-		errs:         make(map[string]error),
-		partial:      false,
-		inconsistent: false,
-	}
-}
diff --git a/submarine-cloud/pkg/submarine/node.go b/submarine-cloud/pkg/submarine/node.go
deleted file mode 100644
index 2fa9a1f..0000000
--- a/submarine-cloud/pkg/submarine/node.go
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 submarine
-
-import (
-	"github.com/apache/submarine/submarine-cloud/pkg/apis/submarine/v1alpha1"
-	kapiv1 "k8s.io/api/core/v1"
-	"net"
-	"sort"
-	"time"
-)
-
-const (
-	// DefaultSubmarinePort define the default Submarine Port
-	DefaultSubmarinePort = "8080"
-	// submarineMasterRole submarine role master
-	submarineMasterRole = "master"
-	// submarineSlaveRole submarine role slave
-	submarineSlaveRole = "slave"
-)
-
-// Node Represent a Submarine Node
-type Node struct {
-	ID             string
-	IP             string
-	Port           string
-	Role           string
-	LinkState      string
-	MasterReferent string
-	FailStatus     []string
-	PingSent       int64
-	PongRecv       int64
-	ConfigEpoch    int64
-	///Slots           []Slot
-	///MigratingSlots  map[Slot]string
-	///ImportingSlots  map[Slot]string
-	ServerStartTime time.Time
-
-	Pod *kapiv1.Pod
-}
-
-// NewDefaultNode builds and returns new defaultNode instance
-func NewDefaultNode() *Node {
-	return &Node{
-		Port: DefaultSubmarinePort,
-		///Slots:          []Slot{},
-		///MigratingSlots: map[Slot]string{},
-		///ImportingSlots: map[Slot]string{},
-	}
-}
-
-// Nodes represent a Node slice
-type Nodes []*Node
-
-// nodeSorter joins a By function and a slice of Nodes to be sorted.
-type nodeSorter struct {
-	nodes Nodes
-	by    func(p1, p2 *Node) bool // Closure used in the Less method.
-}
-
-// Len is part of sort.Interface.
-func (s *nodeSorter) Len() int {
-	return len(s.nodes)
-}
-
-// Swap is part of sort.Interface.
-func (s *nodeSorter) Swap(i, j int) {
-	s.nodes[i], s.nodes[j] = s.nodes[j], s.nodes[i]
-}
-
-// Less is part of sort.Interface. It is implemented by calling the "by" closure in the sorter.
-func (s *nodeSorter) Less(i, j int) bool {
-	return s.by(s.nodes[i], s.nodes[j])
-}
-
-// FindNodeFunc function for finding a Node
-// it is use as input for GetNodeByFunc and GetNodesByFunc
-type FindNodeFunc func(node *Node) bool
-
-// GetNodesByFunc returns first node found by the FindNodeFunc
-func (n Nodes) GetNodesByFunc(f FindNodeFunc) (Nodes, error) {
-	nodes := Nodes{}
-	for _, node := range n {
-		if f(node) {
-			nodes = append(nodes, node)
-		}
-	}
-	if len(nodes) == 0 {
-		return nodes, nodeNotFoundedError
-	}
-	return nodes, nil
-}
-
-// IsMasterWithSlot anonymous function for searching Master Node withslot
-var IsMasterWithSlot = func(n *Node) bool {
-	if (n.GetRole() == v1alpha1.SubmarineClusterNodeRoleMaster) && (n.TotalSlots() > 0) {
-		return true
-	}
-	return false
-}
-
-// GetRole return the Submarine Cluster Node GetRole
-func (n *Node) GetRole() v1alpha1.SubmarineClusterNodeRole {
-	switch n.Role {
-	case submarineMasterRole:
-		return v1alpha1.SubmarineClusterNodeRoleMaster
-	case submarineSlaveRole:
-		return v1alpha1.SubmarineClusterNodeRoleSlave
-	default:
-		if n.MasterReferent != "" {
-			return v1alpha1.SubmarineClusterNodeRoleSlave
-		}
-		///if len(n.Slots) > 0 {
-		///	return v1alpha1.SubmarineClusterNodeRoleMaster
-		///}
-	}
-
-	return v1alpha1.SubmarineClusterNodeRoleNone
-}
-
-// TotalSlots return the total number of slot
-func (n *Node) TotalSlots() int {
-	return 1 ///len(n.Slots)
-}
-
-// IsSlave anonymous function for searching Slave Node
-var IsSlave = func(n *Node) bool {
-	return n.GetRole() == v1alpha1.SubmarineClusterNodeRoleSlave
-}
-
-// FilterByFunc remove a node from a slice by node ID and returns the slice. If not found, fail silently. Value must be unique
-func (n Nodes) FilterByFunc(fn func(*Node) bool) Nodes {
-	newSlice := Nodes{}
-	for _, node := range n {
-		if fn(node) {
-			newSlice = append(newSlice, node)
-		}
-	}
-	return newSlice
-}
-
-// IsMasterWithNoSlot anonymous function for searching Master Node with no slot
-var IsMasterWithNoSlot = func(n *Node) bool {
-	if (n.GetRole() == v1alpha1.SubmarineClusterNodeRoleMaster) && (n.TotalSlots() == 0) {
-		return true
-	}
-	return false
-}
-
-// By is the type of a "less" function that defines the ordering of its Node arguments.
-type by func(p1, p2 *Node) bool
-
-// Sort is a method on the function type, By, that sorts the argument slice according to the function.
-func (b by) Sort(nodes Nodes) {
-	ps := &nodeSorter{
-		nodes: nodes,
-		by:    b, // The Sort method's receiver is the function (closure) that defines the sort order.
-	}
-	sort.Sort(ps)
-}
-
-// SortByFunc returns a new ordered NodeSlice, determined by a func defining ‘less’.
-func (n Nodes) SortByFunc(less func(*Node, *Node) bool) Nodes {
-	result := make(Nodes, len(n))
-	copy(result, n)
-	by(less).Sort(n)
-	return result
-}
-
-// IPPort returns join Ip Port string
-func (n *Node) IPPort() string {
-	return net.JoinHostPort(n.IP, n.Port)
-}
-
-// LessByID compare 2 Nodes with there ID
-func LessByID(n1, n2 *Node) bool {
-	return n1.ID < n2.ID
-}
diff --git a/submarine-cloud/pkg/utils/build.go b/submarine-cloud/pkg/utils/build.go
deleted file mode 100644
index 45aa110..0000000
--- a/submarine-cloud/pkg/utils/build.go
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 utils
-
-import (
-	"fmt"
-	"time"
-)
-
-// BUILDTIME should be populated by at build time: -ldflags "-w -X github.com/apache/submarine/submarine-cloud/pkg/utils.BUILDTIME=${DATE}
-// with for example DATE=$(shell date +%Y-%m-%d/%H:%M:%S )   (pay attention not to use space!)
-var BuildTime string
-
-// BuildGitBranch should be populated by at build time: -ldflags "-w -X github.com/apache/submarine/submarine-cloud/pkg/utils.TAG=${BuildGitBranch}
-// with for example BuildGitBranch=$(git describe --all)
-var BuildGitBranch string
-
-// BuildGitRev should be populated by at build time: -ldflags "-w -X github.com/apache/submarine/submarine-cloud/pkg/utils.TAG=${BuildGitRev}
-// with for example BuildGitRev=$(git rev-list --count HEAD)
-var BuildGitRev string
-
-// BuildGitCommit should be populated by at build time: -ldflags "-w -X github.com/apache/submarine/submarine-cloud/pkg/utils.COMMIT=${COMMIT}
-// with for example COMMIT=$(git rev-parse HEAD)
-var BuildGitCommit string
-
-// VERSION should be populated by at build time: -ldflags "-w -X github.com/apache/submarine/submarine-cloud/pkg/utils.VERSION=${VERSION}
-// with for example VERSION=$(git rev-parse --abbrev-ref HEAD)
-var VERSION string
-
-// BuildInfos returns builds information
-func BuildInfos() {
-	fmt.Println("Program started at: " + time.Now().String())
-	fmt.Println("Build Time : " + BuildTime)
-	fmt.Println("Build Git Branch : " + BuildGitBranch)
-	fmt.Println("Build Git Rev : " + BuildGitRev)
-	fmt.Println("Build Git Commit : " + BuildGitCommit)
-	fmt.Println("Submarine Version : " + VERSION)
-}
diff --git a/submarine-cloud/pom.xml b/submarine-cloud/pom.xml
deleted file mode 100644
index 131d6ddb..0000000
--- a/submarine-cloud/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you 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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.submarine</groupId>
-    <artifactId>submarine</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>submarine-cloud</artifactId>
-  <version>0.7.0-SNAPSHOT</version>
-  <name>Submarine: Cloud</name>
-  <packaging>pom</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.6.0</version>
-        <executions>
-          <!--execution>
-            <id>compile-submarine-cloud</id>
-            <phase>compile</phase>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-            <configuration>
-              <executable>${basedir}/build.sh</executable>
-              <commandlineArgs>build</commandlineArgs>
-              <environmentVariables>
-                <GOOS>darwin</GOOS>
-                <GOARCH>amd64</GOARCH>
-              </environmentVariables>
-            </configuration>
-          </execution-->
-          <execution>
-            <id>package-submarine-cloud</id>
-            <phase>package</phase>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-            <configuration>
-              <executable>${basedir}/build.sh</executable>
-              <commandlineArgs>release</commandlineArgs>
-              <environmentVariables>
-                <GOOS>linux</GOOS>
-                <GOARCH>amd64</GOARCH>
-              </environmentVariables>
-            </configuration>
-          </execution>
-          <execution>
-            <id>clean-submarine-cloud</id>
-            <phase>clean</phase>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-            <configuration>
-              <executable>${basedir}/build.sh</executable>
-              <commandlineArgs>clean</commandlineArgs>
-            </configuration>
-          </execution>
-          <execution>
-            <id>test-submarine-cloud</id>
-            <phase>test</phase>
-            <goals>
-              <goal>exec</goal>
-            </goals>
-            <configuration>
-              <executable>${basedir}/build.sh</executable>
-              <commandlineArgs>test</commandlineArgs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@submarine.apache.org
For additional commands, e-mail: dev-help@submarine.apache.org