diff --git a/Gopkg.lock b/Gopkg.lock index 15a1393c30007..d69f72b518517 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,29 +2,155 @@ [[projects]] - name = "github.com/argoproj/argo" + name = "cloud.google.com/go" + packages = ["compute/metadata"] + revision = "767c40d6a2e058483c25fa193e963a22da17236d" + version = "v0.18.0" + +[[projects]] + name = "github.com/PuerkitoBio/purell" + packages = ["."] + revision = "0bcb03f4b4d0a9428594752bd2a3b9aa0a9d4bd4" + version = "v1.1.0" + +[[projects]] + branch = "master" + name = "github.com/PuerkitoBio/urlesc" + packages = ["."] + revision = "de5bf2ad457846296e2031421a34e2568e304e35" + +[[projects]] + name = "github.com/emicklei/go-restful" + packages = [".","log"] + revision = "26b41036311f2da8242db402557a0dbd09dc83da" + version = "v2.6.0" + +[[projects]] + name = "github.com/ghodss/yaml" + packages = ["."] + revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7" + version = "v1.0.0" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/jsonpointer" + packages = ["."] + revision = "779f45308c19820f1a69e9a4cd965f496e0da10f" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/jsonreference" + packages = ["."] + revision = "36d33bfe519efae5632669801b180bf1a245da3b" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/spec" packages = ["."] - revision = "0978b9c61cb7435d31ef8d252b80e03708a70adc" - version = "v2.0.0" + revision = "1de3e0542de65ad8d75452a595886fdd0befb363" + +[[projects]] + branch = "master" + name = "github.com/go-openapi/swag" + packages = ["."] + revision = "84f4bee7c0a6db40e3166044c7983c1c32125429" + +[[projects]] + name = "github.com/gogo/protobuf" + packages = ["proto","sortkeys"] + revision = "1adfc126b41513cc696b209667c8656ea7aac67c" + version = "v1.0.0" + +[[projects]] + branch = "master" + name = "github.com/golang/glog" + packages = ["."] + revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" [[projects]] name = "github.com/golang/protobuf" - packages = ["jsonpb","proto","protoc-gen-go/descriptor","ptypes","ptypes/any","ptypes/duration","ptypes/struct","ptypes/timestamp"] + packages = ["jsonpb","proto","protoc-gen-go/descriptor","ptypes","ptypes/any","ptypes/duration","ptypes/empty","ptypes/struct","ptypes/timestamp"] revision = "925541529c1fa6821df4e44ce2723319eb2be768" version = "v1.0.0" +[[projects]] + branch = "master" + name = "github.com/google/btree" + packages = ["."] + revision = "e89373fe6b4a7413d7acd6da1725b83ef713e6e4" + +[[projects]] + branch = "master" + name = "github.com/google/gofuzz" + packages = ["."] + revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" + +[[projects]] + name = "github.com/googleapis/gnostic" + packages = ["OpenAPIv2","compiler","extensions"] + revision = "ee43cbb60db7bd22502942cccbc39059117352ab" + version = "v0.1.0" + +[[projects]] + branch = "master" + name = "github.com/gregjones/httpcache" + packages = [".","diskcache"] + revision = "2bcd89a1743fd4b373f7370ce8ddc14dfbd18229" + [[projects]] name = "github.com/grpc-ecosystem/grpc-gateway" packages = ["runtime","runtime/internal","utilities"] revision = "07f5e79768022f9a3265235f0db4ac8c3f675fec" version = "v1.3.1" +[[projects]] + branch = "master" + name = "github.com/howeyc/gopass" + packages = ["."] + revision = "bf9dde6d0d2c004a008c27aaee91170c786f6db8" + +[[projects]] + name = "github.com/imdario/mergo" + packages = ["."] + revision = "163f41321a19dd09362d4c63cc2489db2015f1f4" + version = "0.3.2" + [[projects]] name = "github.com/inconshreveable/mousetrap" packages = ["."] revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" +[[projects]] + name = "github.com/json-iterator/go" + packages = ["."] + revision = "28452fcdec4e44348d2af0d91d1e9e38da3a9e0a" + version = "1.0.5" + +[[projects]] + name = "github.com/juju/ratelimit" + packages = ["."] + revision = "59fac5042749a5afb9af70e813da1dd5474f0167" + version = "1.0.1" + +[[projects]] + branch = "master" + name = "github.com/mailru/easyjson" + packages = ["buffer","jlexer","jwriter"] + revision = "32fa128f234d041f196a9f3e0fea5ac9772c08e1" + +[[projects]] + branch = "master" + name = "github.com/petar/GoLLRB" + packages = ["llrb"] + revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" + +[[projects]] + name = "github.com/peterbourgon/diskv" + packages = ["."] + revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" + version = "v2.0.1" + [[projects]] name = "github.com/sirupsen/logrus" packages = ["."] @@ -58,9 +184,15 @@ [[projects]] branch = "master" name = "golang.org/x/net" - packages = ["context","http2","http2/hpack","idna","internal/timeseries","lex/httplex","trace"] + packages = ["context","context/ctxhttp","http2","http2/hpack","idna","internal/timeseries","lex/httplex","trace"] revision = "f5dfe339be1d06f81b22525fe34671ee7d2c8904" +[[projects]] + branch = "master" + name = "golang.org/x/oauth2" + packages = [".","google","internal","jws","jwt"] + revision = "543e37812f10c46c622c9575afd7ad22f22a12ba" + [[projects]] branch = "master" name = "golang.org/x/sys" @@ -70,9 +202,15 @@ [[projects]] branch = "master" name = "golang.org/x/text" - packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"] + packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable","width"] revision = "4e4a3210bb54bb31f6ab2cdca2edcc0b50c420c1" +[[projects]] + name = "google.golang.org/appengine" + packages = [".","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/modules","internal/remote_api","internal/urlfetch","urlfetch"] + revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" + version = "v1.0.0" + [[projects]] branch = "master" name = "google.golang.org/genproto" @@ -85,9 +223,51 @@ revision = "6b51017f791ae1cfbec89c52efdf444b13b550ef" version = "v1.9.2" +[[projects]] + name = "gopkg.in/inf.v0" + packages = ["."] + revision = "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" + version = "v0.9.0" + +[[projects]] + branch = "v2" + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "d670f9405373e636a5a2765eea47fac0c9bc91a4" + +[[projects]] + branch = "release-1.9" + name = "k8s.io/api" + packages = ["admissionregistration/v1alpha1","admissionregistration/v1beta1","apps/v1","apps/v1beta1","apps/v1beta2","authentication/v1","authentication/v1beta1","authorization/v1","authorization/v1beta1","autoscaling/v1","autoscaling/v2beta1","batch/v1","batch/v1beta1","batch/v2alpha1","certificates/v1beta1","core/v1","events/v1beta1","extensions/v1beta1","networking/v1","policy/v1beta1","rbac/v1","rbac/v1alpha1","rbac/v1beta1","scheduling/v1alpha1","settings/v1alpha1","storage/v1","storage/v1alpha1","storage/v1beta1"] + revision = "acf347b865f29325eb61f4cd2df11e86e073a5ee" + +[[projects]] + branch = "release-1.9" + name = "k8s.io/apiextensions-apiserver" + packages = ["pkg/apis/apiextensions","pkg/apis/apiextensions/v1beta1","pkg/client/clientset/clientset","pkg/client/clientset/clientset/scheme","pkg/client/clientset/clientset/typed/apiextensions/v1beta1"] + revision = "c726b9ed6b50a8e7247ea43a9087b06b5ed40379" + +[[projects]] + branch = "release-1.9" + name = "k8s.io/apimachinery" + packages = ["pkg/api/errors","pkg/api/meta","pkg/api/resource","pkg/apis/meta/v1","pkg/apis/meta/v1/unstructured","pkg/apis/meta/v1alpha1","pkg/conversion","pkg/conversion/queryparams","pkg/fields","pkg/labels","pkg/runtime","pkg/runtime/schema","pkg/runtime/serializer","pkg/runtime/serializer/json","pkg/runtime/serializer/protobuf","pkg/runtime/serializer/recognizer","pkg/runtime/serializer/streaming","pkg/runtime/serializer/versioning","pkg/selection","pkg/types","pkg/util/clock","pkg/util/errors","pkg/util/framer","pkg/util/intstr","pkg/util/json","pkg/util/net","pkg/util/runtime","pkg/util/sets","pkg/util/validation","pkg/util/validation/field","pkg/util/wait","pkg/util/yaml","pkg/version","pkg/watch","third_party/forked/golang/reflect"] + revision = "19e3f5aa3adca672c153d324e6b7d82ff8935f03" + +[[projects]] + branch = "release-6.0" + name = "k8s.io/client-go" + packages = ["discovery","discovery/fake","kubernetes","kubernetes/scheme","kubernetes/typed/admissionregistration/v1alpha1","kubernetes/typed/admissionregistration/v1beta1","kubernetes/typed/apps/v1","kubernetes/typed/apps/v1beta1","kubernetes/typed/apps/v1beta2","kubernetes/typed/authentication/v1","kubernetes/typed/authentication/v1beta1","kubernetes/typed/authorization/v1","kubernetes/typed/authorization/v1beta1","kubernetes/typed/autoscaling/v1","kubernetes/typed/autoscaling/v2beta1","kubernetes/typed/batch/v1","kubernetes/typed/batch/v1beta1","kubernetes/typed/batch/v2alpha1","kubernetes/typed/certificates/v1beta1","kubernetes/typed/core/v1","kubernetes/typed/events/v1beta1","kubernetes/typed/extensions/v1beta1","kubernetes/typed/networking/v1","kubernetes/typed/policy/v1beta1","kubernetes/typed/rbac/v1","kubernetes/typed/rbac/v1alpha1","kubernetes/typed/rbac/v1beta1","kubernetes/typed/scheduling/v1alpha1","kubernetes/typed/settings/v1alpha1","kubernetes/typed/storage/v1","kubernetes/typed/storage/v1alpha1","kubernetes/typed/storage/v1beta1","pkg/version","plugin/pkg/client/auth/gcp","plugin/pkg/client/auth/oidc","rest","rest/watch","testing","third_party/forked/golang/template","tools/auth","tools/clientcmd","tools/clientcmd/api","tools/clientcmd/api/latest","tools/clientcmd/api/v1","tools/metrics","tools/reference","transport","util/cert","util/flowcontrol","util/homedir","util/integer","util/jsonpath"] + revision = "9389c055a838d4f208b699b3c7c51b70f2368861" + +[[projects]] + branch = "master" + name = "k8s.io/kube-openapi" + packages = ["pkg/common"] + revision = "275e2ce91dec4c05a4094a7b1daee5560b555ac9" + [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "8236e4aa41d9a90c6abbd3c4895477cd5a22b5612b861e1584426e5f24580101" + inputs-digest = "0ebdd723e771cc4a24642889db53f014125d792cf00dcab95050caad2944e303" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 67fba8dfd6c89..77123f714bfa0 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -5,3 +5,23 @@ [[constraint]] name = "github.com/grpc-ecosystem/grpc-gateway" version = "v1.3.1" + +[[constraint]] + branch = "release-1.9" + name = "k8s.io/apimachinery" + +[[constraint]] + branch = "release-1.9" + name = "k8s.io/api" + +[[constraint]] + name = "k8s.io/apiextensions-apiserver" + branch = "release-1.9" + +[[constraint]] + branch = "release-1.9" + name = "k8s.io/code-generator" + +[[constraint]] + branch = "release-6.0" + name = "k8s.io/client-go" diff --git a/cmd/argocd/commands/common.go b/cmd/argocd/commands/common.go index cd92e279a0d5b..ce942334b166a 100644 --- a/cmd/argocd/commands/common.go +++ b/cmd/argocd/commands/common.go @@ -1,5 +1,14 @@ package commands +import ( + "log" + "os" + + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" +) + const ( cliName = "argocd" ) @@ -10,3 +19,25 @@ var ( imageNamespace = "argoproj" imageTag = "latest" ) + +func getKubeConfig(configPath string, overrides clientcmd.ConfigOverrides) *rest.Config { + loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() + loadingRules.ExplicitPath = configPath + clientConfig := clientcmd.NewInteractiveDeferredLoadingClientConfig(loadingRules, &overrides, os.Stdin) + + var err error + restConfig, err := clientConfig.ClientConfig() + if err != nil { + log.Fatal(err) + } + return restConfig +} + +func getKubeClient(configPath string, overrides clientcmd.ConfigOverrides) *kubernetes.Clientset { + restConfig := getKubeConfig(configPath, overrides) + clientset, err := kubernetes.NewForConfig(restConfig) + if err != nil { + log.Fatal(err) + } + return clientset +} diff --git a/cmd/argocd/commands/install.go b/cmd/argocd/commands/install.go new file mode 100644 index 0000000000000..c0bf038d57a09 --- /dev/null +++ b/cmd/argocd/commands/install.go @@ -0,0 +1,110 @@ +package commands + +import ( + "fmt" + "time" + + "github.com/argoproj/argo-cd/pkg/apis/application" + appv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo/pkg/apis/workflow" + "github.com/ghodss/yaml" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + apierr "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" +) + +// InstallFlags has all the required parameters for installing Argo CD. +type InstallFlags struct { + DryRun bool // --dry-run +} + +// NewInstallCommand returns a new instance of `argocd install` command +func NewInstallCommand(globalArgs *globalFlags) *cobra.Command { + var ( + installArgs InstallFlags + ) + var command = &cobra.Command{ + Use: "install", + Short: "Install the argocd components", + Long: "Install the argocd components", + Run: func(c *cobra.Command, args []string) { + client := getKubeClient(globalArgs.kubeConfigPath, globalArgs.kubeConfigOverrides) + extensionsClient := apiextensionsclient.NewForConfigOrDie(getKubeConfig(globalArgs.kubeConfigPath, globalArgs.kubeConfigOverrides)) + installCRD(client, extensionsClient, installArgs) + }, + } + command.Flags().BoolVar(&installArgs.DryRun, "dry-run", false, "print the kubernetes manifests to stdout instead of installing") + + return command +} + +func installCRD(clientset *kubernetes.Clientset, extensionsClient *apiextensionsclient.Clientset, args InstallFlags) { + applicationCRD := apiextensionsv1beta1.CustomResourceDefinition{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apiextensions.k8s.io/v1alpha1", + Kind: "CustomResourceDefinition", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: application.FullName, + }, + Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ + Group: application.Group, + Version: appv1.SchemeGroupVersion.Version, + Scope: apiextensionsv1beta1.NamespaceScoped, + Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Plural: application.Plural, + Kind: application.Kind, + ShortNames: []string{application.ShortName}, + }, + }, + } + if args.DryRun { + printYAML(applicationCRD) + return + } + + _, err := extensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(&applicationCRD) + if err != nil { + if !apierr.IsAlreadyExists(err) { + log.Fatalf("Failed to create CustomResourceDefinition: %v", err) + } + fmt.Printf("CustomResourceDefinition '%s' already exists\n", workflow.FullName) + } + // wait for CRD being established + var crd *apiextensionsv1beta1.CustomResourceDefinition + err = wait.Poll(500*time.Millisecond, 60*time.Second, func() (bool, error) { + crd, err = extensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(workflow.FullName, 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 { + log.Errorf("Name conflict: %v", cond.Reason) + } + } + } + return false, err + }) + if err != nil { + log.Fatalf("Failed to wait for CustomResourceDefinition: %v", err) + } +} + +func printYAML(obj interface{}) { + objBytes, err := yaml.Marshal(obj) + if err != nil { + log.Fatalf("Failed to marshal %v", obj) + } + fmt.Printf("---\n%s\n", string(objBytes)) +} diff --git a/cmd/argocd/commands/root.go b/cmd/argocd/commands/root.go index d862b1370e28b..ddf667fa00fb5 100644 --- a/cmd/argocd/commands/root.go +++ b/cmd/argocd/commands/root.go @@ -3,12 +3,23 @@ package commands import ( "github.com/argoproj/argo-cd/util/cmd" "github.com/spf13/cobra" + "k8s.io/client-go/tools/clientcmd" + // load the gcp plugin (required to authenticate against GKE clusters). + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + // load the oidc plugin (required to authenticate with OpenID Connect). + _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" ) +type globalFlags struct { + kubeConfigOverrides clientcmd.ConfigOverrides + kubeConfigPath string + logLevel string +} + // NewCommand returns a new instance of an argocd command func NewCommand() *cobra.Command { var ( - logLevel string + globalArgs globalFlags ) var command = &cobra.Command{ Use: cliName, @@ -18,8 +29,13 @@ func NewCommand() *cobra.Command { }, } - command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.PersistentFlags().StringVar(&globalArgs.kubeConfigPath, "kubeconfig", "", "Path to the config file to use for CLI requests.") + globalArgs.kubeConfigOverrides = clientcmd.ConfigOverrides{} + clientcmd.BindOverrideFlags(&globalArgs.kubeConfigOverrides, command.PersistentFlags(), clientcmd.RecommendedConfigOverrideFlags("")) + command.PersistentFlags().StringVar(&globalArgs.logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.AddCommand(cmd.NewVersionCmd(cliName)) command.AddCommand(NewClusterCommand()) + command.AddCommand(NewInstallCommand(&globalArgs)) return command } diff --git a/hack/custom-boilerplate.go.txt b/hack/custom-boilerplate.go.txt new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh new file mode 100755 index 0000000000000..ba3d3b2d35300 --- /dev/null +++ b/hack/update-codegen.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Copyright 2017 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/.. +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)} + +${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ + github.com/argoproj/argo-cd/pkg/client github.com/argoproj/argo-cd/pkg/apis \ + application:v1alpha1 \ + --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt diff --git a/pkg/apis/application/register.go b/pkg/apis/application/register.go new file mode 100644 index 0000000000000..bfe1ed98e40dd --- /dev/null +++ b/pkg/apis/application/register.go @@ -0,0 +1,11 @@ +package application + +// Application constants +const ( + Kind string = "Application" + Group string = "argoproj.io" + Singular string = "application" + Plural string = "applications" + ShortName string = "app" + FullName string = Plural + "." + Group +) diff --git a/pkg/apis/application/v1alpha1/doc.go b/pkg/apis/application/v1alpha1/doc.go new file mode 100644 index 0000000000000..c418575ac04c6 --- /dev/null +++ b/pkg/apis/application/v1alpha1/doc.go @@ -0,0 +1,5 @@ +// Package v1alpha1 is the v1alpha1 version of the API. +// +groupName=argoproj.io +// +k8s:deepcopy-gen=package,register +// +k8s:openapi-gen=true +package v1alpha1 diff --git a/pkg/apis/application/v1alpha1/register.go b/pkg/apis/application/v1alpha1/register.go new file mode 100644 index 0000000000000..db1b7caf25efa --- /dev/null +++ b/pkg/apis/application/v1alpha1/register.go @@ -0,0 +1,35 @@ +package v1alpha1 + +import ( + "github.com/argoproj/argo-cd/pkg/apis/application" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +var ( + // SchemeGroupVersion is group version used to register these objects + SchemeGroupVersion = schema.GroupVersion{Group: application.Group, Version: "v1alpha1"} + SchemaGroupVersionKind = schema.GroupVersionKind{Group: application.Group, Version: "v1alpha1", Kind: application.Kind} +) + +// Resource takes an unqualified resource and returns a Group-qualified GroupResource. +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +// addKnownTypes adds the set of types defined in this package to the supplied scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &Application{}, + &ApplicationList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go new file mode 100644 index 0000000000000..d973b5c975796 --- /dev/null +++ b/pkg/apis/application/v1alpha1/types.go @@ -0,0 +1,58 @@ +package v1alpha1 + +import ( + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// Application is a definition of Application resource. +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type Application struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata"` + Spec ApplicationSpec `json:"spec"` + Status ApplicationStatus `json:"status"` +} + +// ApplicationList is list of Application resources +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type ApplicationList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + Items []Application `json:"items"` +} + +// ApplicationSpec represents desired application state. Contains link to repository with application definition and additional parameters link definition revision. +type ApplicationSpec struct { + TargetRevision string `json:"targetRevision"` + Source ApplicationSource `json:"source"` +} + +// ApplicationSource contains secret reference which has information about github repository, path within repository and target application environment. +type ApplicationSource struct { + // GitRepoSecret is a secret reference which has information about github repository. + GitRepoSecret apiv1.LocalObjectReference `json:"gitRepoSecret"` + // Path is a directory path within repository which contains ksonnet project. + Path string `json:"path"` + // Environment is a ksonnet project environment name. + Environment string `json:"environment"` +} + +// ComparisonResult is a comparison result of application spec and deployed application. +type ComparisonResult string + +// Possible comparison results +const ( + ComparisonResultUnknown ComparisonResult = "Unknown" + ComparisonResultError ComparisonResult = "Error" + ComparisonResultEqual ComparisonResult = "Equal" + ComparisonResultDifferent ComparisonResult = "Different" +) + +// ApplicationStatus contains information about application status in target environment. +type ApplicationStatus struct { + // ComparisonResult is a comparison result of application spec and deployed application. + ComparisonResult ComparisonResult `json:"comparisonResult"` + // DifferenceDetails contains string representation of detected differences between application spec and deployed application. + DifferenceDetails string `json:"differenceDetails"` +} diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 0000000000000..908086bdffff3 --- /dev/null +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,120 @@ +// +build !ignore_autogenerated + +// This file was autogenerated by deepcopy-gen. Do not edit it manually! + +package v1alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Application) DeepCopyInto(out *Application) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Application. +func (in *Application) DeepCopy() *Application { + if in == nil { + return nil + } + out := new(Application) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Application) 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 *ApplicationList) DeepCopyInto(out *ApplicationList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Application, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationList. +func (in *ApplicationList) DeepCopy() *ApplicationList { + if in == nil { + return nil + } + out := new(ApplicationList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ApplicationList) 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 *ApplicationSource) DeepCopyInto(out *ApplicationSource) { + *out = *in + out.GitRepoSecret = in.GitRepoSecret + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSource. +func (in *ApplicationSource) DeepCopy() *ApplicationSource { + if in == nil { + return nil + } + out := new(ApplicationSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplicationSpec) DeepCopyInto(out *ApplicationSpec) { + *out = *in + out.Source = in.Source + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationSpec. +func (in *ApplicationSpec) DeepCopy() *ApplicationSpec { + if in == nil { + return nil + } + out := new(ApplicationSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplicationStatus) DeepCopyInto(out *ApplicationStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplicationStatus. +func (in *ApplicationStatus) DeepCopy() *ApplicationStatus { + if in == nil { + return nil + } + out := new(ApplicationStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/client/clientset/versioned/clientset.go b/pkg/client/clientset/versioned/clientset.go new file mode 100644 index 0000000000000..3d5596672dc83 --- /dev/null +++ b/pkg/client/clientset/versioned/clientset.go @@ -0,0 +1,82 @@ +package versioned + +import ( + argoprojv1alpha1 "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/typed/application/v1alpha1" + glog "github.com/golang/glog" + 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 + ArgoprojV1alpha1() argoprojv1alpha1.ArgoprojV1alpha1Interface + // Deprecated: please explicitly pick a version if possible. + Argoproj() argoprojv1alpha1.ArgoprojV1alpha1Interface +} + +// Clientset contains the clients for groups. Each group has exactly one +// version included in a Clientset. +type Clientset struct { + *discovery.DiscoveryClient + argoprojV1alpha1 *argoprojv1alpha1.ArgoprojV1alpha1Client +} + +// ArgoprojV1alpha1 retrieves the ArgoprojV1alpha1Client +func (c *Clientset) ArgoprojV1alpha1() argoprojv1alpha1.ArgoprojV1alpha1Interface { + return c.argoprojV1alpha1 +} + +// Deprecated: Argoproj retrieves the default version of ArgoprojClient. +// Please explicitly pick a version. +func (c *Clientset) Argoproj() argoprojv1alpha1.ArgoprojV1alpha1Interface { + return c.argoprojV1alpha1 +} + +// 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. +func NewForConfig(c *rest.Config) (*Clientset, error) { + configShallowCopy := *c + if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + } + var cs Clientset + var err error + cs.argoprojV1alpha1, err = argoprojv1alpha1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } + + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + if err != nil { + glog.Errorf("failed to create the DiscoveryClient: %v", err) + 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.argoprojV1alpha1 = argoprojv1alpha1.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.argoprojV1alpha1 = argoprojv1alpha1.New(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClient(c) + return &cs +} diff --git a/pkg/client/clientset/versioned/doc.go b/pkg/client/clientset/versioned/doc.go new file mode 100644 index 0000000000000..2a3e4c6f5649b --- /dev/null +++ b/pkg/client/clientset/versioned/doc.go @@ -0,0 +1,2 @@ +// This package has the automatically generated clientset. +package versioned diff --git a/pkg/client/clientset/versioned/fake/clientset_generated.go b/pkg/client/clientset/versioned/fake/clientset_generated.go new file mode 100644 index 0000000000000..4edbd7d13d100 --- /dev/null +++ b/pkg/client/clientset/versioned/fake/clientset_generated.go @@ -0,0 +1,55 @@ +package fake + +import ( + clientset "github.com/argoproj/argo-cd/pkg/client/clientset/versioned" + argoprojv1alpha1 "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/typed/application/v1alpha1" + fakeargoprojv1alpha1 "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/typed/application/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) + } + } + + fakePtr := testing.Fake{} + fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) + fakePtr.AddWatchReactor("*", testing.DefaultWatchReactor(watch.NewFake(), nil)) + + return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} +} + +// 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 +} + +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + return c.discovery +} + +var _ clientset.Interface = &Clientset{} + +// ArgoprojV1alpha1 retrieves the ArgoprojV1alpha1Client +func (c *Clientset) ArgoprojV1alpha1() argoprojv1alpha1.ArgoprojV1alpha1Interface { + return &fakeargoprojv1alpha1.FakeArgoprojV1alpha1{Fake: &c.Fake} +} + +// Argoproj retrieves the ArgoprojV1alpha1Client +func (c *Clientset) Argoproj() argoprojv1alpha1.ArgoprojV1alpha1Interface { + return &fakeargoprojv1alpha1.FakeArgoprojV1alpha1{Fake: &c.Fake} +} diff --git a/pkg/client/clientset/versioned/fake/doc.go b/pkg/client/clientset/versioned/fake/doc.go new file mode 100644 index 0000000000000..4edd3fa14271f --- /dev/null +++ b/pkg/client/clientset/versioned/fake/doc.go @@ -0,0 +1,2 @@ +// This package has the automatically generated fake clientset. +package fake diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go new file mode 100644 index 0000000000000..4dc231098d458 --- /dev/null +++ b/pkg/client/clientset/versioned/fake/register.go @@ -0,0 +1,37 @@ +package fake + +import ( + argoprojv1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/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" +) + +var scheme = runtime.NewScheme() +var codecs = serializer.NewCodecFactory(scheme) +var parameterCodec = runtime.NewParameterCodec(scheme) + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(scheme) +} + +// 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/kuberentes/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. +func AddToScheme(scheme *runtime.Scheme) { + argoprojv1alpha1.AddToScheme(scheme) + +} diff --git a/pkg/client/clientset/versioned/scheme/doc.go b/pkg/client/clientset/versioned/scheme/doc.go new file mode 100644 index 0000000000000..d6cdaa7cd03b7 --- /dev/null +++ b/pkg/client/clientset/versioned/scheme/doc.go @@ -0,0 +1,2 @@ +// This package contains the scheme of the automatically generated clientset. +package scheme diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go new file mode 100644 index 0000000000000..108c7a3fe9d04 --- /dev/null +++ b/pkg/client/clientset/versioned/scheme/register.go @@ -0,0 +1,37 @@ +package scheme + +import ( + argoprojv1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/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" +) + +var Scheme = runtime.NewScheme() +var Codecs = serializer.NewCodecFactory(Scheme) +var ParameterCodec = runtime.NewParameterCodec(Scheme) + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(Scheme) +} + +// 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/kuberentes/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. +func AddToScheme(scheme *runtime.Scheme) { + argoprojv1alpha1.AddToScheme(scheme) + +} diff --git a/pkg/client/clientset/versioned/typed/application/v1alpha1/application_client.go b/pkg/client/clientset/versioned/typed/application/v1alpha1/application_client.go new file mode 100644 index 0000000000000..1c267880d8df1 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/application/v1alpha1/application_client.go @@ -0,0 +1 @@ +package v1alpha1 diff --git a/pkg/client/clientset/versioned/typed/application/v1alpha1/doc.go b/pkg/client/clientset/versioned/typed/application/v1alpha1/doc.go new file mode 100644 index 0000000000000..592392b59c59b --- /dev/null +++ b/pkg/client/clientset/versioned/typed/application/v1alpha1/doc.go @@ -0,0 +1,2 @@ +// This package has the automatically generated typed clients. +package v1alpha1 diff --git a/pkg/client/clientset/versioned/typed/application/v1alpha1/fake/doc.go b/pkg/client/clientset/versioned/typed/application/v1alpha1/fake/doc.go new file mode 100644 index 0000000000000..798b81175562b --- /dev/null +++ b/pkg/client/clientset/versioned/typed/application/v1alpha1/fake/doc.go @@ -0,0 +1,2 @@ +// Package fake has the automatically generated clients. +package fake diff --git a/pkg/client/clientset/versioned/typed/application/v1alpha1/fake/fake_application_client.go b/pkg/client/clientset/versioned/typed/application/v1alpha1/fake/fake_application_client.go new file mode 100644 index 0000000000000..b66530655222d --- /dev/null +++ b/pkg/client/clientset/versioned/typed/application/v1alpha1/fake/fake_application_client.go @@ -0,0 +1 @@ +package fake diff --git a/pkg/client/clientset/versioned/typed/application/v1alpha1/generated_expansion.go b/pkg/client/clientset/versioned/typed/application/v1alpha1/generated_expansion.go new file mode 100644 index 0000000000000..1c267880d8df1 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/application/v1alpha1/generated_expansion.go @@ -0,0 +1 @@ +package v1alpha1