mirror of
https://github.com/argoproj/argo-cd.git
synced 2026-02-20 09:38:49 +01:00
Compare commits
58 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8544bef56b | ||
|
|
b9090df4fa | ||
|
|
0ac0591fdb | ||
|
|
c48712d988 | ||
|
|
e39f96999e | ||
|
|
08d7b6492b | ||
|
|
24f0efd791 | ||
|
|
39a2e5097a | ||
|
|
de881f398a | ||
|
|
70a7855da0 | ||
|
|
6d8a592509 | ||
|
|
5581a85bff | ||
|
|
156b3de4c5 | ||
|
|
257991b69c | ||
|
|
c26c4729a1 | ||
|
|
2a79017c5f | ||
|
|
7fe92adaed | ||
|
|
59d564017e | ||
|
|
6d8d805f92 | ||
|
|
f5ab4d55c3 | ||
|
|
8cfb628d24 | ||
|
|
3c95a4a3c4 | ||
|
|
c924350adf | ||
|
|
4633eb6db8 | ||
|
|
7089e6b0f9 | ||
|
|
513f773ae8 | ||
|
|
75db0b6c8c | ||
|
|
0860b032ec | ||
|
|
ba267f627a | ||
|
|
3000146574 | ||
|
|
686ec75e0a | ||
|
|
d08534f068 | ||
|
|
7c0fd908a0 | ||
|
|
e530a4780e | ||
|
|
8c76771a05 | ||
|
|
65f430c395 | ||
|
|
d409014da7 | ||
|
|
cfddf23275 | ||
|
|
5698d1b6b1 | ||
|
|
0e6895472b | ||
|
|
b7e0f91478 | ||
|
|
78ab336c86 | ||
|
|
a86e074b1f | ||
|
|
b742c66b14 | ||
|
|
e2756210d9 | ||
|
|
97565c0895 | ||
|
|
9a6f9ff824 | ||
|
|
290cefaedd | ||
|
|
69e49d708f | ||
|
|
e27be81947 | ||
|
|
4febc66a64 | ||
|
|
a984af76f1 | ||
|
|
be6a0fc21f | ||
|
|
122729e2a4 | ||
|
|
84635d4dbe | ||
|
|
46550e009b | ||
|
|
683b9072b8 | ||
|
|
33e66dcf5e |
@@ -309,6 +309,8 @@ jobs:
|
||||
make test-e2e | tee /tmp/test-results/go-e2e.out
|
||||
environment:
|
||||
ARGOCD_OPTS: "--server localhost:8080 --plaintext"
|
||||
ARGOCD_E2E_EXPECT_TIMEOUT: "30"
|
||||
ARGOCD_E2E_K3S: "true"
|
||||
- store_test_results:
|
||||
path: /tmp/test-results
|
||||
ui:
|
||||
|
||||
@@ -96,6 +96,8 @@ RUN cd ${GOPATH}/src/dummy && \
|
||||
####################################################################################################
|
||||
FROM $BASE_IMAGE as argocd-base
|
||||
|
||||
USER root
|
||||
|
||||
RUN groupadd -g 999 argocd && \
|
||||
useradd -r -u 999 -g argocd argocd && \
|
||||
mkdir -p /home/argocd && \
|
||||
|
||||
175
Gopkg.lock
generated
175
Gopkg.lock
generated
@@ -70,14 +70,15 @@
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:e8ec0abbf32fdcc9f7eb14c0656c1d0fc2fc7ec8f60dff4b7ac080c50afd8e49"
|
||||
digest = "1:4f6afcf4ebe041b3d4aa7926d09344b48d2f588e1f957526bbbe54f9cbb366a1"
|
||||
name = "github.com/argoproj/pkg"
|
||||
packages = [
|
||||
"exec",
|
||||
"rand",
|
||||
"time",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "88ab0e836a8e8c70bc297c5764669bd7da27afd1"
|
||||
revision = "38dba6e98495680ff1f8225642b63db10a96bb06"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:d8a2bb36a048d1571bcc1aee208b61f39dc16c6c53823feffd37449dde162507"
|
||||
@@ -417,14 +418,6 @@
|
||||
revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5"
|
||||
version = "v1.2.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:1e5b1e14524ed08301977b7b8e10c719ed853cbf3f24ecb66fae783a46f207a6"
|
||||
name = "github.com/google/btree"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:14d826ee25139b4674e9768ac287a135f4e7c14e1134a5b15e4e152edfd49f41"
|
||||
name = "github.com/google/go-jsonnet"
|
||||
@@ -472,17 +465,6 @@
|
||||
revision = "66b9c49e59c6c48f0ffce28c2d8b8a5678502c6d"
|
||||
version = "v1.4.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:009a1928b8c096338b68b5822d838a72b4d8520715c1463614476359f3282ec8"
|
||||
name = "github.com/gregjones/httpcache"
|
||||
packages = [
|
||||
".",
|
||||
"diskcache",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "9cad4c3443a7200dd6400aef47183728de563a38"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:9dca8c981b8aed7448d94e78bc68a76784867a38b3036d5aabc0b32d92ffd1f4"
|
||||
@@ -680,22 +662,6 @@
|
||||
revision = "c37440a7cf42ac63b919c752ca73a85067e05992"
|
||||
version = "v0.2.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:c24598ffeadd2762552269271b3b1510df2d83ee6696c1e543a0ff653af494bc"
|
||||
name = "github.com/petar/GoLLRB"
|
||||
packages = ["llrb"]
|
||||
pruneopts = ""
|
||||
revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:b46305723171710475f2dd37547edd57b67b9de9f2a6267cafdd98331fd6897f"
|
||||
name = "github.com/peterbourgon/diskv"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "5f041e8faa004a95c88a202771f4cc3e991971e6"
|
||||
version = "v2.0.1"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:7365acd48986e205ccb8652cc746f09c8b7876030d53710ea6ef7d0bd0dcd7ca"
|
||||
name = "github.com/pkg/errors"
|
||||
@@ -1033,6 +999,39 @@
|
||||
pruneopts = ""
|
||||
revision = "5e776fee60db37e560cee3fb46db699d2f095386"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:e9e4b928898842a138bc345d42aae33741baa6d64f3ca69b0931f9c7a4fd0437"
|
||||
name = "gonum.org/v1/gonum"
|
||||
packages = [
|
||||
"blas",
|
||||
"blas/blas64",
|
||||
"blas/cblas128",
|
||||
"blas/gonum",
|
||||
"floats",
|
||||
"graph",
|
||||
"graph/internal/linear",
|
||||
"graph/internal/ordered",
|
||||
"graph/internal/set",
|
||||
"graph/internal/uid",
|
||||
"graph/iterator",
|
||||
"graph/simple",
|
||||
"graph/topo",
|
||||
"graph/traverse",
|
||||
"internal/asm/c128",
|
||||
"internal/asm/c64",
|
||||
"internal/asm/f32",
|
||||
"internal/asm/f64",
|
||||
"internal/cmplx64",
|
||||
"internal/math32",
|
||||
"lapack",
|
||||
"lapack/gonum",
|
||||
"lapack/lapack64",
|
||||
"mat",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "90b7154515874cee6c33cf56b29e257403a09a69"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:934fb8966f303ede63aa405e2c8d7f0a427a05ea8df335dfdc1833dd4d40756f"
|
||||
name = "google.golang.org/appengine"
|
||||
@@ -1225,16 +1224,16 @@
|
||||
version = "v2.2.2"
|
||||
|
||||
[[projects]]
|
||||
branch = "release-1.12"
|
||||
digest = "1:3e3e9df293bd6f9fd64effc9fa1f0edcd97e6c74145cd9ab05d35719004dc41f"
|
||||
branch = "release-1.14"
|
||||
digest = "1:d8a6f1ec98713e685346a2e4b46c6ec4a1792a5535f8b0dffe3b1c08c9d69b12"
|
||||
name = "k8s.io/api"
|
||||
packages = [
|
||||
"admission/v1beta1",
|
||||
"admissionregistration/v1alpha1",
|
||||
"admissionregistration/v1beta1",
|
||||
"apps/v1",
|
||||
"apps/v1beta1",
|
||||
"apps/v1beta2",
|
||||
"auditregistration/v1alpha1",
|
||||
"authentication/v1",
|
||||
"authentication/v1beta1",
|
||||
"authorization/v1",
|
||||
@@ -1246,16 +1245,21 @@
|
||||
"batch/v1beta1",
|
||||
"batch/v2alpha1",
|
||||
"certificates/v1beta1",
|
||||
"coordination/v1",
|
||||
"coordination/v1beta1",
|
||||
"core/v1",
|
||||
"events/v1beta1",
|
||||
"extensions/v1beta1",
|
||||
"imagepolicy/v1alpha1",
|
||||
"networking/v1",
|
||||
"networking/v1beta1",
|
||||
"node/v1alpha1",
|
||||
"node/v1beta1",
|
||||
"policy/v1beta1",
|
||||
"rbac/v1",
|
||||
"rbac/v1alpha1",
|
||||
"rbac/v1beta1",
|
||||
"scheduling/v1",
|
||||
"scheduling/v1alpha1",
|
||||
"scheduling/v1beta1",
|
||||
"settings/v1alpha1",
|
||||
@@ -1264,7 +1268,7 @@
|
||||
"storage/v1beta1",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "6db15a15d2d3874a6c3ddb2140ac9f3bc7058428"
|
||||
revision = "40a48860b5abbba9aa891b02b32da429b08d96a0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
@@ -1273,14 +1277,13 @@
|
||||
packages = [
|
||||
"pkg/apis/apiextensions",
|
||||
"pkg/apis/apiextensions/v1beta1",
|
||||
"pkg/features",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "7f7d2b94eca3a7a1c49840e119a8bc03c3afb1e3"
|
||||
|
||||
[[projects]]
|
||||
branch = "release-1.12"
|
||||
digest = "1:5899da40e41bcc8c1df101b72954096bba9d85b763bc17efc846062ccc111c7b"
|
||||
branch = "release-1.14"
|
||||
digest = "1:a802c91b189a31200cfb66744441fe62dac961ec7c5c58c47716570de7da195c"
|
||||
name = "k8s.io/apimachinery"
|
||||
packages = [
|
||||
"pkg/api/equality",
|
||||
@@ -1332,22 +1335,11 @@
|
||||
"third_party/forked/golang/reflect",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "f71dbbc36e126f5a371b85f6cca96bc8c57db2b6"
|
||||
revision = "6a84e37a896db9780c75367af8d2ed2bb944022e"
|
||||
|
||||
[[projects]]
|
||||
branch = "release-1.12"
|
||||
digest = "1:b2c55ff9df6d053e40094b943f949c257c3f7dcdbb035c11487c93c96df9eade"
|
||||
name = "k8s.io/apiserver"
|
||||
packages = [
|
||||
"pkg/features",
|
||||
"pkg/util/feature",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "5e1c1f41ee34b3bb153f928f8c91c2a6dd9482a9"
|
||||
|
||||
[[projects]]
|
||||
branch = "release-9.0"
|
||||
digest = "1:77bf3d9f18ec82e08ac6c4c7e2d9d1a2ef8d16b25d3ff72fcefcf9256d751573"
|
||||
branch = "release-11.0"
|
||||
digest = "1:794140b3ac07405646ea3d4a57e1f6155186e672aed8aa0c996779381cd92fe6"
|
||||
name = "k8s.io/client-go"
|
||||
packages = [
|
||||
"discovery",
|
||||
@@ -1359,8 +1351,6 @@
|
||||
"kubernetes",
|
||||
"kubernetes/fake",
|
||||
"kubernetes/scheme",
|
||||
"kubernetes/typed/admissionregistration/v1alpha1",
|
||||
"kubernetes/typed/admissionregistration/v1alpha1/fake",
|
||||
"kubernetes/typed/admissionregistration/v1beta1",
|
||||
"kubernetes/typed/admissionregistration/v1beta1/fake",
|
||||
"kubernetes/typed/apps/v1",
|
||||
@@ -1369,6 +1359,8 @@
|
||||
"kubernetes/typed/apps/v1beta1/fake",
|
||||
"kubernetes/typed/apps/v1beta2",
|
||||
"kubernetes/typed/apps/v1beta2/fake",
|
||||
"kubernetes/typed/auditregistration/v1alpha1",
|
||||
"kubernetes/typed/auditregistration/v1alpha1/fake",
|
||||
"kubernetes/typed/authentication/v1",
|
||||
"kubernetes/typed/authentication/v1/fake",
|
||||
"kubernetes/typed/authentication/v1beta1",
|
||||
@@ -1391,6 +1383,8 @@
|
||||
"kubernetes/typed/batch/v2alpha1/fake",
|
||||
"kubernetes/typed/certificates/v1beta1",
|
||||
"kubernetes/typed/certificates/v1beta1/fake",
|
||||
"kubernetes/typed/coordination/v1",
|
||||
"kubernetes/typed/coordination/v1/fake",
|
||||
"kubernetes/typed/coordination/v1beta1",
|
||||
"kubernetes/typed/coordination/v1beta1/fake",
|
||||
"kubernetes/typed/core/v1",
|
||||
@@ -1401,6 +1395,12 @@
|
||||
"kubernetes/typed/extensions/v1beta1/fake",
|
||||
"kubernetes/typed/networking/v1",
|
||||
"kubernetes/typed/networking/v1/fake",
|
||||
"kubernetes/typed/networking/v1beta1",
|
||||
"kubernetes/typed/networking/v1beta1/fake",
|
||||
"kubernetes/typed/node/v1alpha1",
|
||||
"kubernetes/typed/node/v1alpha1/fake",
|
||||
"kubernetes/typed/node/v1beta1",
|
||||
"kubernetes/typed/node/v1beta1/fake",
|
||||
"kubernetes/typed/policy/v1beta1",
|
||||
"kubernetes/typed/policy/v1beta1/fake",
|
||||
"kubernetes/typed/rbac/v1",
|
||||
@@ -1409,6 +1409,8 @@
|
||||
"kubernetes/typed/rbac/v1alpha1/fake",
|
||||
"kubernetes/typed/rbac/v1beta1",
|
||||
"kubernetes/typed/rbac/v1beta1/fake",
|
||||
"kubernetes/typed/scheduling/v1",
|
||||
"kubernetes/typed/scheduling/v1/fake",
|
||||
"kubernetes/typed/scheduling/v1alpha1",
|
||||
"kubernetes/typed/scheduling/v1alpha1/fake",
|
||||
"kubernetes/typed/scheduling/v1beta1",
|
||||
@@ -1445,23 +1447,22 @@
|
||||
"tools/remotecommand",
|
||||
"transport",
|
||||
"transport/spdy",
|
||||
"util/buffer",
|
||||
"util/cert",
|
||||
"util/connrotation",
|
||||
"util/exec",
|
||||
"util/flowcontrol",
|
||||
"util/homedir",
|
||||
"util/integer",
|
||||
"util/jsonpath",
|
||||
"util/keyutil",
|
||||
"util/retry",
|
||||
"util/workqueue",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "13596e875accbd333e0b5bd5fd9462185acd9958"
|
||||
revision = "11646d1007e006f6f24995cb905c68bc62901c81"
|
||||
|
||||
[[projects]]
|
||||
branch = "release-1.12"
|
||||
digest = "1:8108815d1aef9159daabdb3f0fcef04a88765536daf0c0cd29a31fdba135ee54"
|
||||
branch = "release-1.14"
|
||||
digest = "1:742ce70d2c6de0f02b5331a25d4d549f55de6b214af22044455fd6e6b451cad9"
|
||||
name = "k8s.io/code-generator"
|
||||
packages = [
|
||||
"cmd/go-to-protobuf",
|
||||
@@ -1470,7 +1471,7 @@
|
||||
"third_party/forked/golang/reflect",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "b1289fc74931d4b6b04bd1a259acfc88a2cb0a66"
|
||||
revision = "50b561225d70b3eb79a1faafd3dfe7b1a62cbe73"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
@@ -1488,15 +1489,15 @@
|
||||
revision = "e17681d19d3ac4837a019ece36c2a0ec31ffe985"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:4f5eb833037cc0ba0bf8fe9cae6be9df62c19dd1c869415275c708daa8ccfda5"
|
||||
digest = "1:9eaf86f4f6fb4a8f177220d488ef1e3255d06a691cca95f14ef085d4cd1cef3c"
|
||||
name = "k8s.io/klog"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "a5bc97fbc634d635061f3146511332c7e313a55a"
|
||||
version = "v0.1.0"
|
||||
revision = "d98d8acdac006fb39831f1b25640813fef9c314f"
|
||||
version = "v0.3.3"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:aae856b28533bfdb39112514290f7722d00a55a99d2d0b897c6ee82e6feb87b3"
|
||||
digest = "1:42ea993b351fdd39b9aad3c9ebe71f2fdb5d1f8d12eed24e71c3dff1a31b2a43"
|
||||
name = "k8s.io/kube-openapi"
|
||||
packages = [
|
||||
"cmd/openapi-gen",
|
||||
@@ -1508,10 +1509,11 @@
|
||||
"pkg/util/sets",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "master"
|
||||
revision = "411b2483e5034420675ebcdd4a55fc76fe5e55cf"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:6061aa42761235df375f20fa4a1aa6d1845cba3687575f3adb2ef3f3bc540af5"
|
||||
branch = "release-1.14"
|
||||
digest = "1:78aa6079e011ece0d28513c7fe1bd64284fa9eb5d671760803a839ffdf0e9e38"
|
||||
name = "k8s.io/kubernetes"
|
||||
packages = [
|
||||
"pkg/api/v1/pod",
|
||||
@@ -1519,19 +1521,25 @@
|
||||
"pkg/apis/autoscaling",
|
||||
"pkg/apis/batch",
|
||||
"pkg/apis/core",
|
||||
"pkg/apis/extensions",
|
||||
"pkg/apis/networking",
|
||||
"pkg/apis/policy",
|
||||
"pkg/features",
|
||||
"pkg/kubectl/scheme",
|
||||
"pkg/kubectl/util/term",
|
||||
"pkg/kubelet/apis",
|
||||
"pkg/util/interrupt",
|
||||
"pkg/util/node",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "17c77c7898218073f14c8d573582e8d2313dc740"
|
||||
version = "v1.12.2"
|
||||
revision = "2d20b5759406ded89f8b25cf085ff4733b144ba5"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:4c5d39f7ca1c940d7e74dbc62d2221e2c59b3d35c54f1fa9c77f3fd3113bbcb1"
|
||||
name = "k8s.io/utils"
|
||||
packages = [
|
||||
"buffer",
|
||||
"integer",
|
||||
"trace",
|
||||
]
|
||||
pruneopts = ""
|
||||
revision = "c55fbcfc754a5b2ec2fbae8fb9dcac36bdba6a12"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
@@ -1541,6 +1549,14 @@
|
||||
pruneopts = ""
|
||||
revision = "97fed8db84274c421dbfffbb28ec859901556b97"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:321081b4a44256715f2b68411d8eda9a17f17ebfe6f0cc61d2cc52d11c08acfa"
|
||||
name = "sigs.k8s.io/yaml"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "fd68e9863619f6ec2fdd8625fe1f02e7c877e480"
|
||||
version = "v1.1.0"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
@@ -1671,6 +1687,7 @@
|
||||
"k8s.io/client-go/util/flowcontrol",
|
||||
"k8s.io/client-go/util/workqueue",
|
||||
"k8s.io/code-generator/cmd/go-to-protobuf",
|
||||
"k8s.io/klog",
|
||||
"k8s.io/kube-openapi/cmd/openapi-gen",
|
||||
"k8s.io/kube-openapi/pkg/common",
|
||||
"k8s.io/kubernetes/pkg/api/v1/pod",
|
||||
|
||||
24
Gopkg.toml
24
Gopkg.toml
@@ -35,16 +35,24 @@ required = [
|
||||
name = "github.com/prometheus/client_golang"
|
||||
revision = "7858729281ec582767b20e0d696b6041d995d5e0"
|
||||
|
||||
[[constraint]]
|
||||
branch = "release-1.12"
|
||||
[[override]]
|
||||
branch = "release-1.14"
|
||||
name = "k8s.io/api"
|
||||
|
||||
[[constraint]]
|
||||
branch = "release-1.12"
|
||||
[[override]]
|
||||
branch = "release-1.14"
|
||||
name = "k8s.io/kubernetes"
|
||||
|
||||
[[override]]
|
||||
branch = "release-1.14"
|
||||
name = "k8s.io/code-generator"
|
||||
|
||||
[[constraint]]
|
||||
branch = "release-9.0"
|
||||
[[override]]
|
||||
branch = "release-1.14"
|
||||
name = "k8s.io/apimachinery"
|
||||
|
||||
[[override]]
|
||||
branch = "release-11.0"
|
||||
name = "k8s.io/client-go"
|
||||
|
||||
[[constraint]]
|
||||
@@ -63,6 +71,8 @@ required = [
|
||||
branch = "master"
|
||||
name = "github.com/yudai/gojsondiff"
|
||||
|
||||
# TODO: move off of k8s.io/kube-openapi and use controller-tools for CRD spec generation
|
||||
# (override argoproj/argo contraint on master)
|
||||
[[override]]
|
||||
revision = "master"
|
||||
revision = "411b2483e5034420675ebcdd4a55fc76fe5e55cf"
|
||||
name = "k8s.io/kube-openapi"
|
||||
|
||||
@@ -15,6 +15,7 @@ p, role:admin, applications, create, */*, allow
|
||||
p, role:admin, applications, update, */*, allow
|
||||
p, role:admin, applications, delete, */*, allow
|
||||
p, role:admin, applications, sync, */*, allow
|
||||
p, role:admin, applications, override, */*, allow
|
||||
p, role:admin, clusters, create, *, allow
|
||||
p, role:admin, clusters, update, *, allow
|
||||
p, role:admin, clusters, delete, *, allow
|
||||
|
||||
|
@@ -868,6 +868,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/clusters/{server}/rotate-auth": {
|
||||
"post": {
|
||||
"tags": [
|
||||
"ClusterService"
|
||||
],
|
||||
"summary": "RotateAuth returns a cluster by server address",
|
||||
"operationId": "RotateAuth",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "server",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "(empty)",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/clusterClusterResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/projects": {
|
||||
"get": {
|
||||
"tags": [
|
||||
@@ -1471,6 +1496,12 @@
|
||||
"type": "boolean",
|
||||
"format": "boolean"
|
||||
},
|
||||
"manifests": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
@@ -1977,6 +2008,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"v1Fields": {
|
||||
"type": "object",
|
||||
"title": "Fields stores a set of fields in a data structure like a Trie.\nTo understand how this is used, see: https://github.com/kubernetes-sigs/structured-merge-diff",
|
||||
"properties": {
|
||||
"map": {
|
||||
"description": "Map stores a set of fields in a data structure like a Trie.\n\nEach key is either a '.' representing the field itself, and will always map to an empty set,\nor a string representing a sub-field or item. The string will follow one of these four formats:\n'f:<name>', where <name> is the name of a field in a struct, or key in a map\n'v:<value>', where <value> is the exact json formatted value of a list item\n'i:<index>', where <index> is position of a item in a list\n'k:<keys>', where <keys> is a map of a list item's key fields to their unique values\nIf a key maps to an empty Fields value, the field that key represents is part of the set.\n\nThe exact format is defined in k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal",
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"$ref": "#/definitions/v1Fields"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"v1GroupKind": {
|
||||
"description": "+protobuf.options.(gogoproto.goproto_stringer)=false",
|
||||
"type": "object",
|
||||
@@ -2048,6 +2092,30 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"v1ManagedFieldsEntry": {
|
||||
"description": "ManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource\nthat the fieldset applies to.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
"description": "APIVersion defines the version of this resource that this field set\napplies to. The format is \"group/version\" just like the top-level\nAPIVersion field. It is necessary to track the version of a field\nset because it cannot be automatically converted.",
|
||||
"type": "string"
|
||||
},
|
||||
"fields": {
|
||||
"$ref": "#/definitions/v1Fields"
|
||||
},
|
||||
"manager": {
|
||||
"description": "Manager is an identifier of the workflow managing these fields.",
|
||||
"type": "string"
|
||||
},
|
||||
"operation": {
|
||||
"description": "Operation is the type of operation which lead to this ManagedFieldsEntry being created.\nThe only valid values for this field are 'Apply' and 'Update'.",
|
||||
"type": "string"
|
||||
},
|
||||
"time": {
|
||||
"$ref": "#/definitions/v1Time"
|
||||
}
|
||||
}
|
||||
},
|
||||
"v1MicroTime": {
|
||||
"description": "MicroTime is version of Time with microsecond level precision.\n\n+protobuf.options.marshal=false\n+protobuf.as=Timestamp\n+protobuf.options.(gogoproto.goproto_stringer)=false",
|
||||
"type": "object",
|
||||
@@ -2116,6 +2184,13 @@
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"managedFields": {
|
||||
"description": "ManagedFields maps workflow-id and version to the set of fields\nthat are managed by that workflow. This is mostly for internal\nhousekeeping, and users typically shouldn't need to set or\nunderstand this field. A workflow can be the user's name, a\ncontroller's name, or the name of a specific apply path like\n\"ci-cd\". The set of fields is always in the version that the\nworkflow used when modifying the object.\n\nThis field is alpha and can be changed or removed without notice.\n\n+optional",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/v1ManagedFieldsEntry"
|
||||
}
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "Name must be unique within a namespace. Is required when creating resources, although\nsome resources may allow a client to request the generation of an appropriate name\nautomatically. Name is primarily intended for creation idempotence and configuration\ndefinition.\nCannot be updated.\nMore info: http://kubernetes.io/docs/user-guide/identifiers#names\n+optional"
|
||||
@@ -2180,7 +2255,7 @@
|
||||
}
|
||||
},
|
||||
"v1OwnerReference": {
|
||||
"description": "OwnerReference contains enough information to let you identify an owning\nobject. Currently, an owning object must be in the same namespace, so there\nis no namespace field.",
|
||||
"description": "OwnerReference contains enough information to let you identify an owning\nobject. An owning object must be in the same namespace as the dependent, or\nbe cluster-scoped, so there is no namespace field.",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
@@ -3320,6 +3395,13 @@
|
||||
"format": "boolean",
|
||||
"title": "DryRun will perform a `kubectl apply --dry-run` without actually performing the sync"
|
||||
},
|
||||
"manifests": {
|
||||
"type": "array",
|
||||
"title": "Manifests is an optional field that overrides sync source with a local directory for development",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"prune": {
|
||||
"type": "boolean",
|
||||
"format": "boolean",
|
||||
|
||||
@@ -7,7 +7,8 @@ import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
"github.com/argoproj/argo-cd/reposerver/metrics"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
@@ -47,13 +48,15 @@ func newCommand() *cobra.Command {
|
||||
cache, err := cacheSrc()
|
||||
errors.CheckError(err)
|
||||
|
||||
server, err := reposerver.NewServer(git.NewFactory(), cache, tlsConfigCustomizer, parallelismLimit)
|
||||
metricsServer := metrics.NewMetricsServer(git.NewFactory())
|
||||
server, err := reposerver.NewServer(metricsServer, cache, tlsConfigCustomizer, parallelismLimit)
|
||||
errors.CheckError(err)
|
||||
|
||||
grpc := server.CreateGRPC()
|
||||
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", listenPort))
|
||||
errors.CheckError(err)
|
||||
|
||||
http.Handle("/metrics", promhttp.Handler())
|
||||
http.Handle("/metrics", metricsServer.GetHandler())
|
||||
go func() { errors.CheckError(http.ListenAndServe(fmt.Sprintf(":%d", metricsPort), nil)) }()
|
||||
|
||||
log.Infof("argocd-repo-server %s serving on %s", common.GetVersion(), listener.Addr())
|
||||
|
||||
@@ -22,19 +22,20 @@ import (
|
||||
// NewCommand returns a new instance of an argocd command
|
||||
func NewCommand() *cobra.Command {
|
||||
var (
|
||||
insecure bool
|
||||
listenPort int
|
||||
metricsPort int
|
||||
logLevel string
|
||||
glogLevel int
|
||||
clientConfig clientcmd.ClientConfig
|
||||
staticAssetsDir string
|
||||
baseHRef string
|
||||
repoServerAddress string
|
||||
dexServerAddress string
|
||||
disableAuth bool
|
||||
tlsConfigCustomizerSrc func() (tls.ConfigCustomizer, error)
|
||||
cacheSrc func() (*cache.Cache, error)
|
||||
insecure bool
|
||||
listenPort int
|
||||
metricsPort int
|
||||
logLevel string
|
||||
glogLevel int
|
||||
clientConfig clientcmd.ClientConfig
|
||||
repoServerTimeoutSeconds int
|
||||
staticAssetsDir string
|
||||
baseHRef string
|
||||
repoServerAddress string
|
||||
dexServerAddress string
|
||||
disableAuth bool
|
||||
tlsConfigCustomizerSrc func() (tls.ConfigCustomizer, error)
|
||||
cacheSrc func() (*cache.Cache, error)
|
||||
)
|
||||
var command = &cobra.Command{
|
||||
Use: cliName,
|
||||
@@ -59,7 +60,7 @@ func NewCommand() *cobra.Command {
|
||||
|
||||
kubeclientset := kubernetes.NewForConfigOrDie(config)
|
||||
appclientset := appclientset.NewForConfigOrDie(config)
|
||||
repoclientset := reposerver.NewRepoServerClientset(repoServerAddress, 0)
|
||||
repoclientset := reposerver.NewRepoServerClientset(repoServerAddress, repoServerTimeoutSeconds)
|
||||
|
||||
argoCDOpts := server.ArgoCDServerOpts{
|
||||
Insecure: insecure,
|
||||
@@ -103,6 +104,7 @@ func NewCommand() *cobra.Command {
|
||||
command.AddCommand(cli.NewVersionCmd(cliName))
|
||||
command.Flags().IntVar(&listenPort, "port", common.DefaultPortAPIServer, "Listen on given port")
|
||||
command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortArgoCDAPIServerMetrics, "Start metrics on given port")
|
||||
command.Flags().IntVar(&repoServerTimeoutSeconds, "repo-server-timeout-seconds", 60, "Repo server RPC call timeout seconds.")
|
||||
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(command)
|
||||
cacheSrc = cache.AddCacheFlagsToCmd(command)
|
||||
return command
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"path"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"text/tabwriter"
|
||||
@@ -612,6 +613,18 @@ func liveObjects(resources []*argoappv1.ResourceDiff) ([]*unstructured.Unstructu
|
||||
}
|
||||
|
||||
func getLocalObjects(app *argoappv1.Application, local string, appLabelKey string) []*unstructured.Unstructured {
|
||||
manifestStrings := getLocalObjectsString(app, local, appLabelKey)
|
||||
objs := make([]*unstructured.Unstructured, len(manifestStrings))
|
||||
for i := range manifestStrings {
|
||||
obj := unstructured.Unstructured{}
|
||||
err := json.Unmarshal([]byte(manifestStrings[i]), &obj)
|
||||
errors.CheckError(err)
|
||||
objs[i] = &obj
|
||||
}
|
||||
return objs
|
||||
}
|
||||
|
||||
func getLocalObjectsString(app *argoappv1.Application, local string, appLabelKey string) []string {
|
||||
res, err := repository.GenerateManifests(local, &repository.ManifestRequest{
|
||||
ApplicationSource: &app.Spec.Source,
|
||||
AppLabelKey: appLabelKey,
|
||||
@@ -619,14 +632,8 @@ func getLocalObjects(app *argoappv1.Application, local string, appLabelKey strin
|
||||
Namespace: app.Spec.Destination.Namespace,
|
||||
})
|
||||
errors.CheckError(err)
|
||||
objs := make([]*unstructured.Unstructured, len(res.Manifests))
|
||||
for i := range res.Manifests {
|
||||
obj := unstructured.Unstructured{}
|
||||
err = json.Unmarshal([]byte(res.Manifests[i]), &obj)
|
||||
errors.CheckError(err)
|
||||
objs[i] = &obj
|
||||
}
|
||||
return objs
|
||||
|
||||
return res.Manifests
|
||||
}
|
||||
|
||||
type resourceInfoProvider struct {
|
||||
@@ -1047,30 +1054,47 @@ func NewApplicationWaitCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
|
||||
// printAppResources prints the resources of an application in a tabwriter table
|
||||
func printAppResources(w io.Writer, app *argoappv1.Application) {
|
||||
_, _ = fmt.Fprintf(w, "GROUP\tKIND\tNAMESPACE\tNAME\tSTATUS\tHEALTH\tHOOK\tMESSAGE\n")
|
||||
for _, res := range app.Status.Resources {
|
||||
status := ""
|
||||
if res.Health != nil {
|
||||
status = res.Health.Status
|
||||
}
|
||||
|
||||
// if an operation has occurred, we search for the result and print that out
|
||||
operationState := app.Status.OperationState
|
||||
if operationState != nil && operationState.SyncResult != nil {
|
||||
// in most cases you'll only get one instance (if it is a non-hook resource, or a hook for a single phase),
|
||||
// but in edge-cases you may get more than one
|
||||
for _, result := range operationState.SyncResult.Resources.Filter(func(r *argoappv1.ResourceResult) bool {
|
||||
return r.Group == res.Group && r.Kind == res.Kind && r.Namespace == res.Namespace && r.Name == res.Name
|
||||
}) {
|
||||
// for hooks, we print the result of the operation, not the sync status
|
||||
if res.Hook {
|
||||
status = string(result.HookPhase)
|
||||
resourceByKey := make(map[kube.ResourceKey]argoappv1.ResourceStatus)
|
||||
for i := range app.Status.Resources {
|
||||
res := app.Status.Resources[i]
|
||||
resourceByKey[kube.NewResourceKey(res.Group, res.Kind, res.Namespace, res.Name)] = res
|
||||
}
|
||||
|
||||
// print most resources info along with most recent operation results
|
||||
if app.Status.OperationState != nil && app.Status.OperationState.SyncResult != nil {
|
||||
for _, res := range app.Status.OperationState.SyncResult.Resources {
|
||||
sync := string(res.HookPhase)
|
||||
health := string(res.Status)
|
||||
key := kube.NewResourceKey(res.Group, res.Kind, res.Namespace, res.Name)
|
||||
if resource, ok := resourceByKey[key]; ok && res.HookType == "" {
|
||||
health = argoappv1.HealthStatusUnknown
|
||||
if resource.Health != nil {
|
||||
health = resource.Health.Status
|
||||
}
|
||||
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", res.Group, res.Kind, res.Namespace, res.Name, res.Status, status, result.HookType, result.Message)
|
||||
sync = string(resource.Status)
|
||||
}
|
||||
} else {
|
||||
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", res.Group, res.Kind, res.Namespace, res.Name, res.Status, status, "", "")
|
||||
|
||||
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", res.Group, res.Kind, res.Namespace, res.Name, sync, health, res.HookType, res.Message)
|
||||
delete(resourceByKey, kube.NewResourceKey(res.Group, res.Kind, res.Namespace, res.Name))
|
||||
}
|
||||
}
|
||||
resKeys := make([]kube.ResourceKey, 0)
|
||||
for k := range resourceByKey {
|
||||
resKeys = append(resKeys, k)
|
||||
}
|
||||
sort.Slice(resKeys, func(i, j int) bool {
|
||||
return resKeys[i].String() < resKeys[j].String()
|
||||
})
|
||||
// print rest of resources which were not part of most recent operation
|
||||
for _, resKey := range resKeys {
|
||||
res := resourceByKey[resKey]
|
||||
health := argoappv1.HealthStatusUnknown
|
||||
if res.Health != nil {
|
||||
health = res.Health.Status
|
||||
}
|
||||
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", res.Group, res.Kind, res.Namespace, res.Name, res.Status, health, "", "")
|
||||
}
|
||||
}
|
||||
|
||||
// NewApplicationSyncCommand returns a new instance of an `argocd app sync` command
|
||||
@@ -1085,6 +1109,7 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
|
||||
strategy string
|
||||
force bool
|
||||
async bool
|
||||
local string
|
||||
)
|
||||
var command = &cobra.Command{
|
||||
Use: "sync APPNAME",
|
||||
@@ -1143,12 +1168,31 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
|
||||
|
||||
selectedResources := parseSelectedResources(resources)
|
||||
|
||||
var localObjsStrings []string
|
||||
if local != "" {
|
||||
app, err := appIf.Get(context.Background(), &applicationpkg.ApplicationQuery{Name: &appName})
|
||||
|
||||
if app.Spec.SyncPolicy != nil && app.Spec.SyncPolicy.Automated != nil {
|
||||
log.Fatal("Cannot use local sync when Automatic Sync Policy is enabled")
|
||||
}
|
||||
|
||||
errors.CheckError(err)
|
||||
conn, settingsIf := acdClient.NewSettingsClientOrDie()
|
||||
argoSettings, err := settingsIf.Get(context.Background(), &settingspkg.SettingsQuery{})
|
||||
errors.CheckError(err)
|
||||
util.Close(conn)
|
||||
|
||||
localObjsStrings = getLocalObjectsString(app, local, argoSettings.AppLabelKey)
|
||||
|
||||
}
|
||||
|
||||
syncReq := applicationpkg.ApplicationSyncRequest{
|
||||
Name: &appName,
|
||||
DryRun: dryRun,
|
||||
Revision: revision,
|
||||
Resources: selectedResources,
|
||||
Prune: prune,
|
||||
Manifests: localObjsStrings,
|
||||
}
|
||||
switch strategy {
|
||||
case "apply":
|
||||
@@ -1191,6 +1235,7 @@ func NewApplicationSyncCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
|
||||
command.Flags().StringVar(&strategy, "strategy", "", "Sync strategy (one of: apply|hook)")
|
||||
command.Flags().BoolVar(&force, "force", false, "Use a force apply")
|
||||
command.Flags().BoolVar(&async, "async", false, "Do not wait for application to sync before continuing")
|
||||
command.Flags().StringVar(&local, "local", "", "Path to a local directory. When this flag is present no git queries will be made")
|
||||
return command
|
||||
}
|
||||
|
||||
@@ -1395,7 +1440,7 @@ func waitOnApplicationStatus(acdClient apiclient.Client, appName string, timeout
|
||||
selectedResourcesAreReady = checkResourceStatus(watchSync, watchHealth, watchOperation, watchSuspended, app.Status.Health.Status, string(app.Status.Sync.Status), appEvent.Application.Operation)
|
||||
}
|
||||
|
||||
if len(app.Status.GetErrorConditions()) == 0 && selectedResourcesAreReady {
|
||||
if selectedResourcesAreReady {
|
||||
printFinalStatus(app)
|
||||
return app, nil
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
clusterpkg "github.com/argoproj/argo-cd/pkg/apiclient/cluster"
|
||||
argoappv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
"github.com/argoproj/argo-cd/util"
|
||||
"github.com/argoproj/argo-cd/util/clusterauth"
|
||||
)
|
||||
|
||||
// NewClusterCommand returns a new instance of an `argocd cluster` command
|
||||
@@ -39,6 +40,7 @@ func NewClusterCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clientc
|
||||
command.AddCommand(NewClusterGetCommand(clientOpts))
|
||||
command.AddCommand(NewClusterListCommand(clientOpts))
|
||||
command.AddCommand(NewClusterRemoveCommand(clientOpts))
|
||||
command.AddCommand(NewClusterRotateAuthCommand(clientOpts))
|
||||
return command
|
||||
}
|
||||
|
||||
@@ -86,7 +88,7 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
|
||||
// Install RBAC resources for managing the cluster
|
||||
clientset, err := kubernetes.NewForConfig(conf)
|
||||
errors.CheckError(err)
|
||||
managerBearerToken, err = common.InstallClusterManagerRBAC(clientset, systemNamespace)
|
||||
managerBearerToken, err = clusterauth.InstallClusterManagerRBAC(clientset, systemNamespace)
|
||||
errors.CheckError(err)
|
||||
}
|
||||
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
|
||||
@@ -178,7 +180,7 @@ func NewCluster(name string, conf *rest.Config, managerBearerToken string, awsAu
|
||||
// NewClusterGetCommand returns a new instance of an `argocd cluster get` command
|
||||
func NewClusterGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
|
||||
var command = &cobra.Command{
|
||||
Use: "get",
|
||||
Use: "get CLUSTER",
|
||||
Short: "Get cluster information",
|
||||
Run: func(c *cobra.Command, args []string) {
|
||||
if len(args) == 0 {
|
||||
@@ -202,7 +204,7 @@ func NewClusterGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
|
||||
// NewClusterRemoveCommand returns a new instance of an `argocd cluster list` command
|
||||
func NewClusterRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
|
||||
var command = &cobra.Command{
|
||||
Use: "rm",
|
||||
Use: "rm CLUSTER",
|
||||
Short: "Remove cluster credentials",
|
||||
Run: func(c *cobra.Command, args []string) {
|
||||
if len(args) == 0 {
|
||||
@@ -217,7 +219,7 @@ func NewClusterRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
|
||||
|
||||
for _, clusterName := range args {
|
||||
// TODO(jessesuen): find the right context and remove manager RBAC artifacts
|
||||
// err := common.UninstallClusterManagerRBAC(clientset)
|
||||
// err := clusterauth.UninstallClusterManagerRBAC(clientset)
|
||||
// errors.CheckError(err)
|
||||
_, err := clusterIf.Delete(context.Background(), &clusterpkg.ClusterQuery{Server: clusterName})
|
||||
errors.CheckError(err)
|
||||
@@ -247,3 +249,26 @@ func NewClusterListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman
|
||||
}
|
||||
return command
|
||||
}
|
||||
|
||||
// NewClusterRotateAuthCommand returns a new instance of an `argocd cluster rotate-auth` command
|
||||
func NewClusterRotateAuthCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
|
||||
var command = &cobra.Command{
|
||||
Use: "rotate-auth CLUSTER",
|
||||
Short: fmt.Sprintf("%s cluster rotate-auth CLUSTER", cliName),
|
||||
Run: func(c *cobra.Command, args []string) {
|
||||
if len(args) != 1 {
|
||||
c.HelpFunc()(c, args)
|
||||
os.Exit(1)
|
||||
}
|
||||
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
|
||||
defer util.Close(conn)
|
||||
clusterQuery := clusterpkg.ClusterQuery{
|
||||
Server: args[0],
|
||||
}
|
||||
_, err := clusterIf.RotateAuth(context.Background(), &clusterQuery)
|
||||
errors.CheckError(err)
|
||||
fmt.Printf("Cluster '%s' rotated auth\n", clusterQuery.Server)
|
||||
},
|
||||
}
|
||||
return command
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math"
|
||||
"reflect"
|
||||
"runtime/debug"
|
||||
"strings"
|
||||
@@ -46,6 +47,21 @@ const (
|
||||
updateOperationStateTimeout = 1 * time.Second
|
||||
)
|
||||
|
||||
type CompareWith int
|
||||
|
||||
const (
|
||||
// Compare live application state against state defined in latest git revision.
|
||||
CompareWithLatest CompareWith = 2
|
||||
// Compare live application state against state defined using revision of most recent comparison.
|
||||
CompareWithRecent CompareWith = 1
|
||||
// Skip comparison and only refresh application resources tree
|
||||
ComparisonWithNothing CompareWith = 0
|
||||
)
|
||||
|
||||
func (a CompareWith) Max(b CompareWith) CompareWith {
|
||||
return CompareWith(math.Max(float64(a), float64(b)))
|
||||
}
|
||||
|
||||
// ApplicationController is the controller for application resources.
|
||||
type ApplicationController struct {
|
||||
cache *argocache.Cache
|
||||
@@ -66,7 +82,7 @@ type ApplicationController struct {
|
||||
db db.ArgoDB
|
||||
settings *settings_util.ArgoCDSettings
|
||||
settingsMgr *settings_util.SettingsManager
|
||||
refreshRequestedApps map[string]bool
|
||||
refreshRequestedApps map[string]CompareWith
|
||||
refreshRequestedAppsMutex *sync.Mutex
|
||||
metricsServer *metrics.MetricsServer
|
||||
}
|
||||
@@ -104,7 +120,7 @@ func NewApplicationController(
|
||||
appOperationQueue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()),
|
||||
db: db,
|
||||
statusRefreshTimeout: appResyncPeriod,
|
||||
refreshRequestedApps: make(map[string]bool),
|
||||
refreshRequestedApps: make(map[string]CompareWith),
|
||||
refreshRequestedAppsMutex: &sync.Mutex{},
|
||||
auditLogger: argo.NewAuditLogger(namespace, kubeClientset, "argocd-application-controller"),
|
||||
settingsMgr: settingsMgr,
|
||||
@@ -113,7 +129,10 @@ func NewApplicationController(
|
||||
appInformer, appLister := ctrl.newApplicationInformerAndLister()
|
||||
projInformer := v1alpha1.NewAppProjectInformer(applicationClientset, namespace, appResyncPeriod, cache.Indexers{})
|
||||
metricsAddr := fmt.Sprintf("0.0.0.0:%d", metricsPort)
|
||||
ctrl.metricsServer = metrics.NewMetricsServer(metricsAddr, appLister)
|
||||
ctrl.metricsServer = metrics.NewMetricsServer(metricsAddr, appLister, func() error {
|
||||
_, err := kubeClientset.Discovery().ServerVersion()
|
||||
return err
|
||||
})
|
||||
stateCache := statecache.NewLiveStateCache(db, appInformer, ctrl.settings, kubectlCmd, ctrl.metricsServer, ctrl.handleAppUpdated)
|
||||
appStateManager := NewAppStateManager(db, applicationClientset, repoClientset, namespace, kubectlCmd, ctrl.settings, stateCache, projInformer, ctrl.metricsServer)
|
||||
ctrl.appInformer = appInformer
|
||||
@@ -134,7 +153,7 @@ func isSelfReferencedApp(app *appv1.Application, ref v1.ObjectReference) bool {
|
||||
gvk.Kind == application.ApplicationKind
|
||||
}
|
||||
|
||||
func (ctrl *ApplicationController) handleAppUpdated(appName string, fullRefresh bool, ref v1.ObjectReference) {
|
||||
func (ctrl *ApplicationController) handleAppUpdated(appName string, isManagedResource bool, ref v1.ObjectReference) {
|
||||
skipForceRefresh := false
|
||||
|
||||
obj, exists, err := ctrl.appInformer.GetIndexer().GetByKey(ctrl.namespace + "/" + appName)
|
||||
@@ -144,7 +163,11 @@ func (ctrl *ApplicationController) handleAppUpdated(appName string, fullRefresh
|
||||
}
|
||||
|
||||
if !skipForceRefresh {
|
||||
ctrl.requestAppRefresh(appName, fullRefresh)
|
||||
level := ComparisonWithNothing
|
||||
if isManagedResource {
|
||||
level = CompareWithRecent
|
||||
}
|
||||
ctrl.requestAppRefresh(appName, level)
|
||||
}
|
||||
ctrl.appRefreshQueue.Add(fmt.Sprintf("%s/%s", ctrl.namespace, appName))
|
||||
}
|
||||
@@ -291,20 +314,20 @@ func (ctrl *ApplicationController) Run(ctx context.Context, statusProcessors int
|
||||
<-ctx.Done()
|
||||
}
|
||||
|
||||
func (ctrl *ApplicationController) requestAppRefresh(appName string, fullRefresh bool) {
|
||||
func (ctrl *ApplicationController) requestAppRefresh(appName string, compareWith CompareWith) {
|
||||
ctrl.refreshRequestedAppsMutex.Lock()
|
||||
defer ctrl.refreshRequestedAppsMutex.Unlock()
|
||||
ctrl.refreshRequestedApps[appName] = fullRefresh || ctrl.refreshRequestedApps[appName]
|
||||
ctrl.refreshRequestedApps[appName] = compareWith.Max(ctrl.refreshRequestedApps[appName])
|
||||
}
|
||||
|
||||
func (ctrl *ApplicationController) isRefreshRequested(appName string) (bool, bool) {
|
||||
func (ctrl *ApplicationController) isRefreshRequested(appName string) (bool, CompareWith) {
|
||||
ctrl.refreshRequestedAppsMutex.Lock()
|
||||
defer ctrl.refreshRequestedAppsMutex.Unlock()
|
||||
fullRefresh, ok := ctrl.refreshRequestedApps[appName]
|
||||
level, ok := ctrl.refreshRequestedApps[appName]
|
||||
if ok {
|
||||
delete(ctrl.refreshRequestedApps, appName)
|
||||
}
|
||||
return ok, fullRefresh
|
||||
return ok, level
|
||||
}
|
||||
|
||||
func (ctrl *ApplicationController) processAppOperationQueueItem() (processNext bool) {
|
||||
@@ -494,6 +517,7 @@ func (ctrl *ApplicationController) processRequestedAppOperation(app *appv1.Appli
|
||||
ctrl.setOperationState(app, state)
|
||||
logCtx.Infof("Initialized new operation: %v", *app.Operation)
|
||||
}
|
||||
|
||||
ctrl.appStateManager.SyncAppState(app, state)
|
||||
|
||||
if state.Phase == appv1.OperationRunning {
|
||||
@@ -515,7 +539,7 @@ func (ctrl *ApplicationController) processRequestedAppOperation(app *appv1.Appli
|
||||
if state.Phase.Completed() {
|
||||
// if we just completed an operation, force a refresh so that UI will report up-to-date
|
||||
// sync/health information
|
||||
ctrl.requestAppRefresh(app.ObjectMeta.Name, true)
|
||||
ctrl.requestAppRefresh(app.ObjectMeta.Name, CompareWithLatest)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -610,7 +634,7 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo
|
||||
log.Warnf("Key '%s' in index is not an application", appKey)
|
||||
return
|
||||
}
|
||||
needRefresh, refreshType, fullRefresh := ctrl.needRefreshAppStatus(origApp, ctrl.statusRefreshTimeout)
|
||||
needRefresh, refreshType, comparisonLevel := ctrl.needRefreshAppStatus(origApp, ctrl.statusRefreshTimeout)
|
||||
|
||||
if !needRefresh {
|
||||
return
|
||||
@@ -620,13 +644,13 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo
|
||||
defer func() {
|
||||
reconcileDuration := time.Since(startTime)
|
||||
ctrl.metricsServer.IncReconcile(origApp, reconcileDuration)
|
||||
logCtx := log.WithFields(log.Fields{"application": origApp.Name, "time_ms": reconcileDuration.Seconds() * 1e3, "full": fullRefresh})
|
||||
logCtx := log.WithFields(log.Fields{"application": origApp.Name, "time_ms": reconcileDuration.Seconds() * 1e3, "level": comparisonLevel})
|
||||
logCtx.Info("Reconciliation completed")
|
||||
}()
|
||||
|
||||
app := origApp.DeepCopy()
|
||||
logCtx := log.WithFields(log.Fields{"application": app.Name})
|
||||
if !fullRefresh {
|
||||
if comparisonLevel == ComparisonWithNothing {
|
||||
if managedResources, err := ctrl.cache.GetAppManagedResources(app.Name); err != nil {
|
||||
logCtx.Warnf("Failed to get cached managed resources for tree reconciliation, fallback to full reconciliation")
|
||||
} else {
|
||||
@@ -654,7 +678,16 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo
|
||||
return
|
||||
}
|
||||
|
||||
compareResult, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, refreshType == appv1.RefreshTypeHard)
|
||||
var localManifests []string
|
||||
if opState := app.Status.OperationState; opState != nil {
|
||||
localManifests = opState.Operation.Sync.Manifests
|
||||
}
|
||||
|
||||
revision := app.Spec.Source.TargetRevision
|
||||
if comparisonLevel == CompareWithRecent {
|
||||
revision = app.Status.Sync.Revision
|
||||
}
|
||||
compareResult, err := ctrl.appStateManager.CompareAppState(app, revision, app.Spec.Source, refreshType == appv1.RefreshTypeHard, localManifests)
|
||||
if err != nil {
|
||||
conditions = append(conditions, appv1.ApplicationCondition{Type: appv1.ApplicationConditionComparisonError, Message: err.Error()})
|
||||
} else {
|
||||
@@ -688,17 +721,17 @@ func (ctrl *ApplicationController) processAppRefreshQueueItem() (processNext boo
|
||||
// Returns true if application never been compared, has changed or comparison result has expired.
|
||||
// Additionally returns whether full refresh was requested or not.
|
||||
// If full refresh is requested then target and live state should be reconciled, else only live state tree should be updated.
|
||||
func (ctrl *ApplicationController) needRefreshAppStatus(app *appv1.Application, statusRefreshTimeout time.Duration) (bool, appv1.RefreshType, bool) {
|
||||
func (ctrl *ApplicationController) needRefreshAppStatus(app *appv1.Application, statusRefreshTimeout time.Duration) (bool, appv1.RefreshType, CompareWith) {
|
||||
logCtx := log.WithFields(log.Fields{"application": app.Name})
|
||||
var reason string
|
||||
fullRefresh := true
|
||||
compareWith := CompareWithLatest
|
||||
refreshType := appv1.RefreshTypeNormal
|
||||
expired := app.Status.ReconciledAt.Add(statusRefreshTimeout).Before(time.Now().UTC())
|
||||
if requestedType, ok := app.IsRefreshRequested(); ok {
|
||||
refreshType = requestedType
|
||||
reason = fmt.Sprintf("%s refresh requested", refreshType)
|
||||
} else if requested, full := ctrl.isRefreshRequested(app.Name); requested {
|
||||
fullRefresh = full
|
||||
} else if requested, level := ctrl.isRefreshRequested(app.Name); requested {
|
||||
compareWith = level
|
||||
reason = fmt.Sprintf("controller refresh requested")
|
||||
} else if app.Status.Sync.Status == appv1.SyncStatusCodeUnknown && expired {
|
||||
reason = "comparison status unknown"
|
||||
@@ -710,10 +743,10 @@ func (ctrl *ApplicationController) needRefreshAppStatus(app *appv1.Application,
|
||||
reason = fmt.Sprintf("comparison expired. reconciledAt: %v, expiry: %v", app.Status.ReconciledAt, statusRefreshTimeout)
|
||||
}
|
||||
if reason != "" {
|
||||
logCtx.Infof("Refreshing app status (%s)", reason)
|
||||
return true, refreshType, fullRefresh
|
||||
logCtx.Infof("Refreshing app status (%s), level (%d)", reason, compareWith)
|
||||
return true, refreshType, compareWith
|
||||
}
|
||||
return false, refreshType, fullRefresh
|
||||
return false, refreshType, compareWith
|
||||
}
|
||||
|
||||
func (ctrl *ApplicationController) refreshAppConditions(app *appv1.Application) ([]appv1.ApplicationCondition, bool) {
|
||||
@@ -929,7 +962,7 @@ func (ctrl *ApplicationController) newApplicationInformerAndLister() (cache.Shar
|
||||
if oldOK && newOK {
|
||||
if toggledAutomatedSync(oldApp, newApp) {
|
||||
log.WithField("application", newApp.Name).Info("Enabled automated sync")
|
||||
ctrl.requestAppRefresh(newApp.Name, true)
|
||||
ctrl.requestAppRefresh(newApp.Name, CompareWithLatest)
|
||||
}
|
||||
}
|
||||
ctrl.appRefreshQueue.Add(key)
|
||||
|
||||
@@ -461,12 +461,14 @@ func TestHandleAppUpdated(t *testing.T) {
|
||||
ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}})
|
||||
|
||||
ctrl.handleAppUpdated(app.Name, true, kube.GetObjectRef(kube.MustToUnstructured(app)))
|
||||
isRequested, _ := ctrl.isRefreshRequested(app.Name)
|
||||
isRequested, level := ctrl.isRefreshRequested(app.Name)
|
||||
assert.False(t, isRequested)
|
||||
assert.Equal(t, ComparisonWithNothing, level)
|
||||
|
||||
ctrl.handleAppUpdated(app.Name, true, corev1.ObjectReference{UID: "test", Kind: kube.DeploymentKind, Name: "test", Namespace: "default"})
|
||||
isRequested, _ = ctrl.isRefreshRequested(app.Name)
|
||||
isRequested, level = ctrl.isRefreshRequested(app.Name)
|
||||
assert.True(t, isRequested)
|
||||
assert.Equal(t, CompareWithRecent, level)
|
||||
}
|
||||
|
||||
func TestSetOperationStateOnDeletedApp(t *testing.T) {
|
||||
@@ -481,3 +483,48 @@ func TestSetOperationStateOnDeletedApp(t *testing.T) {
|
||||
ctrl.setOperationState(newFakeApp(), &argoappv1.OperationState{Phase: argoappv1.OperationSucceeded})
|
||||
assert.True(t, patched)
|
||||
}
|
||||
|
||||
func TestNeedRefreshAppStatus(t *testing.T) {
|
||||
ctrl := newFakeController(&fakeData{apps: []runtime.Object{}})
|
||||
|
||||
app := newFakeApp()
|
||||
app.Status.ReconciledAt = metav1.Now()
|
||||
app.Status.Sync = argoappv1.SyncStatus{
|
||||
Status: argoappv1.SyncStatusCodeSynced,
|
||||
ComparedTo: argoappv1.ComparedTo{
|
||||
Source: app.Spec.Source,
|
||||
Destination: app.Spec.Destination,
|
||||
},
|
||||
}
|
||||
|
||||
// no need to refresh just reconciled application
|
||||
needRefresh, _, _ := ctrl.needRefreshAppStatus(app, 1*time.Hour)
|
||||
assert.False(t, needRefresh)
|
||||
|
||||
// refresh app using the 'deepest' requested comparison level
|
||||
ctrl.requestAppRefresh(app.Name, CompareWithRecent)
|
||||
ctrl.requestAppRefresh(app.Name, ComparisonWithNothing)
|
||||
|
||||
needRefresh, refreshType, compareWith := ctrl.needRefreshAppStatus(app, 1*time.Hour)
|
||||
assert.True(t, needRefresh)
|
||||
assert.Equal(t, argoappv1.RefreshTypeNormal, refreshType)
|
||||
assert.Equal(t, CompareWithRecent, compareWith)
|
||||
|
||||
// refresh application which status is not reconciled using latest commit
|
||||
app.Status.Sync = argoappv1.SyncStatus{Status: argoappv1.SyncStatusCodeUnknown}
|
||||
|
||||
needRefresh, refreshType, compareWith = ctrl.needRefreshAppStatus(app, 1*time.Hour)
|
||||
assert.True(t, needRefresh)
|
||||
assert.Equal(t, argoappv1.RefreshTypeNormal, refreshType)
|
||||
assert.Equal(t, CompareWithLatest, compareWith)
|
||||
|
||||
// execute hard refresh if app has refresh annotation
|
||||
app.Annotations = map[string]string{
|
||||
common.AnnotationKeyRefresh: string(argoappv1.RefreshTypeHard),
|
||||
}
|
||||
needRefresh, refreshType, compareWith = ctrl.needRefreshAppStatus(app, 1*time.Hour)
|
||||
assert.True(t, needRefresh)
|
||||
assert.Equal(t, argoappv1.RefreshTypeHard, refreshType)
|
||||
assert.Equal(t, CompareWithLatest, compareWith)
|
||||
|
||||
}
|
||||
|
||||
2
controller/cache/cache.go
vendored
2
controller/cache/cache.go
vendored
@@ -31,7 +31,7 @@ type LiveStateCache interface {
|
||||
Invalidate()
|
||||
}
|
||||
|
||||
type AppUpdatedHandler = func(appName string, fullRefresh bool, ref v1.ObjectReference)
|
||||
type AppUpdatedHandler = func(appName string, isManagedResource bool, ref v1.ObjectReference)
|
||||
|
||||
func GetTargetObjKey(a *appv1.Application, un *unstructured.Unstructured, isNamespaced bool) kube.ResourceKey {
|
||||
key := kube.GetResourceKey(un)
|
||||
|
||||
4
controller/cache/cluster.go
vendored
4
controller/cache/cluster.go
vendored
@@ -480,8 +480,8 @@ func (c *clusterInfo) onNodeUpdated(exists bool, existingNode *node, un *unstruc
|
||||
toNotify[app] = n.isRootAppNode() || toNotify[app]
|
||||
}
|
||||
}
|
||||
for name, full := range toNotify {
|
||||
c.onAppUpdated(name, full, newObj.ref)
|
||||
for name, isRootAppNode := range toNotify {
|
||||
c.onAppUpdated(name, isRootAppNode, newObj.ref)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
argoappv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
applister "github.com/argoproj/argo-cd/pkg/client/listers/application/v1alpha1"
|
||||
"github.com/argoproj/argo-cd/util/git"
|
||||
"github.com/argoproj/argo-cd/util/healthz"
|
||||
)
|
||||
|
||||
type MetricsServer struct {
|
||||
@@ -59,12 +60,13 @@ var (
|
||||
)
|
||||
|
||||
// NewMetricsServer returns a new prometheus server which collects application metrics
|
||||
func NewMetricsServer(addr string, appLister applister.ApplicationLister) *MetricsServer {
|
||||
func NewMetricsServer(addr string, appLister applister.ApplicationLister, healthCheck func() error) *MetricsServer {
|
||||
mux := http.NewServeMux()
|
||||
appRegistry := NewAppRegistry(appLister)
|
||||
appRegistry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
|
||||
appRegistry.MustRegister(prometheus.NewGoCollector())
|
||||
mux.Handle(MetricsPath, promhttp.HandlerFor(appRegistry, promhttp.HandlerOpts{}))
|
||||
healthz.ServeHealthCheck(mux, healthCheck)
|
||||
|
||||
syncCounter := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
|
||||
@@ -104,6 +104,10 @@ argocd_app_sync_status{name="my-app",namespace="argocd",project="default",sync_s
|
||||
argocd_app_sync_status{name="my-app",namespace="argocd",project="default",sync_status="Unknown"} 0
|
||||
`
|
||||
|
||||
var noOpHealthCheck = func() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func newFakeApp(fakeApp string) *argoappv1.Application {
|
||||
var app argoappv1.Application
|
||||
err := yaml.Unmarshal([]byte(fakeApp), &app)
|
||||
@@ -133,7 +137,7 @@ func newFakeLister(fakeApp ...string) (context.CancelFunc, applister.Application
|
||||
func testApp(t *testing.T, fakeApp string, expectedResponse string) {
|
||||
cancel, appLister := newFakeLister(fakeApp)
|
||||
defer cancel()
|
||||
metricsServ := NewMetricsServer("localhost:8082", appLister)
|
||||
metricsServ := NewMetricsServer("localhost:8082", appLister, noOpHealthCheck)
|
||||
req, err := http.NewRequest("GET", "/metrics", nil)
|
||||
assert.NoError(t, err)
|
||||
rr := httptest.NewRecorder()
|
||||
@@ -176,7 +180,7 @@ argocd_app_sync_total{name="my-app",namespace="argocd",phase="Succeeded",project
|
||||
func TestMetricsSyncCounter(t *testing.T) {
|
||||
cancel, appLister := newFakeLister()
|
||||
defer cancel()
|
||||
metricsServ := NewMetricsServer("localhost:8082", appLister)
|
||||
metricsServ := NewMetricsServer("localhost:8082", appLister, noOpHealthCheck)
|
||||
|
||||
fakeApp := newFakeApp(fakeApp)
|
||||
metricsServ.IncSync(fakeApp, &argoappv1.OperationState{Phase: argoappv1.OperationRunning})
|
||||
@@ -217,7 +221,7 @@ argocd_app_reconcile_count{name="my-app",namespace="argocd",project="important-p
|
||||
func TestReconcileMetrics(t *testing.T) {
|
||||
cancel, appLister := newFakeLister()
|
||||
defer cancel()
|
||||
metricsServ := NewMetricsServer("localhost:8082", appLister)
|
||||
metricsServ := NewMetricsServer("localhost:8082", appLister, noOpHealthCheck)
|
||||
|
||||
fakeApp := newFakeApp(fakeApp)
|
||||
metricsServ.IncReconcile(fakeApp, 5*time.Second)
|
||||
|
||||
@@ -57,7 +57,7 @@ type ResourceInfoProvider interface {
|
||||
|
||||
// AppStateManager defines methods which allow to compare application spec and actual application state.
|
||||
type AppStateManager interface {
|
||||
CompareAppState(app *v1alpha1.Application, revision string, source v1alpha1.ApplicationSource, noCache bool) (*comparisonResult, error)
|
||||
CompareAppState(app *v1alpha1.Application, revision string, source v1alpha1.ApplicationSource, noCache bool, localObjects []string) (*comparisonResult, error)
|
||||
SyncAppState(app *v1alpha1.Application, state *v1alpha1.OperationState)
|
||||
}
|
||||
|
||||
@@ -125,12 +125,18 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, source v1alpha1
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
|
||||
targetObjs, hooks, nil := unmarshalManifests(manifestInfo.Manifests)
|
||||
return targetObjs, hooks, manifestInfo, nil
|
||||
|
||||
}
|
||||
|
||||
func unmarshalManifests(manifests []string) ([]*unstructured.Unstructured, []*unstructured.Unstructured, error) {
|
||||
targetObjs := make([]*unstructured.Unstructured, 0)
|
||||
hooks := make([]*unstructured.Unstructured, 0)
|
||||
for _, manifest := range manifestInfo.Manifests {
|
||||
for _, manifest := range manifests {
|
||||
obj, err := v1alpha1.UnmarshalToUnstructured(manifest)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
if resource.Ignore(obj) {
|
||||
continue
|
||||
@@ -141,7 +147,7 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, source v1alpha1
|
||||
targetObjs = append(targetObjs, obj)
|
||||
}
|
||||
}
|
||||
return targetObjs, hooks, manifestInfo, nil
|
||||
return targetObjs, hooks, nil
|
||||
}
|
||||
|
||||
func DeduplicateTargetObjects(
|
||||
@@ -220,7 +226,7 @@ func dedupLiveResources(targetObjs []*unstructured.Unstructured, liveObjsByKey m
|
||||
// CompareAppState compares application git state to the live app state, using the specified
|
||||
// revision and supplied source. If revision or overrides are empty, then compares against
|
||||
// revision and overrides in the app spec.
|
||||
func (m *appStateManager) CompareAppState(app *v1alpha1.Application, revision string, source v1alpha1.ApplicationSource, noCache bool) (*comparisonResult, error) {
|
||||
func (m *appStateManager) CompareAppState(app *v1alpha1.Application, revision string, source v1alpha1.ApplicationSource, noCache bool, localManifests []string) (*comparisonResult, error) {
|
||||
diffNormalizer, err := argo.NewDiffNormalizer(app.Spec.IgnoreDifferences, m.settings.ResourceOverrides)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -231,12 +237,28 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, revision st
|
||||
failedToLoadObjs := false
|
||||
conditions := make([]v1alpha1.ApplicationCondition, 0)
|
||||
appLabelKey := m.settings.GetAppInstanceLabelKey()
|
||||
targetObjs, hooks, manifestInfo, err := m.getRepoObjs(app, source, appLabelKey, revision, noCache)
|
||||
if err != nil {
|
||||
targetObjs = make([]*unstructured.Unstructured, 0)
|
||||
conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionComparisonError, Message: err.Error()})
|
||||
failedToLoadObjs = true
|
||||
|
||||
var targetObjs []*unstructured.Unstructured
|
||||
var hooks []*unstructured.Unstructured
|
||||
var manifestInfo *repository.ManifestResponse
|
||||
|
||||
if len(localManifests) == 0 {
|
||||
targetObjs, hooks, manifestInfo, err = m.getRepoObjs(app, source, appLabelKey, revision, noCache)
|
||||
if err != nil {
|
||||
targetObjs = make([]*unstructured.Unstructured, 0)
|
||||
conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionComparisonError, Message: err.Error()})
|
||||
failedToLoadObjs = true
|
||||
}
|
||||
} else {
|
||||
targetObjs, hooks, err = unmarshalManifests(localManifests)
|
||||
if err != nil {
|
||||
targetObjs = make([]*unstructured.Unstructured, 0)
|
||||
conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionComparisonError, Message: err.Error()})
|
||||
failedToLoadObjs = true
|
||||
}
|
||||
manifestInfo = nil
|
||||
}
|
||||
|
||||
targetObjs, dedupConditions, err := DeduplicateTargetObjects(app.Spec.Destination.Server, app.Spec.Destination.Namespace, targetObjs, m.liveStateCache)
|
||||
if err != nil {
|
||||
conditions = append(conditions, v1alpha1.ApplicationCondition{Type: v1alpha1.ApplicationConditionComparisonError, Message: err.Error()})
|
||||
|
||||
@@ -30,7 +30,7 @@ func TestCompareAppStateEmpty(t *testing.T) {
|
||||
managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured),
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status)
|
||||
@@ -53,7 +53,7 @@ func TestCompareAppStateMissing(t *testing.T) {
|
||||
managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured),
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status)
|
||||
@@ -80,7 +80,7 @@ func TestCompareAppStateExtra(t *testing.T) {
|
||||
},
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
assert.Equal(t, argoappv1.SyncStatusCodeOutOfSync, compRes.syncStatus.Status)
|
||||
@@ -107,7 +107,7 @@ func TestCompareAppStateHook(t *testing.T) {
|
||||
managedLiveObjs: make(map[kube.ResourceKey]*unstructured.Unstructured),
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status)
|
||||
@@ -134,7 +134,7 @@ func TestCompareAppStateCompareOptionIgnoreExtraneous(t *testing.T) {
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
@@ -163,7 +163,7 @@ func TestCompareAppStateExtraHook(t *testing.T) {
|
||||
},
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
assert.Equal(t, argoappv1.SyncStatusCodeSynced, compRes.syncStatus.Status)
|
||||
@@ -200,7 +200,7 @@ func TestCompareAppStateDuplicatedNamespacedResources(t *testing.T) {
|
||||
},
|
||||
}
|
||||
ctrl := newFakeController(&data)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, compRes)
|
||||
assert.Contains(t, compRes.conditions, argoappv1.ApplicationCondition{
|
||||
@@ -251,7 +251,7 @@ func TestSetHealth(t *testing.T) {
|
||||
},
|
||||
})
|
||||
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, compRes.healthStatus.Status, argoappv1.HealthStatusHealthy)
|
||||
@@ -284,7 +284,7 @@ func TestSetHealthSelfReferencedApp(t *testing.T) {
|
||||
},
|
||||
})
|
||||
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false)
|
||||
compRes, err := ctrl.appStateManager.CompareAppState(app, "", app.Spec.Source, false, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, compRes.healthStatus.Status, argoappv1.HealthStatusHealthy)
|
||||
|
||||
@@ -92,7 +92,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha
|
||||
revision = syncOp.Revision
|
||||
}
|
||||
|
||||
compareResult, err := m.CompareAppState(app, revision, source, false)
|
||||
compareResult, err := m.CompareAppState(app, revision, source, false, syncOp.Manifests)
|
||||
if err != nil {
|
||||
state.Phase = v1alpha1.OperationError
|
||||
state.Message = err.Error()
|
||||
@@ -457,7 +457,8 @@ func (sc *syncContext) liveObj(obj *unstructured.Unstructured) *unstructured.Uns
|
||||
for _, resource := range sc.compareResult.managedResources {
|
||||
if resource.Group == obj.GroupVersionKind().Group &&
|
||||
resource.Kind == obj.GetKind() &&
|
||||
resource.Namespace == obj.GetNamespace() &&
|
||||
// cluster scoped objects will not have a namespace, even if the user has defined it
|
||||
(resource.Namespace == "" || resource.Namespace == obj.GetNamespace()) &&
|
||||
resource.Name == obj.GetName() {
|
||||
return resource.Live
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package controller
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
@@ -526,3 +527,37 @@ func Test_syncContext_isSelectiveSync(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_syncContext_liveObj(t *testing.T) {
|
||||
type fields struct {
|
||||
compareResult *comparisonResult
|
||||
}
|
||||
type args struct {
|
||||
obj *unstructured.Unstructured
|
||||
}
|
||||
obj := test.NewPod()
|
||||
obj.SetNamespace("my-ns")
|
||||
|
||||
found := test.NewPod()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want *unstructured.Unstructured
|
||||
}{
|
||||
{"None", fields{compareResult: &comparisonResult{managedResources: []managedResource{}}}, args{obj: &unstructured.Unstructured{}}, nil},
|
||||
{"Found", fields{compareResult: &comparisonResult{managedResources: []managedResource{{Group: obj.GroupVersionKind().Group, Kind: obj.GetKind(), Namespace: obj.GetNamespace(), Name: obj.GetName(), Live: found}}}}, args{obj: obj}, found},
|
||||
{"EmptyNamespace", fields{compareResult: &comparisonResult{managedResources: []managedResource{{Group: obj.GroupVersionKind().Group, Kind: obj.GetKind(), Name: obj.GetName(), Live: found}}}}, args{obj: obj}, found},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
sc := &syncContext{
|
||||
compareResult: tt.fields.compareResult,
|
||||
}
|
||||
if got := sc.liveObj(tt.args.obj); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("syncContext.liveObj() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Tools
|
||||
|
||||
## Production
|
||||
|
||||
Argo CD supports several different ways in which Kubernetes manifests can be defined:
|
||||
|
||||
* [Kustomize](kustomize.md) applications
|
||||
@@ -7,3 +9,13 @@ Argo CD supports several different ways in which Kubernetes manifests can be def
|
||||
* [Ksonnet](ksonnet.md) applications
|
||||
* A directory of YAML/JSO/Jsonnet manifests
|
||||
* Any [custom config management tool](config-management-plugins.md) configured as a config management plugin
|
||||
|
||||
## Development
|
||||
Argo CD also supports uploading local manifests directly. Since this is an anti-pattern of the
|
||||
GitOps paradigm, this should only be done for development purposes. A user with an `override` permission is required
|
||||
to upload manifests locally (typically an admin). All of the different Kubernetes deployment tools above are supported.
|
||||
To upload a local application:
|
||||
|
||||
```bash
|
||||
$ argocd app sync APPNAME --local /path/to/dir/
|
||||
```
|
||||
|
||||
@@ -121,7 +121,7 @@ clean_swagger() {
|
||||
/usr/bin/find "${SWAGGER_ROOT}" -name '*.swagger.json' -delete
|
||||
}
|
||||
|
||||
collect_swagger server 24
|
||||
collect_swagger server 26
|
||||
clean_swagger server
|
||||
clean_swagger reposerver
|
||||
clean_swagger controller
|
||||
|
||||
@@ -30,7 +30,14 @@ spec:
|
||||
ports:
|
||||
- containerPort: 8082
|
||||
readinessProbe:
|
||||
tcpSocket:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
|
||||
@@ -12,7 +12,7 @@ bases:
|
||||
images:
|
||||
- name: argoproj/argocd
|
||||
newName: argoproj/argocd
|
||||
newTag: latest
|
||||
newTag: v1.1.1
|
||||
- name: argoproj/argocd-ui
|
||||
newName: argoproj/argocd-ui
|
||||
newTag: latest
|
||||
newTag: v1.1.1
|
||||
|
||||
@@ -38,6 +38,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run` without
|
||||
actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides sync
|
||||
source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer tracked
|
||||
in git
|
||||
@@ -689,7 +695,6 @@ spec:
|
||||
- revision
|
||||
- deployedAt
|
||||
- id
|
||||
- source
|
||||
type: object
|
||||
type: array
|
||||
observedAt: {}
|
||||
@@ -712,6 +717,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run`
|
||||
without actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides
|
||||
sync source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer
|
||||
tracked in git
|
||||
@@ -1164,7 +1175,6 @@ spec:
|
||||
type: object
|
||||
required:
|
||||
- revision
|
||||
- source
|
||||
type: object
|
||||
required:
|
||||
- operation
|
||||
@@ -1410,8 +1420,6 @@ spec:
|
||||
type: string
|
||||
required:
|
||||
- status
|
||||
- comparedTo
|
||||
- revision
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
|
||||
@@ -17,7 +17,7 @@ patchesStrategicMerge:
|
||||
images:
|
||||
- name: argoproj/argocd
|
||||
newName: argoproj/argocd
|
||||
newTag: latest
|
||||
newTag: v1.1.1
|
||||
- name: argoproj/argocd-ui
|
||||
newName: argoproj/argocd-ui
|
||||
newTag: latest
|
||||
newTag: v1.1.1
|
||||
|
||||
@@ -39,6 +39,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run` without
|
||||
actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides sync
|
||||
source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer tracked
|
||||
in git
|
||||
@@ -690,7 +696,6 @@ spec:
|
||||
- revision
|
||||
- deployedAt
|
||||
- id
|
||||
- source
|
||||
type: object
|
||||
type: array
|
||||
observedAt: {}
|
||||
@@ -713,6 +718,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run`
|
||||
without actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides
|
||||
sync source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer
|
||||
tracked in git
|
||||
@@ -1165,7 +1176,6 @@ spec:
|
||||
type: object
|
||||
required:
|
||||
- revision
|
||||
- source
|
||||
type: object
|
||||
required:
|
||||
- operation
|
||||
@@ -1411,8 +1421,6 @@ spec:
|
||||
type: string
|
||||
required:
|
||||
- status
|
||||
- comparedTo
|
||||
- revision
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
@@ -2197,16 +2205,23 @@ spec:
|
||||
- argocd-redis-ha-announce-2:26379
|
||||
- --sentinelmaster
|
||||
- argocd
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
name: argocd-application-controller
|
||||
ports:
|
||||
- containerPort: 8082
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
tcpSocket:
|
||||
port: 8082
|
||||
serviceAccountName: argocd-application-controller
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
@@ -2244,7 +2259,7 @@ spec:
|
||||
- cp
|
||||
- /usr/local/bin/argocd-util
|
||||
- /shared
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: copyutil
|
||||
volumeMounts:
|
||||
@@ -2299,7 +2314,7 @@ spec:
|
||||
- argocd-redis-ha-announce-2:26379
|
||||
- --sentinelmaster
|
||||
- argocd
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
initialDelaySeconds: 5
|
||||
@@ -2361,7 +2376,7 @@ spec:
|
||||
- argocd-redis-ha-announce-2:26379
|
||||
- --sentinelmaster
|
||||
- argocd
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
@@ -2388,7 +2403,7 @@ spec:
|
||||
- -r
|
||||
- /app
|
||||
- /shared
|
||||
image: argoproj/argocd-ui:latest
|
||||
image: argoproj/argocd-ui:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: ui
|
||||
volumeMounts:
|
||||
|
||||
@@ -39,6 +39,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run` without
|
||||
actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides sync
|
||||
source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer tracked
|
||||
in git
|
||||
@@ -690,7 +696,6 @@ spec:
|
||||
- revision
|
||||
- deployedAt
|
||||
- id
|
||||
- source
|
||||
type: object
|
||||
type: array
|
||||
observedAt: {}
|
||||
@@ -713,6 +718,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run`
|
||||
without actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides
|
||||
sync source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer
|
||||
tracked in git
|
||||
@@ -1165,7 +1176,6 @@ spec:
|
||||
type: object
|
||||
required:
|
||||
- revision
|
||||
- source
|
||||
type: object
|
||||
required:
|
||||
- operation
|
||||
@@ -1411,8 +1421,6 @@ spec:
|
||||
type: string
|
||||
required:
|
||||
- status
|
||||
- comparedTo
|
||||
- revision
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
@@ -2112,16 +2120,23 @@ spec:
|
||||
- argocd-redis-ha-announce-2:26379
|
||||
- --sentinelmaster
|
||||
- argocd
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
name: argocd-application-controller
|
||||
ports:
|
||||
- containerPort: 8082
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
tcpSocket:
|
||||
port: 8082
|
||||
serviceAccountName: argocd-application-controller
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
@@ -2159,7 +2174,7 @@ spec:
|
||||
- cp
|
||||
- /usr/local/bin/argocd-util
|
||||
- /shared
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: copyutil
|
||||
volumeMounts:
|
||||
@@ -2214,7 +2229,7 @@ spec:
|
||||
- argocd-redis-ha-announce-2:26379
|
||||
- --sentinelmaster
|
||||
- argocd
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
initialDelaySeconds: 5
|
||||
@@ -2276,7 +2291,7 @@ spec:
|
||||
- argocd-redis-ha-announce-2:26379
|
||||
- --sentinelmaster
|
||||
- argocd
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
@@ -2303,7 +2318,7 @@ spec:
|
||||
- -r
|
||||
- /app
|
||||
- /shared
|
||||
image: argoproj/argocd-ui:latest
|
||||
image: argoproj/argocd-ui:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: ui
|
||||
volumeMounts:
|
||||
|
||||
@@ -39,6 +39,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run` without
|
||||
actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides sync
|
||||
source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer tracked
|
||||
in git
|
||||
@@ -690,7 +696,6 @@ spec:
|
||||
- revision
|
||||
- deployedAt
|
||||
- id
|
||||
- source
|
||||
type: object
|
||||
type: array
|
||||
observedAt: {}
|
||||
@@ -713,6 +718,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run`
|
||||
without actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides
|
||||
sync source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer
|
||||
tracked in git
|
||||
@@ -1165,7 +1176,6 @@ spec:
|
||||
type: object
|
||||
required:
|
||||
- revision
|
||||
- source
|
||||
type: object
|
||||
required:
|
||||
- operation
|
||||
@@ -1411,8 +1421,6 @@ spec:
|
||||
type: string
|
||||
required:
|
||||
- status
|
||||
- comparedTo
|
||||
- revision
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
@@ -1961,16 +1969,23 @@ spec:
|
||||
- "20"
|
||||
- --operation-processors
|
||||
- "10"
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
name: argocd-application-controller
|
||||
ports:
|
||||
- containerPort: 8082
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
tcpSocket:
|
||||
port: 8082
|
||||
serviceAccountName: argocd-application-controller
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
@@ -2008,7 +2023,7 @@ spec:
|
||||
- cp
|
||||
- /usr/local/bin/argocd-util
|
||||
- /shared
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: copyutil
|
||||
volumeMounts:
|
||||
@@ -2071,7 +2086,7 @@ spec:
|
||||
- argocd-repo-server
|
||||
- --redis
|
||||
- argocd-redis:6379
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
initialDelaySeconds: 5
|
||||
@@ -2110,7 +2125,7 @@ spec:
|
||||
- argocd-server
|
||||
- --staticassets
|
||||
- /shared/app
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
@@ -2137,7 +2152,7 @@ spec:
|
||||
- -r
|
||||
- /app
|
||||
- /shared
|
||||
image: argoproj/argocd-ui:latest
|
||||
image: argoproj/argocd-ui:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: ui
|
||||
volumeMounts:
|
||||
|
||||
@@ -39,6 +39,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run` without
|
||||
actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides sync
|
||||
source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer tracked
|
||||
in git
|
||||
@@ -690,7 +696,6 @@ spec:
|
||||
- revision
|
||||
- deployedAt
|
||||
- id
|
||||
- source
|
||||
type: object
|
||||
type: array
|
||||
observedAt: {}
|
||||
@@ -713,6 +718,12 @@ spec:
|
||||
description: DryRun will perform a `kubectl apply --dry-run`
|
||||
without actually performing the sync
|
||||
type: boolean
|
||||
manifests:
|
||||
description: Manifests is an optional field that overrides
|
||||
sync source with a local directory for development
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
prune:
|
||||
description: Prune deletes resources that are no longer
|
||||
tracked in git
|
||||
@@ -1165,7 +1176,6 @@ spec:
|
||||
type: object
|
||||
required:
|
||||
- revision
|
||||
- source
|
||||
type: object
|
||||
required:
|
||||
- operation
|
||||
@@ -1411,8 +1421,6 @@ spec:
|
||||
type: string
|
||||
required:
|
||||
- status
|
||||
- comparedTo
|
||||
- revision
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
@@ -1876,16 +1884,23 @@ spec:
|
||||
- "20"
|
||||
- --operation-processors
|
||||
- "10"
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
name: argocd-application-controller
|
||||
ports:
|
||||
- containerPort: 8082
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8082
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
tcpSocket:
|
||||
port: 8082
|
||||
serviceAccountName: argocd-application-controller
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
@@ -1923,7 +1938,7 @@ spec:
|
||||
- cp
|
||||
- /usr/local/bin/argocd-util
|
||||
- /shared
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: copyutil
|
||||
volumeMounts:
|
||||
@@ -1986,7 +2001,7 @@ spec:
|
||||
- argocd-repo-server
|
||||
- --redis
|
||||
- argocd-redis:6379
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
initialDelaySeconds: 5
|
||||
@@ -2025,7 +2040,7 @@ spec:
|
||||
- argocd-server
|
||||
- --staticassets
|
||||
- /shared/app
|
||||
image: argoproj/argocd:latest
|
||||
image: argoproj/argocd:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
@@ -2052,7 +2067,7 @@ spec:
|
||||
- -r
|
||||
- /app
|
||||
- /shared
|
||||
image: argoproj/argocd-ui:latest
|
||||
image: argoproj/argocd-ui:v1.1.1
|
||||
imagePullPolicy: Always
|
||||
name: ui
|
||||
volumeMounts:
|
||||
|
||||
@@ -52,7 +52,7 @@ func (m *ApplicationQuery) Reset() { *m = ApplicationQuery{} }
|
||||
func (m *ApplicationQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationQuery) ProtoMessage() {}
|
||||
func (*ApplicationQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{0}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{0}
|
||||
}
|
||||
func (m *ApplicationQuery) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -124,7 +124,7 @@ func (m *ApplicationResourceEventsQuery) Reset() { *m = ApplicationResou
|
||||
func (m *ApplicationResourceEventsQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationResourceEventsQuery) ProtoMessage() {}
|
||||
func (*ApplicationResourceEventsQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{1}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{1}
|
||||
}
|
||||
func (m *ApplicationResourceEventsQuery) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -194,7 +194,7 @@ func (m *ApplicationManifestQuery) Reset() { *m = ApplicationManifestQue
|
||||
func (m *ApplicationManifestQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationManifestQuery) ProtoMessage() {}
|
||||
func (*ApplicationManifestQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{2}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{2}
|
||||
}
|
||||
func (m *ApplicationManifestQuery) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -247,7 +247,7 @@ func (m *ApplicationResponse) Reset() { *m = ApplicationResponse{} }
|
||||
func (m *ApplicationResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationResponse) ProtoMessage() {}
|
||||
func (*ApplicationResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{3}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{3}
|
||||
}
|
||||
func (m *ApplicationResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -288,7 +288,7 @@ func (m *ApplicationCreateRequest) Reset() { *m = ApplicationCreateReque
|
||||
func (m *ApplicationCreateRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationCreateRequest) ProtoMessage() {}
|
||||
func (*ApplicationCreateRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{4}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{4}
|
||||
}
|
||||
func (m *ApplicationCreateRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -342,7 +342,7 @@ func (m *ApplicationUpdateRequest) Reset() { *m = ApplicationUpdateReque
|
||||
func (m *ApplicationUpdateRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationUpdateRequest) ProtoMessage() {}
|
||||
func (*ApplicationUpdateRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{5}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{5}
|
||||
}
|
||||
func (m *ApplicationUpdateRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -390,7 +390,7 @@ func (m *ApplicationDeleteRequest) Reset() { *m = ApplicationDeleteReque
|
||||
func (m *ApplicationDeleteRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationDeleteRequest) ProtoMessage() {}
|
||||
func (*ApplicationDeleteRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{6}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{6}
|
||||
}
|
||||
func (m *ApplicationDeleteRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -441,6 +441,7 @@ type ApplicationSyncRequest struct {
|
||||
Prune bool `protobuf:"varint,4,opt,name=prune" json:"prune"`
|
||||
Strategy *v1alpha1.SyncStrategy `protobuf:"bytes,5,opt,name=strategy" json:"strategy,omitempty"`
|
||||
Resources []v1alpha1.SyncOperationResource `protobuf:"bytes,7,rep,name=resources" json:"resources"`
|
||||
Manifests []string `protobuf:"bytes,8,rep,name=manifests" json:"manifests,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
@@ -450,7 +451,7 @@ func (m *ApplicationSyncRequest) Reset() { *m = ApplicationSyncRequest{}
|
||||
func (m *ApplicationSyncRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationSyncRequest) ProtoMessage() {}
|
||||
func (*ApplicationSyncRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{7}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{7}
|
||||
}
|
||||
func (m *ApplicationSyncRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -521,6 +522,13 @@ func (m *ApplicationSyncRequest) GetResources() []v1alpha1.SyncOperationResource
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ApplicationSyncRequest) GetManifests() []string {
|
||||
if m != nil {
|
||||
return m.Manifests
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ApplicationUpdateSpecRequest is a request to update application spec
|
||||
type ApplicationUpdateSpecRequest struct {
|
||||
Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
|
||||
@@ -534,7 +542,7 @@ func (m *ApplicationUpdateSpecRequest) Reset() { *m = ApplicationUpdateS
|
||||
func (m *ApplicationUpdateSpecRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationUpdateSpecRequest) ProtoMessage() {}
|
||||
func (*ApplicationUpdateSpecRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{8}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{8}
|
||||
}
|
||||
func (m *ApplicationUpdateSpecRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -590,7 +598,7 @@ func (m *ApplicationPatchRequest) Reset() { *m = ApplicationPatchRequest
|
||||
func (m *ApplicationPatchRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationPatchRequest) ProtoMessage() {}
|
||||
func (*ApplicationPatchRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{9}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{9}
|
||||
}
|
||||
func (m *ApplicationPatchRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -647,7 +655,7 @@ func (m *ApplicationRollbackRequest) Reset() { *m = ApplicationRollbackR
|
||||
func (m *ApplicationRollbackRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationRollbackRequest) ProtoMessage() {}
|
||||
func (*ApplicationRollbackRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{10}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{10}
|
||||
}
|
||||
func (m *ApplicationRollbackRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -720,7 +728,7 @@ func (m *ApplicationResourceRequest) Reset() { *m = ApplicationResourceR
|
||||
func (m *ApplicationResourceRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationResourceRequest) ProtoMessage() {}
|
||||
func (*ApplicationResourceRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{11}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{11}
|
||||
}
|
||||
func (m *ApplicationResourceRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -809,7 +817,7 @@ func (m *ApplicationResourcePatchRequest) Reset() { *m = ApplicationReso
|
||||
func (m *ApplicationResourcePatchRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationResourcePatchRequest) ProtoMessage() {}
|
||||
func (*ApplicationResourcePatchRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{12}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{12}
|
||||
}
|
||||
func (m *ApplicationResourcePatchRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -911,7 +919,7 @@ func (m *ApplicationResourceDeleteRequest) Reset() { *m = ApplicationRes
|
||||
func (m *ApplicationResourceDeleteRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationResourceDeleteRequest) ProtoMessage() {}
|
||||
func (*ApplicationResourceDeleteRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{13}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{13}
|
||||
}
|
||||
func (m *ApplicationResourceDeleteRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1006,7 +1014,7 @@ func (m *ResourceActionRunRequest) Reset() { *m = ResourceActionRunReque
|
||||
func (m *ResourceActionRunRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResourceActionRunRequest) ProtoMessage() {}
|
||||
func (*ResourceActionRunRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{14}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{14}
|
||||
}
|
||||
func (m *ResourceActionRunRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1095,7 +1103,7 @@ func (m *ResourceActionsListResponse) Reset() { *m = ResourceActionsList
|
||||
func (m *ResourceActionsListResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResourceActionsListResponse) ProtoMessage() {}
|
||||
func (*ResourceActionsListResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{15}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{15}
|
||||
}
|
||||
func (m *ResourceActionsListResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1142,7 +1150,7 @@ func (m *ApplicationResourceResponse) Reset() { *m = ApplicationResource
|
||||
func (m *ApplicationResourceResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationResourceResponse) ProtoMessage() {}
|
||||
func (*ApplicationResourceResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{16}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{16}
|
||||
}
|
||||
func (m *ApplicationResourceResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1196,7 +1204,7 @@ func (m *ApplicationPodLogsQuery) Reset() { *m = ApplicationPodLogsQuery
|
||||
func (m *ApplicationPodLogsQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*ApplicationPodLogsQuery) ProtoMessage() {}
|
||||
func (*ApplicationPodLogsQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{17}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{17}
|
||||
}
|
||||
func (m *ApplicationPodLogsQuery) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1293,7 +1301,7 @@ func (m *LogEntry) Reset() { *m = LogEntry{} }
|
||||
func (m *LogEntry) String() string { return proto.CompactTextString(m) }
|
||||
func (*LogEntry) ProtoMessage() {}
|
||||
func (*LogEntry) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{18}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{18}
|
||||
}
|
||||
func (m *LogEntry) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1347,7 +1355,7 @@ func (m *OperationTerminateRequest) Reset() { *m = OperationTerminateReq
|
||||
func (m *OperationTerminateRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*OperationTerminateRequest) ProtoMessage() {}
|
||||
func (*OperationTerminateRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{19}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{19}
|
||||
}
|
||||
func (m *OperationTerminateRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1393,7 +1401,7 @@ func (m *OperationTerminateResponse) Reset() { *m = OperationTerminateRe
|
||||
func (m *OperationTerminateResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*OperationTerminateResponse) ProtoMessage() {}
|
||||
func (*OperationTerminateResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{20}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{20}
|
||||
}
|
||||
func (m *OperationTerminateResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1433,7 +1441,7 @@ func (m *ResourcesQuery) Reset() { *m = ResourcesQuery{} }
|
||||
func (m *ResourcesQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*ResourcesQuery) ProtoMessage() {}
|
||||
func (*ResourcesQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{21}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{21}
|
||||
}
|
||||
func (m *ResourcesQuery) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -1480,7 +1488,7 @@ func (m *ManagedResourcesResponse) Reset() { *m = ManagedResourcesRespon
|
||||
func (m *ManagedResourcesResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*ManagedResourcesResponse) ProtoMessage() {}
|
||||
func (*ManagedResourcesResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_application_fe5e7332ebc1d7c2, []int{22}
|
||||
return fileDescriptor_application_0acf736a0f21a996, []int{22}
|
||||
}
|
||||
func (m *ManagedResourcesResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -2686,6 +2694,21 @@ func (m *ApplicationSyncRequest) MarshalTo(dAtA []byte) (int, error) {
|
||||
i += n
|
||||
}
|
||||
}
|
||||
if len(m.Manifests) > 0 {
|
||||
for _, s := range m.Manifests {
|
||||
dAtA[i] = 0x42
|
||||
i++
|
||||
l = len(s)
|
||||
for l >= 1<<7 {
|
||||
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
|
||||
l >>= 7
|
||||
i++
|
||||
}
|
||||
dAtA[i] = uint8(l)
|
||||
i++
|
||||
i += copy(dAtA[i:], s)
|
||||
}
|
||||
}
|
||||
if m.XXX_unrecognized != nil {
|
||||
i += copy(dAtA[i:], m.XXX_unrecognized)
|
||||
}
|
||||
@@ -3441,6 +3464,12 @@ func (m *ApplicationSyncRequest) Size() (n int) {
|
||||
n += 1 + l + sovApplication(uint64(l))
|
||||
}
|
||||
}
|
||||
if len(m.Manifests) > 0 {
|
||||
for _, s := range m.Manifests {
|
||||
l = len(s)
|
||||
n += 1 + l + sovApplication(uint64(l))
|
||||
}
|
||||
}
|
||||
if m.XXX_unrecognized != nil {
|
||||
n += len(m.XXX_unrecognized)
|
||||
}
|
||||
@@ -4741,6 +4770,35 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error {
|
||||
return err
|
||||
}
|
||||
iNdEx = postIndex
|
||||
case 8:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Manifests", wireType)
|
||||
}
|
||||
var stringLen uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowApplication
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
stringLen |= (uint64(b) & 0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
intStringLen := int(stringLen)
|
||||
if intStringLen < 0 {
|
||||
return ErrInvalidLengthApplication
|
||||
}
|
||||
postIndex := iNdEx + intStringLen
|
||||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
m.Manifests = append(m.Manifests, string(dAtA[iNdEx:postIndex]))
|
||||
iNdEx = postIndex
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipApplication(dAtA[iNdEx:])
|
||||
@@ -7264,122 +7322,123 @@ var (
|
||||
)
|
||||
|
||||
func init() {
|
||||
proto.RegisterFile("server/application/application.proto", fileDescriptor_application_fe5e7332ebc1d7c2)
|
||||
proto.RegisterFile("server/application/application.proto", fileDescriptor_application_0acf736a0f21a996)
|
||||
}
|
||||
|
||||
var fileDescriptor_application_fe5e7332ebc1d7c2 = []byte{
|
||||
// 1797 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x6f, 0x1c, 0x49,
|
||||
0x15, 0xa7, 0x66, 0xc6, 0x33, 0xe3, 0x67, 0xb3, 0x1f, 0xb5, 0xbb, 0xa1, 0xb7, 0xed, 0xd8, 0xa3,
|
||||
0x8a, 0xe3, 0x38, 0xde, 0xb8, 0x3b, 0x36, 0x01, 0x56, 0x16, 0xd2, 0xee, 0x7a, 0x1d, 0xbc, 0x46,
|
||||
0x5e, 0x63, 0xc6, 0x5e, 0x90, 0x90, 0x10, 0xea, 0x74, 0x97, 0xc7, 0x8d, 0x67, 0xba, 0x9b, 0xee,
|
||||
0x9e, 0x41, 0x43, 0x94, 0x03, 0x11, 0x42, 0x1c, 0x10, 0x08, 0xc1, 0x21, 0x20, 0xbe, 0x94, 0x33,
|
||||
0x37, 0xc4, 0x85, 0x03, 0x37, 0xa4, 0x1c, 0x91, 0xe0, 0x1c, 0x21, 0x93, 0x3f, 0x80, 0x13, 0x67,
|
||||
0x54, 0xd5, 0x55, 0xdd, 0xd5, 0xf6, 0x4c, 0xcf, 0x38, 0x99, 0x3d, 0xe4, 0xd6, 0xf3, 0xaa, 0xfa,
|
||||
0xbd, 0xdf, 0xfb, 0xa8, 0x57, 0xef, 0xd7, 0x03, 0x4b, 0x11, 0x0d, 0x7b, 0x34, 0x34, 0xad, 0x20,
|
||||
0x68, 0xbb, 0xb6, 0x15, 0xbb, 0xbe, 0xa7, 0x3e, 0x1b, 0x41, 0xe8, 0xc7, 0x3e, 0x9e, 0x51, 0x44,
|
||||
0xfa, 0x9b, 0x2d, 0xbf, 0xe5, 0x73, 0xb9, 0xc9, 0x9e, 0x92, 0x2d, 0xfa, 0x7c, 0xcb, 0xf7, 0x5b,
|
||||
0x6d, 0x6a, 0x5a, 0x81, 0x6b, 0x5a, 0x9e, 0xe7, 0xc7, 0x7c, 0x73, 0x24, 0x56, 0xc9, 0xe9, 0xbb,
|
||||
0x91, 0xe1, 0xfa, 0x7c, 0xd5, 0xf6, 0x43, 0x6a, 0xf6, 0xd6, 0xcd, 0x16, 0xf5, 0x68, 0x68, 0xc5,
|
||||
0xd4, 0x11, 0x7b, 0xee, 0x64, 0x7b, 0x3a, 0x96, 0x7d, 0xe2, 0x7a, 0x34, 0xec, 0x9b, 0xc1, 0x69,
|
||||
0x8b, 0x09, 0x22, 0xb3, 0x43, 0x63, 0x6b, 0xd0, 0x5b, 0xbb, 0x2d, 0x37, 0x3e, 0xe9, 0xde, 0x33,
|
||||
0x6c, 0xbf, 0x63, 0x5a, 0x21, 0x07, 0xf6, 0x5d, 0xfe, 0xb0, 0x66, 0x3b, 0xd9, 0xdb, 0xaa, 0x7b,
|
||||
0xbd, 0x75, 0xab, 0x1d, 0x9c, 0x58, 0x17, 0x55, 0x6d, 0x15, 0xa9, 0x0a, 0x69, 0xe0, 0x8b, 0x58,
|
||||
0xf1, 0x47, 0x37, 0xf6, 0xc3, 0xbe, 0xf2, 0x98, 0xe8, 0x20, 0x8f, 0x10, 0xbc, 0xf6, 0x41, 0x66,
|
||||
0xec, 0xeb, 0x5d, 0x1a, 0xf6, 0x31, 0x86, 0x8a, 0x67, 0x75, 0xa8, 0x86, 0x1a, 0x68, 0x65, 0xba,
|
||||
0xc9, 0x9f, 0xb1, 0x06, 0xb5, 0x90, 0x1e, 0x87, 0x34, 0x3a, 0xd1, 0x4a, 0x5c, 0x2c, 0x7f, 0xe2,
|
||||
0x65, 0xa8, 0x31, 0xcb, 0xd4, 0x8e, 0xb5, 0x72, 0xa3, 0xbc, 0x32, 0xbd, 0x35, 0x7b, 0xf6, 0x74,
|
||||
0xb1, 0x7e, 0x90, 0x88, 0xa2, 0xa6, 0x5c, 0xc4, 0x06, 0xbc, 0x1a, 0xd2, 0xc8, 0xef, 0x86, 0x36,
|
||||
0xfd, 0x06, 0x0d, 0x23, 0xd7, 0xf7, 0xb4, 0x0a, 0xd3, 0xb4, 0x55, 0x79, 0xf2, 0x74, 0xf1, 0x33,
|
||||
0xcd, 0xf3, 0x8b, 0xe4, 0xaf, 0x08, 0x16, 0x14, 0x68, 0x4d, 0xb1, 0x7c, 0xb7, 0x47, 0xbd, 0x38,
|
||||
0x3a, 0x0f, 0xb4, 0x94, 0x02, 0xdd, 0x80, 0xd7, 0xa5, 0xa6, 0x7d, 0xab, 0x43, 0xa3, 0xc0, 0xb2,
|
||||
0xa9, 0x56, 0x62, 0x1b, 0x84, 0xa1, 0x8b, 0xcb, 0x78, 0x05, 0x66, 0x55, 0xa1, 0x56, 0x56, 0xb6,
|
||||
0xe7, 0x56, 0xf0, 0x32, 0xcc, 0xc8, 0xdf, 0x9f, 0xec, 0x6e, 0x6b, 0x15, 0x65, 0xa3, 0xba, 0x40,
|
||||
0x0e, 0x40, 0x53, 0xb0, 0x7f, 0x6c, 0x79, 0xee, 0x31, 0x8d, 0xe2, 0xe1, 0xa8, 0x1b, 0x50, 0x0f,
|
||||
0x69, 0xcf, 0xe5, 0x51, 0x29, 0x29, 0x51, 0x49, 0xa5, 0xe4, 0x2d, 0x78, 0x23, 0x1f, 0x8d, 0xc0,
|
||||
0xf7, 0x22, 0x4a, 0x1e, 0xa3, 0x9c, 0xa5, 0x0f, 0x43, 0x6a, 0xc5, 0xb4, 0x49, 0xbf, 0xd7, 0xa5,
|
||||
0x51, 0x8c, 0x3d, 0x50, 0x4f, 0x02, 0x37, 0x38, 0xb3, 0xf1, 0x15, 0x23, 0xab, 0x1b, 0x43, 0xd6,
|
||||
0x0d, 0x7f, 0xf8, 0x8e, 0xed, 0x18, 0xc1, 0x69, 0xcb, 0x60, 0x25, 0x68, 0xa8, 0xa7, 0x4a, 0x96,
|
||||
0xa0, 0xa1, 0x58, 0x92, 0x5e, 0x2b, 0xfb, 0xf0, 0x15, 0xa8, 0x76, 0x83, 0x88, 0x86, 0x31, 0xf7,
|
||||
0xa1, 0xde, 0x14, 0xbf, 0xc8, 0x8f, 0xf2, 0x20, 0x3f, 0x09, 0x1c, 0x05, 0xe4, 0xc9, 0xa7, 0x08,
|
||||
0x32, 0x07, 0x8f, 0x7c, 0x94, 0x43, 0xb1, 0x4d, 0xdb, 0x34, 0x43, 0x31, 0x28, 0x29, 0x1a, 0xd4,
|
||||
0x6c, 0x2b, 0xb2, 0x2d, 0x87, 0x0a, 0x7f, 0xe4, 0x4f, 0xf2, 0x9f, 0x12, 0x5c, 0x51, 0x54, 0x1d,
|
||||
0xf6, 0x3d, 0xbb, 0x48, 0xd1, 0xc8, 0xec, 0xe2, 0x79, 0xa8, 0x3a, 0x61, 0xbf, 0xd9, 0xf5, 0xb4,
|
||||
0x32, 0xb3, 0x24, 0xd6, 0x85, 0x0c, 0xeb, 0x30, 0x15, 0x84, 0x5d, 0x8f, 0xf2, 0x03, 0x23, 0x17,
|
||||
0x13, 0x11, 0xb6, 0xa1, 0x1e, 0xc5, 0xac, 0x2d, 0xb4, 0xfa, 0xda, 0x54, 0x03, 0xad, 0xcc, 0x6c,
|
||||
0xec, 0xbc, 0x40, 0xec, 0x98, 0x27, 0x87, 0x42, 0x5d, 0x33, 0x55, 0x8c, 0x63, 0x98, 0x96, 0xd5,
|
||||
0x1d, 0x69, 0xb5, 0x46, 0x79, 0x65, 0x66, 0xe3, 0xe0, 0x05, 0xad, 0x7c, 0x2d, 0x60, 0xcd, 0x4c,
|
||||
0x39, 0xd8, 0xc2, 0xad, 0xcc, 0x10, 0x6b, 0x4e, 0xf3, 0x17, 0xca, 0xe6, 0x30, 0xa0, 0x85, 0xb1,
|
||||
0x76, 0xa0, 0x12, 0x05, 0xd4, 0xe6, 0x47, 0x7e, 0x66, 0xe3, 0xab, 0x93, 0xa9, 0x23, 0x66, 0x54,
|
||||
0xe0, 0xe3, 0xda, 0xc9, 0x2e, 0x7c, 0x4e, 0x59, 0x3e, 0xb0, 0x62, 0xfb, 0xa4, 0x08, 0x14, 0x4b,
|
||||
0x20, 0xdb, 0x93, 0x6b, 0x44, 0x89, 0x88, 0xfc, 0x18, 0x81, 0xae, 0x96, 0xac, 0xdf, 0x6e, 0xdf,
|
||||
0xb3, 0xec, 0xd3, 0x62, 0x75, 0x25, 0xd7, 0xe1, 0xba, 0xca, 0x5b, 0xc0, 0x74, 0x9d, 0x3d, 0x5d,
|
||||
0x2c, 0xed, 0x6e, 0x37, 0x4b, 0xae, 0xf3, 0xfc, 0x95, 0x44, 0xfe, 0x75, 0x0e, 0x88, 0xc8, 0x43,
|
||||
0x11, 0x10, 0x02, 0xd3, 0xde, 0xc0, 0x26, 0x9b, 0x89, 0x2f, 0xd1, 0x5c, 0x17, 0xa0, 0xd6, 0x4b,
|
||||
0x6f, 0x86, 0x6c, 0x93, 0x14, 0x32, 0xf0, 0xad, 0xd0, 0xef, 0x06, 0xda, 0x94, 0x1a, 0x45, 0x2e,
|
||||
0xc2, 0x1a, 0x54, 0x4e, 0x5d, 0xcf, 0xd1, 0xaa, 0xca, 0x12, 0x97, 0x90, 0x5f, 0x97, 0x60, 0x71,
|
||||
0x80, 0x5b, 0x23, 0x73, 0xf6, 0x12, 0xf8, 0x96, 0xd5, 0x55, 0xed, 0x42, 0x5d, 0x31, 0xfc, 0xfc,
|
||||
0xe1, 0xa8, 0x1f, 0x50, 0xad, 0xae, 0xe2, 0x4f, 0xc5, 0xe4, 0x7f, 0x08, 0x1a, 0x03, 0x62, 0x33,
|
||||
0xba, 0x35, 0xbe, 0x24, 0xc1, 0x39, 0xf6, 0x43, 0x9b, 0x6a, 0xb5, 0xb4, 0xd6, 0x51, 0x33, 0x11,
|
||||
0x91, 0xff, 0x22, 0xd0, 0xa4, 0xb7, 0x1f, 0xd8, 0xdc, 0xf7, 0xae, 0xf7, 0xb2, 0x3b, 0x3c, 0x0f,
|
||||
0x55, 0x8b, 0xfb, 0x92, 0x2b, 0x07, 0x21, 0x23, 0x3f, 0x41, 0x30, 0x97, 0x77, 0x39, 0xda, 0x73,
|
||||
0xa3, 0x58, 0x4e, 0x12, 0xd8, 0x85, 0x5a, 0xb2, 0x33, 0xd2, 0x10, 0xef, 0xf0, 0xbb, 0x2f, 0xd0,
|
||||
0x3b, 0xf3, 0x86, 0xa4, 0x7b, 0x42, 0x3f, 0x79, 0x0f, 0xe6, 0x06, 0x36, 0x1a, 0x81, 0xa4, 0x01,
|
||||
0xf5, 0x8e, 0x98, 0x98, 0x92, 0x1c, 0xc8, 0xeb, 0x52, 0x4a, 0xc9, 0xdf, 0x4b, 0xf9, 0xfe, 0xeb,
|
||||
0x3b, 0x7b, 0x7e, 0xab, 0x60, 0x28, 0x1c, 0x27, 0x7b, 0x1a, 0xd4, 0x02, 0xdf, 0xc9, 0x12, 0xd7,
|
||||
0x94, 0x3f, 0xd9, 0xdb, 0xb6, 0xef, 0xc5, 0x16, 0x1b, 0xf1, 0x73, 0xf9, 0xca, 0xc4, 0x2c, 0xf7,
|
||||
0x91, 0xeb, 0xd9, 0xf4, 0x90, 0xda, 0xbe, 0xe7, 0x44, 0x3c, 0x71, 0x65, 0x99, 0x7b, 0x75, 0x05,
|
||||
0x7f, 0x04, 0xd3, 0xfc, 0xf7, 0x91, 0xdb, 0xa1, 0x5a, 0x95, 0xdf, 0xd8, 0xab, 0x46, 0xc2, 0x25,
|
||||
0x0c, 0x95, 0x4b, 0x64, 0x11, 0x66, 0x5c, 0xc2, 0xe8, 0xad, 0x1b, 0xec, 0x8d, 0x66, 0xf6, 0x32,
|
||||
0xc3, 0x15, 0x5b, 0x6e, 0x7b, 0xcf, 0xf5, 0xf8, 0xad, 0x9c, 0x19, 0xcc, 0xc4, 0xac, 0x26, 0x8e,
|
||||
0xfd, 0x76, 0xdb, 0xff, 0x3e, 0x6f, 0x01, 0xe9, 0x75, 0x90, 0xc8, 0xc8, 0x0f, 0xa0, 0xbe, 0xe7,
|
||||
0xb7, 0xee, 0x7a, 0x71, 0xd8, 0x67, 0x35, 0xc9, 0xdc, 0xa1, 0x5e, 0x3e, 0xe8, 0x52, 0x88, 0xf7,
|
||||
0x61, 0x3a, 0x76, 0x3b, 0xf4, 0x30, 0xb6, 0x3a, 0x81, 0xb8, 0x5d, 0x2f, 0x81, 0x3b, 0x45, 0x26,
|
||||
0x55, 0x10, 0x13, 0xde, 0x4e, 0x67, 0x80, 0x23, 0x1a, 0x76, 0x5c, 0xcf, 0x2a, 0xec, 0x39, 0x64,
|
||||
0x1e, 0xf4, 0x41, 0x2f, 0x88, 0x41, 0xf8, 0x7d, 0x78, 0x45, 0x16, 0x92, 0x28, 0x04, 0x03, 0x5e,
|
||||
0x55, 0x6a, 0x73, 0x3f, 0x55, 0x27, 0x3a, 0xc1, 0xf9, 0x45, 0xd2, 0x07, 0xed, 0x63, 0xcb, 0xb3,
|
||||
0x5a, 0xd4, 0x49, 0x15, 0xa5, 0x25, 0xf9, 0x6d, 0x98, 0x72, 0x63, 0xda, 0x91, 0x47, 0x63, 0x67,
|
||||
0x02, 0x47, 0x63, 0xdb, 0x3d, 0x3e, 0x6e, 0x26, 0x5a, 0x37, 0x9e, 0xbd, 0x0d, 0x58, 0x1d, 0x37,
|
||||
0x68, 0xd8, 0x73, 0x6d, 0x8a, 0x7f, 0x8e, 0xa0, 0xc2, 0xce, 0x28, 0xbe, 0x9a, 0x53, 0x75, 0x9e,
|
||||
0xb0, 0xe9, 0x13, 0x9a, 0x72, 0x98, 0x29, 0x32, 0xff, 0xf0, 0x9f, 0xcf, 0x7e, 0x59, 0xba, 0x82,
|
||||
0xdf, 0xe4, 0xe4, 0xb7, 0xb7, 0xae, 0x72, 0xd1, 0x08, 0xff, 0x14, 0x01, 0x16, 0x5d, 0x43, 0x61,
|
||||
0x63, 0xf8, 0x9d, 0x61, 0xf8, 0x06, 0xb0, 0x36, 0xfd, 0xaa, 0x52, 0x35, 0x06, 0x63, 0xd7, 0xac,
|
||||
0x46, 0xf8, 0x06, 0x0e, 0x60, 0x95, 0x03, 0x58, 0xc2, 0x64, 0x10, 0x00, 0xf3, 0x3e, 0x2b, 0x85,
|
||||
0x07, 0x26, 0x4d, 0xec, 0xfe, 0x01, 0xc1, 0xd4, 0x37, 0xf9, 0x6d, 0x37, 0x22, 0x42, 0x07, 0x93,
|
||||
0x89, 0x10, 0xb7, 0xc5, 0xa1, 0x92, 0x6b, 0x1c, 0xe6, 0x55, 0x3c, 0x27, 0x61, 0x46, 0x71, 0x48,
|
||||
0xad, 0x4e, 0x0e, 0xed, 0x6d, 0x84, 0x1f, 0x23, 0xa8, 0x26, 0xa4, 0x0c, 0x5f, 0x1f, 0x06, 0x31,
|
||||
0x47, 0xda, 0xf4, 0x09, 0x51, 0x1f, 0x72, 0x93, 0x03, 0xbc, 0x46, 0x06, 0x26, 0x72, 0x33, 0xc7,
|
||||
0xdb, 0x7e, 0x81, 0xa0, 0xbc, 0x43, 0x47, 0x96, 0xd9, 0xa4, 0x90, 0x5d, 0x08, 0xdd, 0x80, 0x0c,
|
||||
0xe3, 0x87, 0x08, 0x66, 0x77, 0x68, 0x2c, 0xa9, 0x73, 0x34, 0x3c, 0x7c, 0x39, 0x76, 0xad, 0xcf,
|
||||
0x1b, 0xca, 0x47, 0x0e, 0xb9, 0x94, 0x76, 0x89, 0x35, 0x6e, 0xfa, 0x06, 0xbe, 0x5e, 0x54, 0x5c,
|
||||
0x9d, 0xd4, 0xe6, 0xdf, 0x10, 0x54, 0x13, 0xda, 0x31, 0xdc, 0x7c, 0x8e, 0xcd, 0x4e, 0x2c, 0x46,
|
||||
0x77, 0x39, 0xd0, 0xf7, 0xf4, 0xdb, 0x83, 0x81, 0xaa, 0xef, 0xb3, 0x36, 0xeb, 0x58, 0xb1, 0x65,
|
||||
0x70, 0xf4, 0xf9, 0xcc, 0xfe, 0x19, 0x01, 0x64, 0xbc, 0x09, 0xdf, 0x2c, 0x76, 0x42, 0xe1, 0x56,
|
||||
0xfa, 0x04, 0x99, 0x13, 0x31, 0xb8, 0x33, 0x2b, 0x7a, 0xa3, 0x28, 0xea, 0x8c, 0x57, 0x6d, 0x72,
|
||||
0x76, 0x85, 0x7f, 0x87, 0x60, 0x8a, 0xcf, 0xe7, 0x78, 0x69, 0x18, 0x60, 0x75, 0x7c, 0x9f, 0x58,
|
||||
0xd0, 0x97, 0x39, 0xce, 0xc6, 0x46, 0x51, 0x61, 0x6e, 0xa2, 0x55, 0xdc, 0x83, 0x6a, 0x32, 0x22,
|
||||
0x0f, 0xaf, 0x8a, 0xdc, 0x08, 0xad, 0x37, 0x0a, 0xfa, 0x63, 0x52, 0x98, 0xe2, 0x4c, 0xac, 0x16,
|
||||
0x9e, 0x89, 0x3f, 0x22, 0xa8, 0x30, 0xee, 0x8c, 0xaf, 0x0d, 0xd3, 0xa7, 0x7c, 0x89, 0x98, 0x58,
|
||||
0x54, 0xde, 0xe1, 0xd0, 0xae, 0x93, 0xe2, 0xec, 0xf5, 0x3d, 0x9b, 0x85, 0xe6, 0x11, 0x82, 0xd7,
|
||||
0xce, 0xdf, 0xa2, 0x78, 0x2e, 0x67, 0x24, 0x7f, 0x4d, 0xeb, 0xf9, 0x10, 0x0e, 0xbb, 0x81, 0xc9,
|
||||
0xfb, 0x1c, 0xc5, 0x26, 0x7e, 0x77, 0xe4, 0x81, 0xd8, 0x97, 0x87, 0x98, 0x29, 0x5a, 0x4b, 0x3f,
|
||||
0x27, 0xe0, 0xbf, 0x20, 0x98, 0x95, 0x7a, 0x8f, 0x42, 0x4a, 0x8b, 0x61, 0x4d, 0xa8, 0xfe, 0x99,
|
||||
0x21, 0xf2, 0x65, 0x8e, 0xfd, 0x8b, 0xf8, 0xce, 0x98, 0xd8, 0x25, 0xe6, 0xb5, 0x98, 0xc1, 0xfc,
|
||||
0x13, 0x82, 0xba, 0xfc, 0x2a, 0x80, 0x6f, 0x0c, 0xad, 0xa4, 0xfc, 0x77, 0x83, 0x89, 0x65, 0xdf,
|
||||
0xe4, 0xd8, 0x6f, 0x92, 0xa5, 0xa2, 0xec, 0x87, 0xc2, 0x38, 0xab, 0x80, 0x5f, 0x21, 0xc0, 0xe9,
|
||||
0x78, 0x96, 0x0e, 0x6c, 0x78, 0x39, 0x67, 0x6a, 0xe8, 0xe4, 0xa7, 0xdf, 0x18, 0xb9, 0x2f, 0xdf,
|
||||
0xca, 0x57, 0x0b, 0x5b, 0xb9, 0x9f, 0xda, 0xff, 0x19, 0x82, 0x99, 0x1d, 0x9a, 0x0e, 0x2e, 0x05,
|
||||
0x81, 0xcc, 0x7f, 0xf7, 0xd0, 0x57, 0x46, 0x6f, 0x14, 0x88, 0x6e, 0x71, 0x44, 0xcb, 0xb8, 0x38,
|
||||
0x54, 0x12, 0xc0, 0x6f, 0x11, 0x7c, 0x56, 0x74, 0x31, 0x21, 0xb9, 0x35, 0xca, 0x52, 0xae, 0xe9,
|
||||
0x8d, 0x8f, 0xeb, 0xf3, 0x1c, 0xd7, 0x1a, 0x19, 0x0b, 0xd7, 0xa6, 0xf8, 0x7c, 0xf0, 0x7b, 0x04,
|
||||
0x6f, 0xa8, 0x93, 0x9e, 0xa0, 0x8c, 0xcf, 0x1b, 0xb7, 0x02, 0xe6, 0x49, 0xee, 0x70, 0x7c, 0x06,
|
||||
0xbe, 0x35, 0x0e, 0x3e, 0x53, 0x90, 0x48, 0xfc, 0x1b, 0x04, 0xaf, 0x73, 0xd2, 0xae, 0x2a, 0x3e,
|
||||
0xd7, 0x90, 0x87, 0x51, 0xfc, 0x31, 0x1a, 0xb2, 0x38, 0xb3, 0xe4, 0x52, 0xa0, 0x36, 0x05, 0xd9,
|
||||
0x66, 0x93, 0xfb, 0x2b, 0xf2, 0x0a, 0x10, 0xd9, 0x5d, 0x1b, 0x15, 0xb8, 0xcb, 0x5e, 0x19, 0xa2,
|
||||
0xdc, 0x56, 0xc7, 0x2b, 0xb7, 0x1f, 0x22, 0xa8, 0x09, 0x9e, 0x5c, 0x70, 0xab, 0x2a, 0x44, 0x5a,
|
||||
0x7f, 0x2b, 0xb7, 0x4b, 0xf2, 0x44, 0xf2, 0x25, 0x6e, 0x76, 0x1d, 0x9b, 0x45, 0x66, 0x03, 0xdf,
|
||||
0x89, 0xcc, 0xfb, 0x82, 0x40, 0x3f, 0x30, 0xdb, 0x7e, 0x2b, 0xba, 0x8d, 0xb6, 0x3e, 0x7c, 0x72,
|
||||
0xb6, 0x80, 0xfe, 0x71, 0xb6, 0x80, 0xfe, 0x7d, 0xb6, 0x80, 0xbe, 0xf5, 0x85, 0x31, 0xfe, 0x0a,
|
||||
0xb3, 0xdb, 0x2e, 0xf5, 0x62, 0xd5, 0xc4, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x99, 0x7a, 0xd8,
|
||||
0x90, 0x03, 0x1c, 0x00, 0x00,
|
||||
var fileDescriptor_application_0acf736a0f21a996 = []byte{
|
||||
// 1809 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x6f, 0x23, 0x49,
|
||||
0x15, 0xa7, 0x6c, 0xc7, 0x76, 0x5e, 0xc2, 0x7e, 0xd4, 0xee, 0x0e, 0xbd, 0x1d, 0x4f, 0x62, 0xd5,
|
||||
0x64, 0x32, 0x99, 0xec, 0xa4, 0x7b, 0x12, 0x06, 0x58, 0x45, 0x48, 0xbb, 0x9b, 0xcd, 0x90, 0x0d,
|
||||
0xca, 0x86, 0xe0, 0x64, 0x41, 0x42, 0x42, 0xa8, 0xb7, 0xbb, 0xe2, 0x34, 0xb1, 0xbb, 0x9b, 0xee,
|
||||
0xb6, 0x91, 0x59, 0xed, 0x61, 0x57, 0x08, 0x71, 0x40, 0x20, 0x04, 0x87, 0x01, 0xf1, 0xa5, 0x39,
|
||||
0x73, 0x43, 0x5c, 0x38, 0x70, 0x43, 0x9a, 0x23, 0x12, 0x9c, 0x47, 0x28, 0x9a, 0x3f, 0x80, 0x13,
|
||||
0x67, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x89, 0xdd, 0x76, 0x66, 0xbc, 0x87, 0xb9, 0xb5, 0x5f, 0x55,
|
||||
0xbf, 0xf7, 0x7b, 0x1f, 0xf5, 0xea, 0xfd, 0xda, 0xb0, 0x1c, 0xd1, 0xb0, 0x4f, 0x43, 0xd3, 0x0a,
|
||||
0x82, 0x8e, 0x6b, 0x5b, 0xb1, 0xeb, 0x7b, 0xea, 0xb3, 0x11, 0x84, 0x7e, 0xec, 0xe3, 0x39, 0x45,
|
||||
0xa4, 0xbf, 0xda, 0xf6, 0xdb, 0x3e, 0x97, 0x9b, 0xec, 0x29, 0xd9, 0xa2, 0x37, 0xda, 0xbe, 0xdf,
|
||||
0xee, 0x50, 0xd3, 0x0a, 0x5c, 0xd3, 0xf2, 0x3c, 0x3f, 0xe6, 0x9b, 0x23, 0xb1, 0x4a, 0xce, 0xde,
|
||||
0x8c, 0x0c, 0xd7, 0xe7, 0xab, 0xb6, 0x1f, 0x52, 0xb3, 0xbf, 0x61, 0xb6, 0xa9, 0x47, 0x43, 0x2b,
|
||||
0xa6, 0x8e, 0xd8, 0x73, 0x2f, 0xdb, 0xd3, 0xb5, 0xec, 0x53, 0xd7, 0xa3, 0xe1, 0xc0, 0x0c, 0xce,
|
||||
0xda, 0x4c, 0x10, 0x99, 0x5d, 0x1a, 0x5b, 0xc3, 0xde, 0xda, 0x6b, 0xbb, 0xf1, 0x69, 0xef, 0x43,
|
||||
0xc3, 0xf6, 0xbb, 0xa6, 0x15, 0x72, 0x60, 0xdf, 0xe7, 0x0f, 0xeb, 0xb6, 0x93, 0xbd, 0xad, 0xba,
|
||||
0xd7, 0xdf, 0xb0, 0x3a, 0xc1, 0xa9, 0x75, 0x59, 0xd5, 0x76, 0x91, 0xaa, 0x90, 0x06, 0xbe, 0x88,
|
||||
0x15, 0x7f, 0x74, 0x63, 0x3f, 0x1c, 0x28, 0x8f, 0x89, 0x0e, 0xf2, 0x00, 0xc1, 0x4b, 0xef, 0x64,
|
||||
0xc6, 0xbe, 0xd9, 0xa3, 0xe1, 0x00, 0x63, 0xa8, 0x78, 0x56, 0x97, 0x6a, 0xa8, 0x89, 0x56, 0x67,
|
||||
0x5b, 0xfc, 0x19, 0x6b, 0x50, 0x0b, 0xe9, 0x49, 0x48, 0xa3, 0x53, 0xad, 0xc4, 0xc5, 0xf2, 0x27,
|
||||
0x5e, 0x81, 0x1a, 0xb3, 0x4c, 0xed, 0x58, 0x2b, 0x37, 0xcb, 0xab, 0xb3, 0xdb, 0xf3, 0xe7, 0x8f,
|
||||
0x97, 0xea, 0x87, 0x89, 0x28, 0x6a, 0xc9, 0x45, 0x6c, 0xc0, 0x8b, 0x21, 0x8d, 0xfc, 0x5e, 0x68,
|
||||
0xd3, 0x6f, 0xd1, 0x30, 0x72, 0x7d, 0x4f, 0xab, 0x30, 0x4d, 0xdb, 0x95, 0x47, 0x8f, 0x97, 0x3e,
|
||||
0xd7, 0xba, 0xb8, 0x48, 0xfe, 0x86, 0x60, 0x51, 0x81, 0xd6, 0x12, 0xcb, 0xf7, 0xfb, 0xd4, 0x8b,
|
||||
0xa3, 0x8b, 0x40, 0x4b, 0x29, 0xd0, 0x4d, 0x78, 0x59, 0x6a, 0x3a, 0xb0, 0xba, 0x34, 0x0a, 0x2c,
|
||||
0x9b, 0x6a, 0x25, 0xb6, 0x41, 0x18, 0xba, 0xbc, 0x8c, 0x57, 0x61, 0x5e, 0x15, 0x6a, 0x65, 0x65,
|
||||
0x7b, 0x6e, 0x05, 0xaf, 0xc0, 0x9c, 0xfc, 0xfd, 0xc1, 0xde, 0x8e, 0x56, 0x51, 0x36, 0xaa, 0x0b,
|
||||
0xe4, 0x10, 0x34, 0x05, 0xfb, 0xfb, 0x96, 0xe7, 0x9e, 0xd0, 0x28, 0x1e, 0x8d, 0xba, 0x09, 0xf5,
|
||||
0x90, 0xf6, 0x5d, 0x1e, 0x95, 0x92, 0x12, 0x95, 0x54, 0x4a, 0x5e, 0x83, 0x57, 0xf2, 0xd1, 0x08,
|
||||
0x7c, 0x2f, 0xa2, 0xe4, 0x21, 0xca, 0x59, 0x7a, 0x37, 0xa4, 0x56, 0x4c, 0x5b, 0xf4, 0x07, 0x3d,
|
||||
0x1a, 0xc5, 0xd8, 0x03, 0xf5, 0x24, 0x70, 0x83, 0x73, 0x9b, 0x5f, 0x33, 0xb2, 0xba, 0x31, 0x64,
|
||||
0xdd, 0xf0, 0x87, 0xef, 0xd9, 0x8e, 0x11, 0x9c, 0xb5, 0x0d, 0x56, 0x82, 0x86, 0x7a, 0xaa, 0x64,
|
||||
0x09, 0x1a, 0x8a, 0x25, 0xe9, 0xb5, 0xb2, 0x0f, 0x5f, 0x83, 0x6a, 0x2f, 0x88, 0x68, 0x18, 0x73,
|
||||
0x1f, 0xea, 0x2d, 0xf1, 0x8b, 0xfc, 0x38, 0x0f, 0xf2, 0x83, 0xc0, 0x51, 0x40, 0x9e, 0x7e, 0x86,
|
||||
0x20, 0x73, 0xf0, 0xc8, 0x7b, 0x39, 0x14, 0x3b, 0xb4, 0x43, 0x33, 0x14, 0xc3, 0x92, 0xa2, 0x41,
|
||||
0xcd, 0xb6, 0x22, 0xdb, 0x72, 0xa8, 0xf0, 0x47, 0xfe, 0x24, 0x9f, 0x94, 0xe1, 0x9a, 0xa2, 0xea,
|
||||
0x68, 0xe0, 0xd9, 0x45, 0x8a, 0xc6, 0x66, 0x17, 0x37, 0xa0, 0xea, 0x84, 0x83, 0x56, 0xcf, 0xd3,
|
||||
0xca, 0xcc, 0x92, 0x58, 0x17, 0x32, 0xac, 0xc3, 0x4c, 0x10, 0xf6, 0x3c, 0xca, 0x0f, 0x8c, 0x5c,
|
||||
0x4c, 0x44, 0xd8, 0x86, 0x7a, 0x14, 0xb3, 0xb6, 0xd0, 0x1e, 0x68, 0x33, 0x4d, 0xb4, 0x3a, 0xb7,
|
||||
0xb9, 0xfb, 0x0c, 0xb1, 0x63, 0x9e, 0x1c, 0x09, 0x75, 0xad, 0x54, 0x31, 0x8e, 0x61, 0x56, 0x56,
|
||||
0x77, 0xa4, 0xd5, 0x9a, 0xe5, 0xd5, 0xb9, 0xcd, 0xc3, 0x67, 0xb4, 0xf2, 0x8d, 0x80, 0x35, 0x33,
|
||||
0xe5, 0x60, 0x0b, 0xb7, 0x32, 0x43, 0xb8, 0x01, 0xb3, 0x5d, 0x71, 0x72, 0x22, 0xad, 0xce, 0x7a,
|
||||
0x4b, 0x2b, 0x13, 0xb0, 0xd6, 0xd5, 0xb8, 0x54, 0x54, 0x47, 0x01, 0x2d, 0xcc, 0x84, 0x03, 0x95,
|
||||
0x28, 0xa0, 0x36, 0x6f, 0x08, 0x73, 0x9b, 0x5f, 0x9f, 0x4e, 0x95, 0x31, 0xa3, 0x02, 0x3d, 0xd7,
|
||||
0x4e, 0xf6, 0xe0, 0x0b, 0xca, 0xf2, 0xa1, 0x15, 0xdb, 0xa7, 0x45, 0xa0, 0x58, 0x7a, 0xd9, 0x9e,
|
||||
0x5c, 0x9b, 0x4a, 0x44, 0xe4, 0x27, 0x08, 0x74, 0xb5, 0xa0, 0xfd, 0x4e, 0xe7, 0x43, 0xcb, 0x3e,
|
||||
0x2b, 0x56, 0x57, 0x72, 0x1d, 0xae, 0xab, 0xbc, 0x0d, 0x4c, 0xd7, 0xf9, 0xe3, 0xa5, 0xd2, 0xde,
|
||||
0x4e, 0xab, 0xe4, 0x3a, 0x4f, 0x5f, 0x67, 0xe4, 0xdf, 0x17, 0x80, 0x88, 0x2c, 0x15, 0x01, 0x21,
|
||||
0x30, 0xeb, 0x0d, 0x6d, 0xc1, 0x99, 0xf8, 0x0a, 0xad, 0x77, 0x11, 0x6a, 0xfd, 0xf4, 0xde, 0xc8,
|
||||
0x36, 0x49, 0x21, 0x03, 0xdf, 0x0e, 0xfd, 0x5e, 0xa0, 0xcd, 0xa8, 0x51, 0xe4, 0x22, 0xac, 0x41,
|
||||
0xe5, 0xcc, 0xf5, 0x1c, 0xad, 0xaa, 0x2c, 0x71, 0x09, 0xf9, 0x4d, 0x09, 0x96, 0x86, 0xb8, 0x35,
|
||||
0x36, 0x67, 0xcf, 0x81, 0x6f, 0x59, 0x5d, 0xd5, 0x2e, 0xd5, 0x15, 0xc3, 0xcf, 0x1f, 0x8e, 0x07,
|
||||
0x01, 0xd5, 0xea, 0x2a, 0xfe, 0x54, 0x4c, 0xfe, 0x87, 0xa0, 0x39, 0x24, 0x36, 0xe3, 0x1b, 0xe7,
|
||||
0x73, 0x12, 0x9c, 0x13, 0x3f, 0xb4, 0xa9, 0x56, 0x4b, 0x6b, 0x1d, 0xb5, 0x12, 0x11, 0xf9, 0x2f,
|
||||
0x02, 0x4d, 0x7a, 0xfb, 0x8e, 0xcd, 0x7d, 0xef, 0x79, 0xcf, 0xbb, 0xc3, 0x0d, 0xa8, 0x5a, 0xdc,
|
||||
0x97, 0x5c, 0x39, 0x08, 0x19, 0xf9, 0x29, 0x82, 0x85, 0xbc, 0xcb, 0xd1, 0xbe, 0x1b, 0xc5, 0x72,
|
||||
0xce, 0xc0, 0x2e, 0xd4, 0x92, 0x9d, 0x91, 0x86, 0x78, 0xff, 0xdf, 0x7b, 0x86, 0xde, 0x99, 0x37,
|
||||
0x24, 0xdd, 0x13, 0xfa, 0xc9, 0x5b, 0xb0, 0x30, 0xb4, 0xd1, 0x08, 0x24, 0x4d, 0xa8, 0xcb, 0x4b,
|
||||
0x20, 0xc9, 0x81, 0xbc, 0x4c, 0xa5, 0x94, 0xfc, 0xa3, 0x94, 0xef, 0xbf, 0xbe, 0xb3, 0xef, 0xb7,
|
||||
0x0b, 0x46, 0xc6, 0x49, 0xb2, 0xa7, 0x41, 0x2d, 0xf0, 0x9d, 0x2c, 0x71, 0x2d, 0xf9, 0x93, 0xbd,
|
||||
0x6d, 0xfb, 0x5e, 0x6c, 0x31, 0x02, 0x90, 0xcb, 0x57, 0x26, 0x66, 0xb9, 0x8f, 0x5c, 0xcf, 0xa6,
|
||||
0x47, 0xd4, 0xf6, 0x3d, 0x27, 0xe2, 0x89, 0x2b, 0xcb, 0xdc, 0xab, 0x2b, 0xf8, 0x3d, 0x98, 0xe5,
|
||||
0xbf, 0x8f, 0xdd, 0x2e, 0xd5, 0xaa, 0xfc, 0x3e, 0x5f, 0x33, 0x12, 0xa6, 0x61, 0xa8, 0x4c, 0x23,
|
||||
0x8b, 0x30, 0x63, 0x1a, 0x46, 0x7f, 0xc3, 0x60, 0x6f, 0xb4, 0xb2, 0x97, 0x19, 0xae, 0xd8, 0x72,
|
||||
0x3b, 0xfb, 0xae, 0xc7, 0xef, 0xec, 0xcc, 0x60, 0x26, 0x66, 0x35, 0x71, 0xe2, 0x77, 0x3a, 0xfe,
|
||||
0x0f, 0x79, 0x0b, 0x48, 0xaf, 0x83, 0x44, 0x46, 0x7e, 0x04, 0xf5, 0x7d, 0xbf, 0x7d, 0xdf, 0x8b,
|
||||
0xc3, 0x01, 0xab, 0x49, 0xe6, 0x0e, 0xf5, 0xf2, 0x41, 0x97, 0x42, 0x7c, 0x00, 0xb3, 0xb1, 0xdb,
|
||||
0xa5, 0x47, 0xb1, 0xd5, 0x0d, 0xc4, 0xed, 0x7a, 0x05, 0xdc, 0x29, 0x32, 0xa9, 0x82, 0x98, 0xf0,
|
||||
0x7a, 0x3a, 0x21, 0x1c, 0xd3, 0xb0, 0xeb, 0x7a, 0x56, 0x61, 0xcf, 0x21, 0x0d, 0xd0, 0x87, 0xbd,
|
||||
0x20, 0xc6, 0xe4, 0xb7, 0xe1, 0x05, 0x59, 0x48, 0xa2, 0x10, 0x0c, 0x78, 0x51, 0xa9, 0xcd, 0x83,
|
||||
0x54, 0x9d, 0xe8, 0x04, 0x17, 0x17, 0xc9, 0x00, 0xb4, 0xf7, 0x2d, 0xcf, 0x6a, 0x53, 0x27, 0x55,
|
||||
0x94, 0x96, 0xe4, 0x77, 0x61, 0xc6, 0x8d, 0x69, 0x57, 0x1e, 0x8d, 0xdd, 0x29, 0x1c, 0x8d, 0x1d,
|
||||
0xf7, 0xe4, 0xa4, 0x95, 0x68, 0xdd, 0x7c, 0xf2, 0x3a, 0x60, 0x75, 0xdc, 0xa0, 0x61, 0xdf, 0xb5,
|
||||
0x29, 0xfe, 0x05, 0x82, 0x0a, 0x3b, 0xa3, 0xf8, 0x7a, 0x4e, 0xd5, 0x45, 0x3a, 0xa7, 0x4f, 0x69,
|
||||
0xca, 0x61, 0xa6, 0x48, 0xe3, 0xd3, 0x7f, 0x3d, 0xf9, 0x55, 0xe9, 0x1a, 0x7e, 0x95, 0x53, 0xe3,
|
||||
0xfe, 0x86, 0xca, 0x54, 0x23, 0xfc, 0x33, 0x04, 0x58, 0x74, 0x0d, 0x85, 0xab, 0xe1, 0x37, 0x46,
|
||||
0xe1, 0x1b, 0xc2, 0xe9, 0xf4, 0xeb, 0x4a, 0xd5, 0x18, 0x8c, 0x7b, 0xb3, 0x1a, 0xe1, 0x1b, 0x38,
|
||||
0x80, 0x35, 0x0e, 0x60, 0x19, 0x93, 0x61, 0x00, 0xcc, 0x8f, 0x58, 0x29, 0x7c, 0x6c, 0xd2, 0xc4,
|
||||
0xee, 0x1f, 0x11, 0xcc, 0x7c, 0x9b, 0xdf, 0x76, 0x63, 0x22, 0x74, 0x38, 0x9d, 0x08, 0x71, 0x5b,
|
||||
0x1c, 0x2a, 0xb9, 0xc1, 0x61, 0x5e, 0xc7, 0x0b, 0x12, 0x66, 0x14, 0x87, 0xd4, 0xea, 0xe6, 0xd0,
|
||||
0xde, 0x45, 0xf8, 0x21, 0x82, 0x6a, 0x42, 0xd9, 0xf0, 0xcd, 0x51, 0x10, 0x73, 0x94, 0x4e, 0x9f,
|
||||
0x12, 0x31, 0x22, 0xb7, 0x39, 0xc0, 0x1b, 0x64, 0x68, 0x22, 0xb7, 0x72, 0xac, 0xee, 0x97, 0x08,
|
||||
0xca, 0xbb, 0x74, 0x6c, 0x99, 0x4d, 0x0b, 0xd9, 0xa5, 0xd0, 0x0d, 0xc9, 0x30, 0xfe, 0x14, 0xc1,
|
||||
0xfc, 0x2e, 0x8d, 0x25, 0xb1, 0x8e, 0x46, 0x87, 0x2f, 0xc7, 0xbd, 0xf5, 0x86, 0xa1, 0x7c, 0x02,
|
||||
0x91, 0x4b, 0x69, 0x97, 0x58, 0xe7, 0xa6, 0x6f, 0xe1, 0x9b, 0x45, 0xc5, 0x95, 0x32, 0x10, 0xfc,
|
||||
0x77, 0x04, 0xd5, 0x84, 0x76, 0x8c, 0x36, 0x9f, 0xe3, 0xba, 0x53, 0x8b, 0xd1, 0x7d, 0x0e, 0xf4,
|
||||
0x2d, 0xfd, 0xee, 0x70, 0xa0, 0xea, 0xfb, 0xac, 0xcd, 0x3a, 0x56, 0x6c, 0x19, 0x1c, 0x7d, 0x3e,
|
||||
0xb3, 0x7f, 0x41, 0x00, 0x19, 0x6f, 0xc2, 0xb7, 0x8b, 0x9d, 0x50, 0xb8, 0x95, 0x3e, 0x45, 0xe6,
|
||||
0x44, 0x0c, 0xee, 0xcc, 0xaa, 0xde, 0x2c, 0x8a, 0x3a, 0xe3, 0x55, 0x5b, 0x9c, 0x5d, 0xe1, 0xdf,
|
||||
0x23, 0x98, 0xe1, 0xf3, 0x39, 0x5e, 0x1e, 0x05, 0x58, 0x1d, 0xdf, 0xa7, 0x16, 0xf4, 0x15, 0x8e,
|
||||
0xb3, 0xb9, 0x59, 0x54, 0x98, 0x5b, 0x68, 0x0d, 0xf7, 0xa1, 0x9a, 0x8c, 0xc8, 0xa3, 0xab, 0x22,
|
||||
0x37, 0x42, 0xeb, 0xcd, 0x82, 0xfe, 0x98, 0x14, 0xa6, 0x38, 0x13, 0x6b, 0x85, 0x67, 0xe2, 0x4f,
|
||||
0x08, 0x2a, 0x8c, 0x59, 0xe3, 0x1b, 0xa3, 0xf4, 0x29, 0xdf, 0x29, 0xa6, 0x16, 0x95, 0x37, 0x38,
|
||||
0xb4, 0x9b, 0xa4, 0x38, 0x7b, 0x03, 0xcf, 0x66, 0xa1, 0x79, 0x80, 0xe0, 0xa5, 0x8b, 0xb7, 0x28,
|
||||
0x5e, 0xc8, 0x19, 0xc9, 0x5f, 0xd3, 0x7a, 0x3e, 0x84, 0xa3, 0x6e, 0x60, 0xf2, 0x36, 0x47, 0xb1,
|
||||
0x85, 0xdf, 0x1c, 0x7b, 0x20, 0x0e, 0xe4, 0x21, 0x66, 0x8a, 0xd6, 0xb3, 0x8f, 0x0d, 0x7f, 0x45,
|
||||
0x30, 0x2f, 0xf5, 0x1e, 0x87, 0x94, 0x16, 0xc3, 0x9a, 0x52, 0xfd, 0x33, 0x43, 0xe4, 0xab, 0x1c,
|
||||
0xfb, 0x97, 0xf1, 0xbd, 0x09, 0xb1, 0x4b, 0xcc, 0xeb, 0x31, 0x83, 0xf9, 0x67, 0x04, 0x75, 0xf9,
|
||||
0x55, 0x00, 0xdf, 0x1a, 0x59, 0x49, 0xf9, 0xef, 0x06, 0x53, 0xcb, 0xbe, 0xc9, 0xb1, 0xdf, 0x26,
|
||||
0xcb, 0x45, 0xd9, 0x0f, 0x85, 0x71, 0x56, 0x01, 0xbf, 0x46, 0x80, 0xd3, 0xf1, 0x2c, 0x1d, 0xd8,
|
||||
0xf0, 0x4a, 0xce, 0xd4, 0xc8, 0xc9, 0x4f, 0xbf, 0x35, 0x76, 0x5f, 0xbe, 0x95, 0xaf, 0x15, 0xb6,
|
||||
0x72, 0x3f, 0xb5, 0xff, 0x73, 0x04, 0x73, 0xbb, 0x34, 0x1d, 0x5c, 0x0a, 0x02, 0x99, 0xff, 0xee,
|
||||
0xa1, 0xaf, 0x8e, 0xdf, 0x28, 0x10, 0xdd, 0xe1, 0x88, 0x56, 0x70, 0x71, 0xa8, 0x24, 0x80, 0xdf,
|
||||
0x21, 0xf8, 0xbc, 0xe8, 0x62, 0x42, 0x72, 0x67, 0x9c, 0xa5, 0x5c, 0xd3, 0x9b, 0x1c, 0xd7, 0x17,
|
||||
0x39, 0xae, 0x75, 0x32, 0x11, 0xae, 0x2d, 0xf1, 0xf9, 0xe0, 0x0f, 0x08, 0x5e, 0x51, 0x27, 0x3d,
|
||||
0x41, 0x19, 0x9f, 0x36, 0x6e, 0x05, 0xcc, 0x93, 0xdc, 0xe3, 0xf8, 0x0c, 0x7c, 0x67, 0x12, 0x7c,
|
||||
0xa6, 0x20, 0x91, 0xf8, 0xb7, 0x08, 0x5e, 0xe6, 0xa4, 0x5d, 0x55, 0x7c, 0xa1, 0x21, 0x8f, 0xa2,
|
||||
0xf8, 0x13, 0x34, 0x64, 0x71, 0x66, 0xc9, 0x95, 0x40, 0x6d, 0x09, 0xb2, 0xcd, 0x26, 0xf7, 0x17,
|
||||
0xe4, 0x15, 0x20, 0xb2, 0xbb, 0x3e, 0x2e, 0x70, 0x57, 0xbd, 0x32, 0x44, 0xb9, 0xad, 0x4d, 0x56,
|
||||
0x6e, 0x9f, 0x20, 0xa8, 0x09, 0x9e, 0x5c, 0x70, 0xab, 0x2a, 0x44, 0x5a, 0x7f, 0x2d, 0xb7, 0x4b,
|
||||
0xf2, 0x44, 0xf2, 0x15, 0x6e, 0x76, 0x03, 0x9b, 0x45, 0x66, 0x03, 0xdf, 0x89, 0xcc, 0x8f, 0x04,
|
||||
0x81, 0xfe, 0xd8, 0xec, 0xf8, 0xed, 0xe8, 0x2e, 0xda, 0x7e, 0xf7, 0xd1, 0xf9, 0x22, 0xfa, 0xe7,
|
||||
0xf9, 0x22, 0xfa, 0xcf, 0xf9, 0x22, 0xfa, 0xce, 0x97, 0x26, 0xf8, 0xa3, 0xcc, 0xee, 0xb8, 0xd4,
|
||||
0x8b, 0x55, 0x13, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x68, 0x78, 0xac, 0x21, 0x1c, 0x00,
|
||||
0x00,
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ func (m *ClusterQuery) Reset() { *m = ClusterQuery{} }
|
||||
func (m *ClusterQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*ClusterQuery) ProtoMessage() {}
|
||||
func (*ClusterQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_cluster_63d48da351ddefcc, []int{0}
|
||||
return fileDescriptor_cluster_66eaae81439ad97b, []int{0}
|
||||
}
|
||||
func (m *ClusterQuery) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -91,7 +91,7 @@ func (m *ClusterResponse) Reset() { *m = ClusterResponse{} }
|
||||
func (m *ClusterResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*ClusterResponse) ProtoMessage() {}
|
||||
func (*ClusterResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_cluster_63d48da351ddefcc, []int{1}
|
||||
return fileDescriptor_cluster_66eaae81439ad97b, []int{1}
|
||||
}
|
||||
func (m *ClusterResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -132,7 +132,7 @@ func (m *ClusterCreateRequest) Reset() { *m = ClusterCreateRequest{} }
|
||||
func (m *ClusterCreateRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ClusterCreateRequest) ProtoMessage() {}
|
||||
func (*ClusterCreateRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_cluster_63d48da351ddefcc, []int{2}
|
||||
return fileDescriptor_cluster_66eaae81439ad97b, []int{2}
|
||||
}
|
||||
func (m *ClusterCreateRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -186,7 +186,7 @@ func (m *ClusterUpdateRequest) Reset() { *m = ClusterUpdateRequest{} }
|
||||
func (m *ClusterUpdateRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*ClusterUpdateRequest) ProtoMessage() {}
|
||||
func (*ClusterUpdateRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_cluster_63d48da351ddefcc, []int{3}
|
||||
return fileDescriptor_cluster_66eaae81439ad97b, []int{3}
|
||||
}
|
||||
func (m *ClusterUpdateRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@@ -250,6 +250,8 @@ type ClusterServiceClient interface {
|
||||
Update(ctx context.Context, in *ClusterUpdateRequest, opts ...grpc.CallOption) (*v1alpha1.Cluster, error)
|
||||
// Delete deletes a cluster
|
||||
Delete(ctx context.Context, in *ClusterQuery, opts ...grpc.CallOption) (*ClusterResponse, error)
|
||||
// RotateAuth returns a cluster by server address
|
||||
RotateAuth(ctx context.Context, in *ClusterQuery, opts ...grpc.CallOption) (*ClusterResponse, error)
|
||||
}
|
||||
|
||||
type clusterServiceClient struct {
|
||||
@@ -305,6 +307,15 @@ func (c *clusterServiceClient) Delete(ctx context.Context, in *ClusterQuery, opt
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *clusterServiceClient) RotateAuth(ctx context.Context, in *ClusterQuery, opts ...grpc.CallOption) (*ClusterResponse, error) {
|
||||
out := new(ClusterResponse)
|
||||
err := c.cc.Invoke(ctx, "/cluster.ClusterService/RotateAuth", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Server API for ClusterService service
|
||||
|
||||
type ClusterServiceServer interface {
|
||||
@@ -318,6 +329,8 @@ type ClusterServiceServer interface {
|
||||
Update(context.Context, *ClusterUpdateRequest) (*v1alpha1.Cluster, error)
|
||||
// Delete deletes a cluster
|
||||
Delete(context.Context, *ClusterQuery) (*ClusterResponse, error)
|
||||
// RotateAuth returns a cluster by server address
|
||||
RotateAuth(context.Context, *ClusterQuery) (*ClusterResponse, error)
|
||||
}
|
||||
|
||||
func RegisterClusterServiceServer(s *grpc.Server, srv ClusterServiceServer) {
|
||||
@@ -414,6 +427,24 @@ func _ClusterService_Delete_Handler(srv interface{}, ctx context.Context, dec fu
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _ClusterService_RotateAuth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(ClusterQuery)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(ClusterServiceServer).RotateAuth(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/cluster.ClusterService/RotateAuth",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(ClusterServiceServer).RotateAuth(ctx, req.(*ClusterQuery))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
var _ClusterService_serviceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "cluster.ClusterService",
|
||||
HandlerType: (*ClusterServiceServer)(nil),
|
||||
@@ -438,6 +469,10 @@ var _ClusterService_serviceDesc = grpc.ServiceDesc{
|
||||
MethodName: "Delete",
|
||||
Handler: _ClusterService_Delete_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "RotateAuth",
|
||||
Handler: _ClusterService_RotateAuth_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{},
|
||||
Metadata: "server/cluster/cluster.proto",
|
||||
@@ -1061,39 +1096,41 @@ var (
|
||||
)
|
||||
|
||||
func init() {
|
||||
proto.RegisterFile("server/cluster/cluster.proto", fileDescriptor_cluster_63d48da351ddefcc)
|
||||
proto.RegisterFile("server/cluster/cluster.proto", fileDescriptor_cluster_66eaae81439ad97b)
|
||||
}
|
||||
|
||||
var fileDescriptor_cluster_63d48da351ddefcc = []byte{
|
||||
// 475 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0x4f, 0x8b, 0x13, 0x31,
|
||||
0x18, 0xc6, 0xc9, 0xaa, 0xa3, 0x46, 0xf1, 0x4f, 0x58, 0xa5, 0x8e, 0x6b, 0xd9, 0x9d, 0x83, 0x2c,
|
||||
0xa2, 0x09, 0xad, 0x17, 0xf1, 0x22, 0xec, 0x8a, 0x22, 0x78, 0xb1, 0xe2, 0x45, 0x16, 0x24, 0x3b,
|
||||
0x7d, 0xc9, 0xc6, 0x8e, 0x93, 0x98, 0x64, 0x06, 0x44, 0x44, 0xd0, 0xab, 0x78, 0xf1, 0x03, 0x78,
|
||||
0xf5, 0xa3, 0x78, 0x14, 0xfc, 0x02, 0x52, 0xfc, 0x20, 0x32, 0x99, 0xa4, 0xdd, 0xed, 0x50, 0x10,
|
||||
0x2c, 0x9e, 0x9a, 0xbc, 0x49, 0x9f, 0xf7, 0x97, 0x27, 0xcf, 0x04, 0x6f, 0x58, 0x30, 0x35, 0x18,
|
||||
0x96, 0x17, 0x95, 0x75, 0xf3, 0x5f, 0xaa, 0x8d, 0x72, 0x8a, 0x9c, 0x0c, 0xd3, 0x74, 0x5d, 0x28,
|
||||
0xa1, 0x7c, 0x8d, 0x35, 0xa3, 0x76, 0x39, 0xdd, 0x10, 0x4a, 0x89, 0x02, 0x18, 0xd7, 0x92, 0xf1,
|
||||
0xb2, 0x54, 0x8e, 0x3b, 0xa9, 0x4a, 0x1b, 0x56, 0xb3, 0xc9, 0x1d, 0x4b, 0xa5, 0xf2, 0xab, 0xb9,
|
||||
0x32, 0xc0, 0xea, 0x01, 0x13, 0x50, 0x82, 0xe1, 0x0e, 0xc6, 0x61, 0xcf, 0x23, 0x21, 0xdd, 0x41,
|
||||
0xb5, 0x4f, 0x73, 0xf5, 0x8a, 0x71, 0xe3, 0x5b, 0xbc, 0xf4, 0x83, 0x5b, 0xf9, 0x98, 0xe9, 0x89,
|
||||
0x68, 0xfe, 0x6c, 0x19, 0xd7, 0xba, 0x90, 0xb9, 0x17, 0x67, 0xf5, 0x80, 0x17, 0xfa, 0x80, 0x77,
|
||||
0xa4, 0xb2, 0xeb, 0xf8, 0xec, 0x6e, 0x4b, 0xfb, 0xa4, 0x02, 0xf3, 0x86, 0x5c, 0xc6, 0x49, 0x7b,
|
||||
0xb6, 0x1e, 0xda, 0x44, 0xdb, 0xa7, 0x47, 0x61, 0x96, 0x5d, 0xc4, 0xe7, 0xc3, 0xbe, 0x11, 0x58,
|
||||
0xad, 0x4a, 0x0b, 0xd9, 0x27, 0x84, 0xd7, 0x43, 0x6d, 0xd7, 0x00, 0x77, 0x30, 0x82, 0xd7, 0x15,
|
||||
0x58, 0x47, 0xf6, 0x70, 0x74, 0xc0, 0x8b, 0x9c, 0x19, 0xee, 0xd0, 0x39, 0x30, 0x8d, 0xc0, 0x7e,
|
||||
0xf0, 0x22, 0x1f, 0x53, 0x3d, 0x11, 0xb4, 0x01, 0xa6, 0x87, 0x80, 0x69, 0x04, 0xa6, 0xb1, 0x6b,
|
||||
0x94, 0x6c, 0x08, 0x2b, 0x6d, 0xc1, 0xb8, 0xde, 0xda, 0x26, 0xda, 0x3e, 0x35, 0x0a, 0xb3, 0xcc,
|
||||
0xcd, 0x68, 0x9e, 0xe9, 0xf1, 0xff, 0xa2, 0x19, 0x7e, 0x3b, 0x81, 0xcf, 0x85, 0xe2, 0x53, 0x30,
|
||||
0xb5, 0xcc, 0x81, 0xbc, 0xc7, 0xc7, 0x1f, 0x4b, 0xeb, 0xc8, 0x25, 0x1a, 0x63, 0x71, 0xd8, 0xe1,
|
||||
0xf4, 0xc1, 0xbf, 0xb7, 0x6f, 0xe4, 0xb3, 0xde, 0x87, 0x9f, 0xbf, 0xbf, 0xac, 0x11, 0x72, 0xc1,
|
||||
0x47, 0xa5, 0x1e, 0xc4, 0x10, 0x5a, 0xf2, 0x19, 0xe1, 0xa4, 0xbd, 0x11, 0x72, 0x6d, 0x91, 0xe1,
|
||||
0xc8, 0x4d, 0xa5, 0x2b, 0xb0, 0x22, 0xdb, 0xf2, 0x1c, 0x57, 0xb3, 0x0e, 0xc7, 0xdd, 0xd9, 0x95,
|
||||
0x7d, 0x44, 0xf8, 0xd8, 0x43, 0x58, 0xea, 0xc8, 0x0a, 0x29, 0xc8, 0x95, 0x45, 0x0a, 0xf6, 0xb6,
|
||||
0x4d, 0xf0, 0x3b, 0xf2, 0x15, 0xe1, 0xa4, 0x8d, 0x46, 0xd7, 0x96, 0x23, 0x91, 0x59, 0x09, 0xd0,
|
||||
0xd0, 0x03, 0xdd, 0x4c, 0xb7, 0xba, 0x40, 0xb1, 0x77, 0x00, 0x9b, 0xfb, 0xb4, 0x87, 0x93, 0xfb,
|
||||
0x50, 0x80, 0x83, 0x65, 0x4e, 0xf5, 0x16, 0xcb, 0xb3, 0x8f, 0x31, 0x9c, 0xff, 0xc6, 0xf2, 0xf3,
|
||||
0xef, 0xdc, 0xfb, 0x3e, 0xed, 0xa3, 0x1f, 0xd3, 0x3e, 0xfa, 0x35, 0xed, 0xa3, 0xe7, 0x83, 0xbf,
|
||||
0x78, 0x43, 0xf2, 0x42, 0x42, 0xe9, 0xa2, 0xd4, 0x7e, 0xe2, 0x9f, 0x8c, 0xdb, 0x7f, 0x02, 0x00,
|
||||
0x00, 0xff, 0xff, 0x9f, 0x92, 0x8b, 0xe2, 0xfe, 0x04, 0x00, 0x00,
|
||||
var fileDescriptor_cluster_66eaae81439ad97b = []byte{
|
||||
// 502 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0x4f, 0x8b, 0x13, 0x3f,
|
||||
0x18, 0xc7, 0xc9, 0xfe, 0x7e, 0x8c, 0x1a, 0xc5, 0x3f, 0x61, 0x95, 0x3a, 0xae, 0x65, 0x37, 0xa0,
|
||||
0x2e, 0x62, 0x13, 0x5a, 0x2f, 0xe2, 0x45, 0xdc, 0x15, 0x45, 0xf0, 0xe2, 0x88, 0x17, 0x59, 0x90,
|
||||
0xec, 0xf4, 0x61, 0x3a, 0x76, 0x9c, 0xc4, 0x24, 0x33, 0x20, 0x22, 0x82, 0x5e, 0xc5, 0x8b, 0xe0,
|
||||
0xd5, 0xb7, 0xe3, 0x51, 0xf0, 0x0d, 0x48, 0xf1, 0x85, 0xc8, 0x64, 0x92, 0x76, 0xb7, 0xa5, 0xa2,
|
||||
0x58, 0x3c, 0x35, 0x79, 0x92, 0x7e, 0xbf, 0x9f, 0x7c, 0xf3, 0x4c, 0xf0, 0x86, 0x01, 0x5d, 0x83,
|
||||
0xe6, 0x69, 0x51, 0x19, 0x3b, 0xfb, 0x65, 0x4a, 0x4b, 0x2b, 0xc9, 0x11, 0x3f, 0x8d, 0xd7, 0x33,
|
||||
0x99, 0x49, 0x57, 0xe3, 0xcd, 0xa8, 0x5d, 0x8e, 0x37, 0x32, 0x29, 0xb3, 0x02, 0xb8, 0x50, 0x39,
|
||||
0x17, 0x65, 0x29, 0xad, 0xb0, 0xb9, 0x2c, 0x8d, 0x5f, 0xa5, 0xe3, 0x1b, 0x86, 0xe5, 0xd2, 0xad,
|
||||
0xa6, 0x52, 0x03, 0xaf, 0xfb, 0x3c, 0x83, 0x12, 0xb4, 0xb0, 0x30, 0xf4, 0x7b, 0xee, 0x67, 0xb9,
|
||||
0x1d, 0x55, 0xfb, 0x2c, 0x95, 0xcf, 0xb9, 0xd0, 0xce, 0xe2, 0x99, 0x1b, 0xf4, 0xd2, 0x21, 0x57,
|
||||
0xe3, 0xac, 0xf9, 0xb3, 0xe1, 0x42, 0xa9, 0x22, 0x4f, 0x9d, 0x38, 0xaf, 0xfb, 0xa2, 0x50, 0x23,
|
||||
0xb1, 0x20, 0x45, 0x2f, 0xe3, 0x13, 0xbb, 0x2d, 0xed, 0xc3, 0x0a, 0xf4, 0x4b, 0x72, 0x0e, 0x47,
|
||||
0xed, 0xd9, 0x3a, 0x68, 0x13, 0x6d, 0x1f, 0x4b, 0xfc, 0x8c, 0x9e, 0xc1, 0xa7, 0xfc, 0xbe, 0x04,
|
||||
0x8c, 0x92, 0xa5, 0x01, 0xfa, 0x1e, 0xe1, 0x75, 0x5f, 0xdb, 0xd5, 0x20, 0x2c, 0x24, 0xf0, 0xa2,
|
||||
0x02, 0x63, 0xc9, 0x1e, 0x0e, 0x09, 0x38, 0x91, 0xe3, 0x83, 0x1d, 0x36, 0x03, 0x66, 0x01, 0xd8,
|
||||
0x0d, 0x9e, 0xa6, 0x43, 0xa6, 0xc6, 0x19, 0x6b, 0x80, 0xd9, 0x01, 0x60, 0x16, 0x80, 0x59, 0x70,
|
||||
0x0d, 0x92, 0x0d, 0x61, 0xa5, 0x0c, 0x68, 0xdb, 0x59, 0xdb, 0x44, 0xdb, 0x47, 0x13, 0x3f, 0xa3,
|
||||
0x76, 0x4a, 0xf3, 0x58, 0x0d, 0xff, 0x15, 0xcd, 0xe0, 0x53, 0x84, 0x4f, 0xfa, 0xe2, 0x23, 0xd0,
|
||||
0x75, 0x9e, 0x02, 0x79, 0x83, 0xff, 0x7f, 0x90, 0x1b, 0x4b, 0xce, 0xb2, 0xd0, 0x16, 0x07, 0x13,
|
||||
0x8e, 0xef, 0xfe, 0xbd, 0x7d, 0x23, 0x4f, 0x3b, 0x6f, 0xbf, 0xfd, 0xf8, 0xb8, 0x46, 0xc8, 0x69,
|
||||
0xd7, 0x2a, 0x75, 0x3f, 0x34, 0xa1, 0x21, 0x1f, 0x10, 0x8e, 0xda, 0x1b, 0x21, 0x17, 0xe7, 0x19,
|
||||
0x0e, 0xdd, 0x54, 0xbc, 0x82, 0x28, 0xe8, 0x96, 0xe3, 0xb8, 0x40, 0x17, 0x38, 0x6e, 0x4e, 0xaf,
|
||||
0xec, 0x1d, 0xc2, 0xff, 0xdd, 0x83, 0xa5, 0x89, 0xac, 0x90, 0x82, 0x9c, 0x9f, 0xa7, 0xe0, 0xaf,
|
||||
0xda, 0x0e, 0x7e, 0x4d, 0x3e, 0x23, 0x1c, 0xb5, 0xad, 0xb1, 0x18, 0xcb, 0xa1, 0x96, 0x59, 0x09,
|
||||
0xd0, 0xc0, 0x01, 0x5d, 0x8b, 0xb7, 0x16, 0x81, 0x82, 0xb7, 0x07, 0x9b, 0xe5, 0xb4, 0x87, 0xa3,
|
||||
0x3b, 0x50, 0x80, 0x85, 0x65, 0x49, 0x75, 0xe6, 0xcb, 0xd3, 0x8f, 0xd1, 0x9f, 0xff, 0xea, 0x2f,
|
||||
0xce, 0x5f, 0x60, 0x9c, 0x34, 0x8f, 0x0d, 0xdc, 0xae, 0xec, 0xe8, 0xcf, 0x1d, 0x7a, 0xce, 0xe1,
|
||||
0x0a, 0xbd, 0xb4, 0xd4, 0x81, 0x6b, 0x27, 0xdf, 0x13, 0x95, 0x1d, 0xed, 0xdc, 0xfa, 0x32, 0xe9,
|
||||
0xa2, 0xaf, 0x93, 0x2e, 0xfa, 0x3e, 0xe9, 0xa2, 0x27, 0xfd, 0xdf, 0x78, 0xb1, 0xd2, 0x22, 0x87,
|
||||
0xd2, 0x06, 0xd9, 0xfd, 0xc8, 0x3d, 0x50, 0xd7, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x4e, 0xde,
|
||||
0x52, 0x19, 0x6c, 0x05, 0x00, 0x00,
|
||||
}
|
||||
|
||||
@@ -151,6 +151,33 @@ func request_ClusterService_Delete_0(ctx context.Context, marshaler runtime.Mars
|
||||
|
||||
}
|
||||
|
||||
func request_ClusterService_RotateAuth_0(ctx context.Context, marshaler runtime.Marshaler, client ClusterServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq ClusterQuery
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
var (
|
||||
val string
|
||||
ok bool
|
||||
err error
|
||||
_ = err
|
||||
)
|
||||
|
||||
val, ok = pathParams["server"]
|
||||
if !ok {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "server")
|
||||
}
|
||||
|
||||
protoReq.Server, err = runtime.String(val)
|
||||
|
||||
if err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "server", err)
|
||||
}
|
||||
|
||||
msg, err := client.RotateAuth(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
// RegisterClusterServiceHandlerFromEndpoint is same as RegisterClusterServiceHandler but
|
||||
// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
|
||||
func RegisterClusterServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
|
||||
@@ -334,6 +361,35 @@ func RegisterClusterServiceHandlerClient(ctx context.Context, mux *runtime.Serve
|
||||
|
||||
})
|
||||
|
||||
mux.Handle("POST", pattern_ClusterService_RotateAuth_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
if cn, ok := w.(http.CloseNotifier); ok {
|
||||
go func(done <-chan struct{}, closed <-chan bool) {
|
||||
select {
|
||||
case <-done:
|
||||
case <-closed:
|
||||
cancel()
|
||||
}
|
||||
}(ctx.Done(), cn.CloseNotify())
|
||||
}
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := request_ClusterService_RotateAuth_0(rctx, inboundMarshaler, client, req, pathParams)
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_ClusterService_RotateAuth_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -347,6 +403,8 @@ var (
|
||||
pattern_ClusterService_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "clusters", "cluster.server"}, ""))
|
||||
|
||||
pattern_ClusterService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "clusters", "server"}, ""))
|
||||
|
||||
pattern_ClusterService_RotateAuth_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "clusters", "server", "rotate-auth"}, ""))
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -359,4 +417,6 @@ var (
|
||||
forward_ClusterService_Update_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_ClusterService_Delete_0 = runtime.ForwardResponseMessage
|
||||
|
||||
forward_ClusterService_RotateAuth_0 = runtime.ForwardResponseMessage
|
||||
)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -682,6 +682,9 @@ message SyncOperation {
|
||||
// Source overrides the source definition set in the application.
|
||||
// This is typically set in a Rollback operation and nil during a Sync operation
|
||||
optional ApplicationSource source = 7;
|
||||
|
||||
// Manifests is an optional field that overrides sync source with a local directory for development
|
||||
repeated string manifests = 8;
|
||||
}
|
||||
|
||||
// SyncOperationResource contains resources to sync.
|
||||
|
||||
@@ -106,6 +106,7 @@ func schema_pkg_apis_application_v1alpha1_AWSAuthConfig(ref common.ReferenceCall
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,7 +327,7 @@ func schema_pkg_apis_application_v1alpha1_Application(ref common.ReferenceCallba
|
||||
},
|
||||
},
|
||||
},
|
||||
Required: []string{"metadata", "spec", "status"},
|
||||
Required: []string{"metadata", "spec"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{
|
||||
@@ -359,6 +360,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationCondition(ref common.Refere
|
||||
Required: []string{"type", "message"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,6 +388,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationDestination(ref common.Refe
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -699,7 +702,6 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourceKustomize(ref common.
|
||||
Description: "CommonLabels adds additional kustomize commonLabels",
|
||||
Type: []string{"object"},
|
||||
AdditionalProperties: &spec.SchemaOrBool{
|
||||
Allows: true,
|
||||
Schema: &spec.Schema{
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Type: []string{"string"},
|
||||
@@ -733,6 +735,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSourcePlugin(ref common.Ref
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,6 +930,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSummary(ref common.Referenc
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1144,6 +1148,7 @@ func schema_pkg_apis_application_v1alpha1_Command(ref common.ReferenceCallback)
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1202,6 +1207,7 @@ func schema_pkg_apis_application_v1alpha1_ComponentParameter(ref common.Referenc
|
||||
Required: []string{"name", "value"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1291,6 +1297,7 @@ func schema_pkg_apis_application_v1alpha1_HealthStatus(ref common.ReferenceCallb
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1318,6 +1325,7 @@ func schema_pkg_apis_application_v1alpha1_HelmParameter(ref common.ReferenceCall
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1373,6 +1381,7 @@ func schema_pkg_apis_application_v1alpha1_HelmRepository(ref common.ReferenceCal
|
||||
Required: []string{"url", "name"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1398,6 +1407,7 @@ func schema_pkg_apis_application_v1alpha1_Info(ref common.ReferenceCallback) com
|
||||
Required: []string{"name", "value"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1425,6 +1435,7 @@ func schema_pkg_apis_application_v1alpha1_InfoItem(ref common.ReferenceCallback)
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1451,6 +1462,7 @@ func schema_pkg_apis_application_v1alpha1_JWTToken(ref common.ReferenceCallback)
|
||||
Required: []string{"iat"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1483,6 +1495,7 @@ func schema_pkg_apis_application_v1alpha1_JsonnetVar(ref common.ReferenceCallbac
|
||||
Required: []string{"name", "value"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1515,6 +1528,7 @@ func schema_pkg_apis_application_v1alpha1_KsonnetParameter(ref common.ReferenceC
|
||||
Required: []string{"name", "value"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1542,6 +1556,7 @@ func schema_pkg_apis_application_v1alpha1_KustomizeImageTag(ref common.Reference
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1828,6 +1843,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceActionDefinition(ref common.Re
|
||||
Required: []string{"name", "action.lua"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1864,6 +1880,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceActionParam(ref common.Referen
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1952,6 +1969,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceDiff(ref common.ReferenceCallb
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2003,6 +2021,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceIgnoreDifferences(ref common.R
|
||||
Required: []string{"group", "kind", "jsonPointers"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2017,7 +2036,6 @@ func schema_pkg_apis_application_v1alpha1_ResourceNetworkingInfo(ref common.Refe
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Type: []string{"object"},
|
||||
AdditionalProperties: &spec.SchemaOrBool{
|
||||
Allows: true,
|
||||
Schema: &spec.Schema{
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Type: []string{"string"},
|
||||
@@ -2043,7 +2061,6 @@ func schema_pkg_apis_application_v1alpha1_ResourceNetworkingInfo(ref common.Refe
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Type: []string{"object"},
|
||||
AdditionalProperties: &spec.SchemaOrBool{
|
||||
Allows: true,
|
||||
Schema: &spec.Schema{
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Type: []string{"string"},
|
||||
@@ -2219,6 +2236,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceOverride(ref common.ReferenceC
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2268,6 +2286,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceRef(ref common.ReferenceCallba
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2347,6 +2366,7 @@ func schema_pkg_apis_application_v1alpha1_ResourceResult(ref common.ReferenceCal
|
||||
Required: []string{"group", "version", "kind", "namespace", "name"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2442,7 +2462,7 @@ func schema_pkg_apis_application_v1alpha1_RevisionHistory(ref common.ReferenceCa
|
||||
},
|
||||
},
|
||||
},
|
||||
Required: []string{"revision", "deployedAt", "id", "source"},
|
||||
Required: []string{"revision", "deployedAt", "id"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{
|
||||
@@ -2503,6 +2523,20 @@ func schema_pkg_apis_application_v1alpha1_SyncOperation(ref common.ReferenceCall
|
||||
Ref: ref("github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1.ApplicationSource"),
|
||||
},
|
||||
},
|
||||
"manifests": {
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Description: "Manifests is an optional field that overrides sync source with a local directory for development",
|
||||
Type: []string{"array"},
|
||||
Items: &spec.SchemaOrArray{
|
||||
Schema: &spec.Schema{
|
||||
SchemaProps: spec.SchemaProps{
|
||||
Type: []string{"string"},
|
||||
Format: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -2540,6 +2574,7 @@ func schema_pkg_apis_application_v1alpha1_SyncOperationResource(ref common.Refer
|
||||
Required: []string{"kind", "name"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2577,7 +2612,7 @@ func schema_pkg_apis_application_v1alpha1_SyncOperationResult(ref common.Referen
|
||||
},
|
||||
},
|
||||
},
|
||||
Required: []string{"revision", "source"},
|
||||
Required: []string{"revision"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{
|
||||
@@ -2623,6 +2658,7 @@ func schema_pkg_apis_application_v1alpha1_SyncPolicyAutomated(ref common.Referen
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2651,7 +2687,7 @@ func schema_pkg_apis_application_v1alpha1_SyncStatus(ref common.ReferenceCallbac
|
||||
},
|
||||
},
|
||||
},
|
||||
Required: []string{"status", "comparedTo", "revision"},
|
||||
Required: []string{"status"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{
|
||||
@@ -2703,6 +2739,7 @@ func schema_pkg_apis_application_v1alpha1_SyncStrategyApply(ref common.Reference
|
||||
},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2773,6 +2810,7 @@ func schema_pkg_apis_application_v1alpha1_TLSClientConfig(ref common.ReferenceCa
|
||||
Required: []string{"insecure"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2793,5 +2831,6 @@ func schema_pkg_apis_application_v1alpha1_objectMeta(ref common.ReferenceCallbac
|
||||
Required: []string{"Name"},
|
||||
},
|
||||
},
|
||||
Dependencies: []string{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ type Application struct {
|
||||
metav1.TypeMeta `json:",inline"`
|
||||
metav1.ObjectMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"`
|
||||
Spec ApplicationSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
|
||||
Status ApplicationStatus `json:"status" protobuf:"bytes,3,opt,name=status"`
|
||||
Status ApplicationStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
|
||||
Operation *Operation `json:"operation,omitempty" protobuf:"bytes,4,opt,name=operation"`
|
||||
}
|
||||
|
||||
@@ -269,6 +269,8 @@ type SyncOperation struct {
|
||||
// Source overrides the source definition set in the application.
|
||||
// This is typically set in a Rollback operation and nil during a Sync operation
|
||||
Source *ApplicationSource `json:"source,omitempty" protobuf:"bytes,7,opt,name=source"`
|
||||
// Manifests is an optional field that overrides sync source with a local directory for development
|
||||
Manifests []string `json:"manifests,omitempty" protobuf:"bytes,8,opt,name=manifests"`
|
||||
}
|
||||
|
||||
func (o *SyncOperation) IsApplyStrategy() bool {
|
||||
@@ -394,7 +396,7 @@ type SyncOperationResult struct {
|
||||
// Revision holds the git commit SHA of the sync
|
||||
Revision string `json:"revision" protobuf:"bytes,2,opt,name=revision"`
|
||||
// Source records the application source information of the sync, used for comparing auto-sync
|
||||
Source ApplicationSource `json:"source" protobuf:"bytes,3,opt,name=source"`
|
||||
Source ApplicationSource `json:"source,omitempty" protobuf:"bytes,3,opt,name=source"`
|
||||
}
|
||||
|
||||
type ResultCode string
|
||||
@@ -476,7 +478,7 @@ type RevisionHistory struct {
|
||||
Revision string `json:"revision" protobuf:"bytes,2,opt,name=revision"`
|
||||
DeployedAt metav1.Time `json:"deployedAt" protobuf:"bytes,4,opt,name=deployedAt"`
|
||||
ID int64 `json:"id" protobuf:"bytes,5,opt,name=id"`
|
||||
Source ApplicationSource `json:"source" protobuf:"bytes,6,opt,name=source"`
|
||||
Source ApplicationSource `json:"source,omitempty" protobuf:"bytes,6,opt,name=source"`
|
||||
}
|
||||
|
||||
// ApplicationWatchEvent contains information about application change.
|
||||
@@ -556,8 +558,8 @@ type ComparedTo struct {
|
||||
// SyncStatus is a comparison result of application spec and deployed application.
|
||||
type SyncStatus struct {
|
||||
Status SyncStatusCode `json:"status" protobuf:"bytes,1,opt,name=status,casttype=SyncStatusCode"`
|
||||
ComparedTo ComparedTo `json:"comparedTo" protobuf:"bytes,2,opt,name=comparedTo"`
|
||||
Revision string `json:"revision" protobuf:"bytes,3,opt,name=revision"`
|
||||
ComparedTo ComparedTo `json:"comparedTo,omitempty" protobuf:"bytes,2,opt,name=comparedTo"`
|
||||
Revision string `json:"revision,omitempty" protobuf:"bytes,3,opt,name=revision"`
|
||||
}
|
||||
|
||||
type HealthStatus struct {
|
||||
|
||||
@@ -1327,6 +1327,11 @@ func (in *SyncOperation) DeepCopyInto(out *SyncOperation) {
|
||||
*out = new(ApplicationSource)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Manifests != nil {
|
||||
in, out := &in.Manifests, &out.Manifests
|
||||
*out = make([]string, len(*in))
|
||||
copy(*out, *in)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -12,8 +12,6 @@ import (
|
||||
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
|
||||
@@ -28,12 +26,6 @@ func (c *Clientset) ArgoprojV1alpha1() argoprojv1alpha1.ArgoprojV1alpha1Interfac
|
||||
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 {
|
||||
|
||||
@@ -59,8 +59,3 @@ var _ clientset.Interface = &Clientset{}
|
||||
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}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
v1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
scheme "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/scheme"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
@@ -59,11 +61,16 @@ func (c *applications) Get(name string, options v1.GetOptions) (result *v1alpha1
|
||||
|
||||
// List takes label and field selectors, and returns the list of Applications that match those selectors.
|
||||
func (c *applications) List(opts v1.ListOptions) (result *v1alpha1.ApplicationList, err error) {
|
||||
var timeout time.Duration
|
||||
if opts.TimeoutSeconds != nil {
|
||||
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
|
||||
}
|
||||
result = &v1alpha1.ApplicationList{}
|
||||
err = c.client.Get().
|
||||
Namespace(c.ns).
|
||||
Resource("applications").
|
||||
VersionedParams(&opts, scheme.ParameterCodec).
|
||||
Timeout(timeout).
|
||||
Do().
|
||||
Into(result)
|
||||
return
|
||||
@@ -71,11 +78,16 @@ func (c *applications) List(opts v1.ListOptions) (result *v1alpha1.ApplicationLi
|
||||
|
||||
// Watch returns a watch.Interface that watches the requested applications.
|
||||
func (c *applications) 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("applications").
|
||||
VersionedParams(&opts, scheme.ParameterCodec).
|
||||
Timeout(timeout).
|
||||
Watch()
|
||||
}
|
||||
|
||||
@@ -117,10 +129,15 @@ func (c *applications) Delete(name string, options *v1.DeleteOptions) error {
|
||||
|
||||
// DeleteCollection deletes a collection of objects.
|
||||
func (c *applications) 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("applications").
|
||||
VersionedParams(&listOptions, scheme.ParameterCodec).
|
||||
Timeout(timeout).
|
||||
Body(options).
|
||||
Do().
|
||||
Error()
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
v1alpha1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
scheme "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/scheme"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
@@ -59,11 +61,16 @@ func (c *appProjects) Get(name string, options v1.GetOptions) (result *v1alpha1.
|
||||
|
||||
// List takes label and field selectors, and returns the list of AppProjects that match those selectors.
|
||||
func (c *appProjects) List(opts v1.ListOptions) (result *v1alpha1.AppProjectList, err error) {
|
||||
var timeout time.Duration
|
||||
if opts.TimeoutSeconds != nil {
|
||||
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
|
||||
}
|
||||
result = &v1alpha1.AppProjectList{}
|
||||
err = c.client.Get().
|
||||
Namespace(c.ns).
|
||||
Resource("appprojects").
|
||||
VersionedParams(&opts, scheme.ParameterCodec).
|
||||
Timeout(timeout).
|
||||
Do().
|
||||
Into(result)
|
||||
return
|
||||
@@ -71,11 +78,16 @@ func (c *appProjects) List(opts v1.ListOptions) (result *v1alpha1.AppProjectList
|
||||
|
||||
// Watch returns a watch.Interface that watches the requested appProjects.
|
||||
func (c *appProjects) 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("appprojects").
|
||||
VersionedParams(&opts, scheme.ParameterCodec).
|
||||
Timeout(timeout).
|
||||
Watch()
|
||||
}
|
||||
|
||||
@@ -117,10 +129,15 @@ func (c *appProjects) Delete(name string, options *v1.DeleteOptions) error {
|
||||
|
||||
// DeleteCollection deletes a collection of objects.
|
||||
func (c *appProjects) 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("appprojects").
|
||||
VersionedParams(&listOptions, scheme.ParameterCodec).
|
||||
Timeout(timeout).
|
||||
Body(options).
|
||||
Do().
|
||||
Error()
|
||||
|
||||
@@ -103,7 +103,7 @@ func (c *FakeApplications) DeleteCollection(options *v1.DeleteOptions, listOptio
|
||||
// Patch applies the patch and returns the patched application.
|
||||
func (c *FakeApplications) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.Application, err error) {
|
||||
obj, err := c.Fake.
|
||||
Invokes(testing.NewPatchSubresourceAction(applicationsResource, c.ns, name, data, subresources...), &v1alpha1.Application{})
|
||||
Invokes(testing.NewPatchSubresourceAction(applicationsResource, c.ns, name, pt, data, subresources...), &v1alpha1.Application{})
|
||||
|
||||
if obj == nil {
|
||||
return nil, err
|
||||
|
||||
@@ -103,7 +103,7 @@ func (c *FakeAppProjects) DeleteCollection(options *v1.DeleteOptions, listOption
|
||||
// Patch applies the patch and returns the patched appProject.
|
||||
func (c *FakeAppProjects) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AppProject, err error) {
|
||||
obj, err := c.Fake.
|
||||
Invokes(testing.NewPatchSubresourceAction(appprojectsResource, c.ns, name, data, subresources...), &v1alpha1.AppProject{})
|
||||
Invokes(testing.NewPatchSubresourceAction(appprojectsResource, c.ns, name, pt, data, subresources...), &v1alpha1.AppProject{})
|
||||
|
||||
if obj == nil {
|
||||
return nil, err
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
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
|
||||
@@ -19,4 +20,5 @@ type SharedInformerFactory interface {
|
||||
InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
|
||||
}
|
||||
|
||||
// TweakListOptionsFunc is a function that transforms a v1.ListOptions.
|
||||
type TweakListOptionsFunc func(*v1.ListOptions)
|
||||
|
||||
47
reposerver/metrics/gitwrapper.go
Normal file
47
reposerver/metrics/gitwrapper.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package metrics
|
||||
|
||||
import "github.com/argoproj/argo-cd/util/git"
|
||||
|
||||
type gitClientWrapper struct {
|
||||
repo string
|
||||
client git.Client
|
||||
metricsServer *MetricsServer
|
||||
}
|
||||
|
||||
func wrapGitClient(repo string, metricsServer *MetricsServer, client git.Client) git.Client {
|
||||
return &gitClientWrapper{repo: repo, client: client, metricsServer: metricsServer}
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) Fetch() error {
|
||||
w.metricsServer.IncGitRequest(w.repo, GitRequestTypeFetch)
|
||||
return w.client.Fetch()
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) LsRemote(revision string) (string, error) {
|
||||
sha, err := w.client.LsRemote(revision)
|
||||
if sha != revision {
|
||||
// This is true only if specified revision is a tag, branch or HEAD and client had to use 'ls-remote'
|
||||
w.metricsServer.IncGitRequest(w.repo, GitRequestTypeLsRemote)
|
||||
}
|
||||
return sha, err
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) LsFiles(path string) ([]string, error) {
|
||||
return w.client.LsFiles(path)
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) Checkout(revision string) error {
|
||||
return w.client.Checkout(revision)
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) CommitSHA() (string, error) {
|
||||
return w.client.CommitSHA()
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) Root() string {
|
||||
return w.client.Root()
|
||||
}
|
||||
|
||||
func (w *gitClientWrapper) Init() error {
|
||||
return w.client.Init()
|
||||
}
|
||||
62
reposerver/metrics/metrics.go
Normal file
62
reposerver/metrics/metrics.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package metrics
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/argoproj/argo-cd/util/git"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
)
|
||||
|
||||
type MetricsServer struct {
|
||||
handler http.Handler
|
||||
gitRequestCounter *prometheus.CounterVec
|
||||
gitClientFactory git.ClientFactory
|
||||
}
|
||||
|
||||
type GitRequestType string
|
||||
|
||||
const (
|
||||
GitRequestTypeLsRemote = "ls-remote"
|
||||
GitRequestTypeFetch = "fetch"
|
||||
)
|
||||
|
||||
// NewMetricsServer returns a new prometheus server which collects application metrics
|
||||
func NewMetricsServer(gitClientFactory git.ClientFactory) *MetricsServer {
|
||||
registry := prometheus.NewRegistry()
|
||||
registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
|
||||
registry.MustRegister(prometheus.NewGoCollector())
|
||||
|
||||
gitRequestCounter := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "argocd_git_request_total",
|
||||
Help: "Number of git requests performed by repo server",
|
||||
},
|
||||
[]string{"repo", "request_type"},
|
||||
)
|
||||
registry.MustRegister(gitRequestCounter)
|
||||
|
||||
return &MetricsServer{
|
||||
gitClientFactory: gitClientFactory,
|
||||
handler: promhttp.HandlerFor(registry, promhttp.HandlerOpts{}),
|
||||
gitRequestCounter: gitRequestCounter,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MetricsServer) GetHandler() http.Handler {
|
||||
return m.handler
|
||||
}
|
||||
|
||||
// IncGitRequest increments the git requests counter
|
||||
func (m *MetricsServer) IncGitRequest(repo string, requestType GitRequestType) {
|
||||
m.gitRequestCounter.WithLabelValues(repo, string(requestType)).Inc()
|
||||
}
|
||||
|
||||
func (m *MetricsServer) NewClient(repoURL, path, username, password, sshPrivateKey string, insecureIgnoreHostKey bool) (git.Client, error) {
|
||||
client, err := m.gitClientFactory.NewClient(repoURL, path, username, password, sshPrivateKey, insecureIgnoreHostKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return wrapGitClient(repoURL, m, client), nil
|
||||
}
|
||||
@@ -26,6 +26,7 @@ import (
|
||||
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
"github.com/argoproj/argo-cd/util"
|
||||
"github.com/argoproj/argo-cd/util/cache"
|
||||
"github.com/argoproj/argo-cd/util/config"
|
||||
"github.com/argoproj/argo-cd/util/git"
|
||||
"github.com/argoproj/argo-cd/util/helm"
|
||||
"github.com/argoproj/argo-cd/util/ksonnet"
|
||||
@@ -509,7 +510,7 @@ func runCommand(command v1alpha1.Command, path string, env []string) (string, er
|
||||
cmd := exec.Command(command.Command[0], append(command.Command[1:], command.Args...)...)
|
||||
cmd.Env = env
|
||||
cmd.Dir = path
|
||||
return argoexec.RunCommandExt(cmd)
|
||||
return argoexec.RunCommandExt(cmd, config.CmdOpts())
|
||||
}
|
||||
|
||||
func runConfigManagementPlugin(appPath string, q *ManifestRequest, creds git.Creds, plugins []*v1alpha1.ConfigManagementPlugin) ([]*unstructured.Unstructured, error) {
|
||||
|
||||
@@ -99,7 +99,7 @@ func TestGenerateHelmChartWithDependencies(t *testing.T) {
|
||||
helmHome, err := ioutil.TempDir("", "")
|
||||
assert.NoError(t, err)
|
||||
os.Setenv("HELM_HOME", helmHome)
|
||||
_, err = exec.RunCommand("helm", "init", "--client-only", "--skip-refresh")
|
||||
_, err = exec.RunCommand("helm", exec.CmdOpts{}, "init", "--client-only", "--skip-refresh")
|
||||
assert.NoError(t, err)
|
||||
defer func() {
|
||||
_ = os.RemoveAll(helmHome)
|
||||
|
||||
@@ -99,7 +99,7 @@ if obj.status ~= nil then
|
||||
end
|
||||
if obj.spec.strategy.canary ~= nil then
|
||||
currentRSIsStable = obj.status.canary.stableRS == obj.status.currentPodHash
|
||||
if obj.spec.strategy.canary.steps ~= nil then
|
||||
if obj.spec.strategy.canary.steps ~= nil and table.getn(obj.spec.strategy.canary.steps) > 0 then
|
||||
stepCount = table.getn(obj.spec.strategy.canary.steps)
|
||||
if obj.status.currentStepIndex ~= nil then
|
||||
currentStepIndex = obj.status.currentStepIndex
|
||||
|
||||
@@ -56,4 +56,8 @@ tests:
|
||||
- healthStatus:
|
||||
status: Healthy
|
||||
message: The rollout has completed canary deployment
|
||||
inputPath: testdata/canary/healthy_noSteps.yaml
|
||||
inputPath: testdata/canary/healthy_noSteps.yaml
|
||||
- healthStatus:
|
||||
status: Healthy
|
||||
message: The rollout has completed canary deployment
|
||||
inputPath: testdata/canary/healthy_emptyStepsList.yaml
|
||||
67
resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_emptyStepsList.yaml
vendored
Normal file
67
resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_emptyStepsList.yaml
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Rollout
|
||||
metadata:
|
||||
annotations:
|
||||
kubectl.kubernetes.io/last-applied-configuration: >
|
||||
{"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}}
|
||||
rollout.argoproj.io/revision: '2'
|
||||
clusterName: ''
|
||||
creationTimestamp: '2019-05-01T21:55:30Z'
|
||||
generation: 1
|
||||
labels:
|
||||
app.kubernetes.io/instance: guestbook-canary
|
||||
ksonnet.io/component: guestbook-ui
|
||||
name: guestbook-canary
|
||||
namespace: default
|
||||
resourceVersion: '956205'
|
||||
selfLink: /apis/argoproj.io/v1alpha1/namespaces/default/rollouts/guestbook-canary
|
||||
uid: d6105ccd-6c5b-11e9-b8d7-025000000001
|
||||
spec:
|
||||
minReadySeconds: 10
|
||||
replicas: 5
|
||||
selector:
|
||||
matchLabels:
|
||||
app: guestbook-canary
|
||||
strategy:
|
||||
canary:
|
||||
maxSurge: 1
|
||||
maxUnavailable: 0
|
||||
steps: []
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
labels:
|
||||
app: guestbook-canary
|
||||
spec:
|
||||
containers:
|
||||
- image: 'gcr.io/heptio-images/ks-guestbook-demo:0.2'
|
||||
name: guestbook-canary
|
||||
ports:
|
||||
- containerPort: 80
|
||||
resources: {}
|
||||
status:
|
||||
HPAReplicas: 5
|
||||
availableReplicas: 5
|
||||
blueGreen: {}
|
||||
canary:
|
||||
stableRS: 567dd56d89
|
||||
conditions:
|
||||
- lastTransitionTime: '2019-05-01T22:00:16Z'
|
||||
lastUpdateTime: '2019-05-01T22:00:16Z'
|
||||
message: Rollout has minimum availability
|
||||
reason: AvailableReason
|
||||
status: 'True'
|
||||
type: Available
|
||||
- lastTransitionTime: '2019-05-01T21:55:30Z'
|
||||
lastUpdateTime: '2019-05-01T22:00:16Z'
|
||||
message: ReplicaSet "guestbook-canary-567dd56d89" has successfully progressed.
|
||||
reason: NewReplicaSetAvailable
|
||||
status: 'True'
|
||||
type: Progressing
|
||||
currentPodHash: 567dd56d89
|
||||
currentStepHash: 6c9545789c
|
||||
observedGeneration: 6886f85bff
|
||||
readyReplicas: 5
|
||||
replicas: 5
|
||||
selector: app=guestbook-canary
|
||||
updatedReplicas: 5
|
||||
@@ -35,6 +35,7 @@ import (
|
||||
argoutil "github.com/argoproj/argo-cd/util/argo"
|
||||
"github.com/argoproj/argo-cd/util/cache"
|
||||
"github.com/argoproj/argo-cd/util/db"
|
||||
"github.com/argoproj/argo-cd/util/diff"
|
||||
"github.com/argoproj/argo-cd/util/git"
|
||||
"github.com/argoproj/argo-cd/util/kube"
|
||||
"github.com/argoproj/argo-cd/util/lua"
|
||||
@@ -353,7 +354,7 @@ func (s *Server) Patch(ctx context.Context, q *application.ApplicationPatchReque
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionUpdate, appRBACName(*app)); err != nil {
|
||||
if err = s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionOverride, appRBACName(*app)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -533,14 +534,6 @@ func (s *Server) validateAndNormalizeApp(ctx context.Context, app *appv1.Applica
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
conditions, err := argo.ValidatePermissions(ctx, &app.Spec, proj, s.db)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
return status.Errorf(codes.InvalidArgument, "application spec is invalid: %s", argo.FormatAppConditions(conditions))
|
||||
}
|
||||
conditions, appSourceType, err := argo.ValidateRepo(ctx, &app.Spec, s.repoClientset, s.db)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -548,6 +541,15 @@ func (s *Server) validateAndNormalizeApp(ctx context.Context, app *appv1.Applica
|
||||
if len(conditions) > 0 {
|
||||
return status.Errorf(codes.InvalidArgument, "application spec is invalid: %s", argo.FormatAppConditions(conditions))
|
||||
}
|
||||
|
||||
conditions, err = argo.ValidatePermissions(ctx, &app.Spec, proj, s.db)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
return status.Errorf(codes.InvalidArgument, "application spec is invalid: %s", argo.FormatAppConditions(conditions))
|
||||
}
|
||||
|
||||
app.Spec = *argo.NormalizeApplicationSpec(&app.Spec, appSourceType)
|
||||
return nil
|
||||
}
|
||||
@@ -603,7 +605,7 @@ func (s *Server) GetResource(ctx context.Context, q *application.ApplicationReso
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = replaceSecretValues(obj)
|
||||
obj, err = replaceSecretValues(obj)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -614,20 +616,15 @@ func (s *Server) GetResource(ctx context.Context, q *application.ApplicationReso
|
||||
return &application.ApplicationResourceResponse{Manifest: string(data)}, nil
|
||||
}
|
||||
|
||||
func replaceSecretValues(obj *unstructured.Unstructured) error {
|
||||
func replaceSecretValues(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
|
||||
if obj.GetKind() == kube.SecretKind && obj.GroupVersionKind().Group == "" {
|
||||
data, _, _ := unstructured.NestedMap(obj.Object, "data")
|
||||
if data != nil {
|
||||
for k := range data {
|
||||
data[k] = "**********"
|
||||
}
|
||||
err := unstructured.SetNestedField(obj.Object, data, "data")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, obj, err := diff.HideSecretData(nil, obj)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return obj, err
|
||||
}
|
||||
return nil
|
||||
return obj, nil
|
||||
}
|
||||
|
||||
// PatchResource patches a resource
|
||||
@@ -652,7 +649,7 @@ func (s *Server) PatchResource(ctx context.Context, q *application.ApplicationRe
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = replaceSecretValues(manifest)
|
||||
manifest, err = replaceSecretValues(manifest)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -822,6 +819,14 @@ func (s *Server) Sync(ctx context.Context, syncReq *application.ApplicationSyncR
|
||||
if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionSync, appRBACName(*a)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if syncReq.Manifests != nil {
|
||||
if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionOverride, appRBACName(*a)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if a.Spec.SyncPolicy != nil {
|
||||
return nil, status.Error(codes.FailedPrecondition, "Cannot use local sync when Automatic Sync Policy is enabled")
|
||||
}
|
||||
}
|
||||
if a.DeletionTimestamp != nil {
|
||||
return nil, status.Errorf(codes.FailedPrecondition, "application is deleting")
|
||||
}
|
||||
@@ -843,6 +848,7 @@ func (s *Server) Sync(ctx context.Context, syncReq *application.ApplicationSyncR
|
||||
DryRun: syncReq.DryRun,
|
||||
SyncStrategy: syncReq.Strategy,
|
||||
Resources: syncReq.Resources,
|
||||
Manifests: syncReq.Manifests,
|
||||
},
|
||||
}
|
||||
a, err = argo.SetAppOperation(appIf, *syncReq.Name, &op)
|
||||
@@ -1029,7 +1035,7 @@ func (s *Server) RunResourceAction(ctx context.Context, q *application.ResourceA
|
||||
Version: q.Version,
|
||||
Group: q.Group,
|
||||
}
|
||||
res, config, _, err := s.getAppResource(ctx, rbacpolicy.ActionGet, resourceRequest)
|
||||
res, config, _, err := s.getAppResource(ctx, rbacpolicy.ActionOverride, resourceRequest)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ message ApplicationSyncRequest {
|
||||
optional bool prune = 4 [(gogoproto.nullable) = false];
|
||||
optional github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.SyncStrategy strategy = 5;
|
||||
repeated github.com.argoproj.argo_cd.pkg.apis.application.v1alpha1.SyncOperationResource resources = 7 [(gogoproto.nullable) = false];
|
||||
repeated string manifests = 8;
|
||||
}
|
||||
|
||||
// ApplicationUpdateSpecRequest is a request to update application spec
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/argoproj/argo-cd/server/rbacpolicy"
|
||||
"github.com/argoproj/argo-cd/util"
|
||||
"github.com/argoproj/argo-cd/util/cache"
|
||||
"github.com/argoproj/argo-cd/util/clusterauth"
|
||||
"github.com/argoproj/argo-cd/util/db"
|
||||
"github.com/argoproj/argo-cd/util/kube"
|
||||
"github.com/argoproj/argo-cd/util/rbac"
|
||||
@@ -174,6 +175,55 @@ func (s *Server) Delete(ctx context.Context, q *cluster.ClusterQuery) (*cluster.
|
||||
return &cluster.ClusterResponse{}, err
|
||||
}
|
||||
|
||||
// RotateAuth rotates the bearer token used for a cluster
|
||||
func (s *Server) RotateAuth(ctx context.Context, q *cluster.ClusterQuery) (*cluster.ClusterResponse, error) {
|
||||
if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceClusters, rbacpolicy.ActionUpdate, q.Server); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
logCtx := log.WithField("cluster", q.Server)
|
||||
logCtx.Info("Rotating auth")
|
||||
clust, err := s.db.GetCluster(ctx, q.Server)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
restCfg := clust.RESTConfig()
|
||||
if restCfg.BearerToken == "" {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "Cluster '%s' does not use bearer token authentication", q.Server)
|
||||
}
|
||||
claims, err := clusterauth.ParseServiceAccountToken(restCfg.BearerToken)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
kubeclientset, err := kubernetes.NewForConfig(restCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newSecret, err := clusterauth.GenerateNewClusterManagerSecret(kubeclientset, claims)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// we are using token auth, make sure we don't store client-cert information
|
||||
clust.Config.KeyData = nil
|
||||
clust.Config.CertData = nil
|
||||
clust.Config.BearerToken = string(newSecret.Data["token"])
|
||||
|
||||
// Test the token we just created before persisting it
|
||||
err = kube.TestConfig(clust.RESTConfig())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = s.db.UpdateCluster(ctx, clust)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = clusterauth.RotateServiceAccountSecrets(kubeclientset, claims, newSecret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
logCtx.Infof("Rotated auth (old: %s, new: %s)", claims.SecretName, newSecret.Name)
|
||||
return &cluster.ClusterResponse{}, nil
|
||||
}
|
||||
|
||||
func redact(clust *appv1.Cluster) *appv1.Cluster {
|
||||
if clust == nil {
|
||||
return nil
|
||||
|
||||
@@ -62,4 +62,9 @@ service ClusterService {
|
||||
option (google.api.http).delete = "/api/v1/clusters/{server}";
|
||||
}
|
||||
|
||||
// RotateAuth returns a cluster by server address
|
||||
rpc RotateAuth(ClusterQuery) returns (ClusterResponse) {
|
||||
option (google.api.http).post = "/api/v1/clusters/{server}/rotate-auth";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,11 +19,12 @@ const (
|
||||
ResourceApplications = "applications"
|
||||
ResourceRepositories = "repositories"
|
||||
|
||||
ActionGet = "get"
|
||||
ActionCreate = "create"
|
||||
ActionUpdate = "update"
|
||||
ActionDelete = "delete"
|
||||
ActionSync = "sync"
|
||||
ActionGet = "get"
|
||||
ActionCreate = "create"
|
||||
ActionUpdate = "update"
|
||||
ActionDelete = "delete"
|
||||
ActionSync = "sync"
|
||||
ActionOverride = "override"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -3,13 +3,17 @@ package e2e
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
|
||||
"github.com/argoproj/argo-cd/common"
|
||||
@@ -27,7 +31,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
guestbookPath = "guestbook"
|
||||
guestbookPath = "guestbook"
|
||||
guestbookPathLocal = "./testdata/guestbook_local"
|
||||
)
|
||||
|
||||
func TestAppCreation(t *testing.T) {
|
||||
@@ -53,6 +58,16 @@ func TestAppCreation(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestInvalidAppProject(t *testing.T) {
|
||||
Given(t).
|
||||
Path(guestbookPath).
|
||||
Project("does-not-exist").
|
||||
When().
|
||||
Create().
|
||||
Then().
|
||||
Expect(Error("application references project does-not-exist which does not exist", ""))
|
||||
}
|
||||
|
||||
func TestAppDeletion(t *testing.T) {
|
||||
Given(t).
|
||||
Path(guestbookPath).
|
||||
@@ -205,6 +220,30 @@ func TestManipulateApplicationResources(t *testing.T) {
|
||||
Expect(SyncStatusIs(SyncStatusCodeOutOfSync))
|
||||
}
|
||||
|
||||
func assetSecretDataHidden(t *testing.T, manifest string) {
|
||||
secret, err := UnmarshalToUnstructured(manifest)
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, hasStringData, err := unstructured.NestedMap(secret.Object, "stringData")
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, hasStringData)
|
||||
|
||||
secretData, hasData, err := unstructured.NestedMap(secret.Object, "data")
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, hasData)
|
||||
for _, v := range secretData {
|
||||
assert.Regexp(t, regexp.MustCompile(`[*]*`), v)
|
||||
}
|
||||
var lastAppliedConfigAnnotation string
|
||||
annotations := secret.GetAnnotations()
|
||||
if annotations != nil {
|
||||
lastAppliedConfigAnnotation = annotations[v1.LastAppliedConfigAnnotation]
|
||||
}
|
||||
if lastAppliedConfigAnnotation != "" {
|
||||
assetSecretDataHidden(t, lastAppliedConfigAnnotation)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppWithSecrets(t *testing.T) {
|
||||
closer, client, err := fixture.ArgoCDClientset.NewApplicationClient()
|
||||
assert.NoError(t, err)
|
||||
@@ -218,6 +257,17 @@ func TestAppWithSecrets(t *testing.T) {
|
||||
Then().
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced)).
|
||||
And(func(app *Application) {
|
||||
res, err := client.GetResource(context.Background(), &applicationpkg.ApplicationResourceRequest{
|
||||
Namespace: app.Spec.Destination.Namespace,
|
||||
Kind: kube.SecretKind,
|
||||
Group: "",
|
||||
Name: &app.Name,
|
||||
Version: "v1",
|
||||
ResourceName: "test-secret",
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
||||
assetSecretDataHidden(t, res.Manifest)
|
||||
|
||||
diffOutput, err := fixture.RunCli("app", "diff", app.Name)
|
||||
assert.NoError(t, err)
|
||||
@@ -282,7 +332,8 @@ func TestResourceDiffing(t *testing.T) {
|
||||
Then().
|
||||
Expect(SyncStatusIs(SyncStatusCodeOutOfSync)).
|
||||
And(func(app *Application) {
|
||||
diffOutput, _ := fixture.RunCli("app", "diff", app.Name, "--local", "testdata/guestbook")
|
||||
diffOutput, err := fixture.RunCli("app", "diff", app.Name, "--local", "testdata/guestbook")
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, diffOutput, fmt.Sprintf("===== apps/Deployment %s/guestbook-ui ======", fixture.DeploymentNamespace()))
|
||||
}).
|
||||
Given().
|
||||
@@ -344,7 +395,9 @@ func TestKsonnetApp(t *testing.T) {
|
||||
Given(t).
|
||||
Path("ksonnet").
|
||||
Env("prod").
|
||||
// Null out dest server to verify that destination is inferred from ksonnet app
|
||||
Parameter("guestbook-ui=image=gcr.io/heptio-images/ks-guestbook-demo:0.1").
|
||||
DestServer("").
|
||||
When().
|
||||
Create().
|
||||
Sync().
|
||||
@@ -433,8 +486,61 @@ func TestSyncResourceByLabel(t *testing.T) {
|
||||
}).
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced)).
|
||||
And(func(app *Application) {
|
||||
res, _ := fixture.RunCli("app", "sync", app.Name, "--label", "this-label=does-not-exist")
|
||||
assert.Contains(t, res, "level=fatal")
|
||||
_, err := fixture.RunCli("app", "sync", app.Name, "--label", "this-label=does-not-exist")
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "level=fatal")
|
||||
})
|
||||
}
|
||||
|
||||
func TestLocalManifestSync(t *testing.T) {
|
||||
Given(t).
|
||||
Path(guestbookPath).
|
||||
When().
|
||||
Create().
|
||||
Sync().
|
||||
Then().
|
||||
And(func(app *Application) {
|
||||
res, _ := fixture.RunCli("app", "manifests", app.Name)
|
||||
assert.Contains(t, res, "containerPort: 80")
|
||||
assert.Contains(t, res, "image: gcr.io/heptio-images/ks-guestbook-demo:0.2")
|
||||
}).
|
||||
Given().
|
||||
LocalPath(guestbookPathLocal).
|
||||
When().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced)).
|
||||
And(func(app *Application) {
|
||||
res, _ := fixture.RunCli("app", "manifests", app.Name)
|
||||
assert.Contains(t, res, "containerPort: 81")
|
||||
assert.Contains(t, res, "image: gcr.io/heptio-images/ks-guestbook-demo:0.3")
|
||||
}).
|
||||
Given().
|
||||
LocalPath("").
|
||||
When().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced)).
|
||||
And(func(app *Application) {
|
||||
res, _ := fixture.RunCli("app", "manifests", app.Name)
|
||||
assert.Contains(t, res, "containerPort: 80")
|
||||
assert.Contains(t, res, "image: gcr.io/heptio-images/ks-guestbook-demo:0.2")
|
||||
})
|
||||
}
|
||||
|
||||
func TestNoLocalSyncWithAutosyncEnabled(t *testing.T) {
|
||||
Given(t).
|
||||
Path(guestbookPath).
|
||||
When().
|
||||
Create().
|
||||
Sync().
|
||||
Then().
|
||||
And(func(app *Application) {
|
||||
_, err := fixture.RunCli("app", "set", app.Name, "--sync-policy", "automated")
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, err = fixture.RunCli("app", "sync", app.Name, "--local", guestbookPathLocal)
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -458,14 +564,14 @@ func TestPermissions(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
|
||||
// make sure app cannot be created without permissions in project
|
||||
output, err := fixture.RunCli("app", "create", appName, "--repo", fixture.RepoURL(),
|
||||
_, err = fixture.RunCli("app", "create", appName, "--repo", fixture.RepoURL(),
|
||||
"--path", guestbookPath, "--project", "test", "--dest-server", common.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace())
|
||||
assert.Error(t, err)
|
||||
sourceError := fmt.Sprintf("application repo %s is not permitted in project 'test'", fixture.RepoURL())
|
||||
destinationError := fmt.Sprintf("application destination {%s %s} is not permitted in project 'test'", common.KubernetesInternalAPIServerAddr, fixture.DeploymentNamespace())
|
||||
|
||||
assert.Contains(t, output, sourceError)
|
||||
assert.Contains(t, output, destinationError)
|
||||
assert.Contains(t, err.Error(), sourceError)
|
||||
assert.Contains(t, err.Error(), destinationError)
|
||||
|
||||
proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.ArgoCDNamespace).Get("test", metav1.GetOptions{})
|
||||
assert.NoError(t, err)
|
||||
@@ -532,6 +638,33 @@ func TestSyncOptionPruneFalse(t *testing.T) {
|
||||
Expect(ResourceSyncStatusIs("Pod", "pod-1", SyncStatusCodeOutOfSync))
|
||||
}
|
||||
|
||||
// make sure that if we have an invalid manifest, we can add it if we disable validation, we get a server error rather than a client error
|
||||
func TestSyncOptionValidateFalse(t *testing.T) {
|
||||
|
||||
// k3s does not validate at all, so this test does not work
|
||||
if os.Getenv("ARGOCD_E2E_K3S") == "true" {
|
||||
t.SkipNow()
|
||||
}
|
||||
|
||||
Given(t).
|
||||
Path("crd-validation").
|
||||
When().
|
||||
Create().
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
When().
|
||||
Sync().
|
||||
Then().
|
||||
// client error
|
||||
Expect(Error("error validating data", "")).
|
||||
When().
|
||||
PatchFile("deployment.yaml", `[{"op": "add", "path": "/metadata/annotations", "value": {"argocd.argoproj.io/sync-options": "Validate=false"}}]`).
|
||||
Sync().
|
||||
Then().
|
||||
// server error
|
||||
Expect(Error("Error from server", ""))
|
||||
}
|
||||
|
||||
// make sure that, if we have a resource that needs pruning, but we're ignoring it, the app is in-sync
|
||||
func TestCompareOptionIgnoreExtraneous(t *testing.T) {
|
||||
Given(t).
|
||||
|
||||
@@ -18,12 +18,9 @@ func TestCliAppCommand(t *testing.T) {
|
||||
And(func() {
|
||||
output, err := RunCli("app", "sync", Name())
|
||||
assert.NoError(t, err)
|
||||
expected := Tmpl(
|
||||
`GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
|
||||
Pod {{.Namespace}} pod Synced Healthy pod/pod created
|
||||
Pod {{.Namespace}} hook Succeeded Sync pod/hook created`,
|
||||
map[string]interface{}{"Name": Name(), "Namespace": DeploymentNamespace()})
|
||||
assert.Contains(t, NormalizeOutput(output), expected)
|
||||
vars := map[string]interface{}{"Name": Name(), "Namespace": DeploymentNamespace()}
|
||||
assert.Contains(t, NormalizeOutput(output), Tmpl(`Pod {{.Namespace}} pod Synced Healthy pod/pod created`, vars))
|
||||
assert.Contains(t, NormalizeOutput(output), Tmpl(`Pod {{.Namespace}} hook Succeeded Sync pod/hook created`, vars))
|
||||
}).
|
||||
Then().
|
||||
Expect(OperationPhaseIs(OperationSucceeded)).
|
||||
|
||||
21
test/e2e/cluster_objects_test.go
Normal file
21
test/e2e/cluster_objects_test.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package e2e
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
. "github.com/argoproj/argo-cd/test/e2e/fixture/app"
|
||||
)
|
||||
|
||||
// ensure that cluster scoped objects, like a cluster role, as a hok, can be successfully deployed
|
||||
func TestClusterRoleBinding(t *testing.T) {
|
||||
Given(t).
|
||||
Path("cluster-role").
|
||||
When().
|
||||
Create().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(OperationPhaseIs(OperationSucceeded)).
|
||||
Expect(HealthIs(HealthStatusHealthy)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced))
|
||||
}
|
||||
78
test/e2e/delarative_test.go
Normal file
78
test/e2e/delarative_test.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package e2e
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
. "github.com/argoproj/argo-cd/test/e2e/fixture/app"
|
||||
)
|
||||
|
||||
func TestDeclarativeHappyApp(t *testing.T) {
|
||||
Given(t).
|
||||
Path("guestbook").
|
||||
When().
|
||||
Declarative("declarative-apps/app.yaml").
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(HealthIs(HealthStatusMissing)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeOutOfSync)).
|
||||
When().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(OperationPhaseIs(OperationSucceeded)).
|
||||
Expect(HealthIs(HealthStatusHealthy)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced))
|
||||
}
|
||||
|
||||
func TestDeclarativeInvalidPath(t *testing.T) {
|
||||
Given(t).
|
||||
Path("garbage").
|
||||
When().
|
||||
Declarative("declarative-apps/app.yaml").
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(HealthIs(HealthStatusHealthy)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeUnknown)).
|
||||
When().
|
||||
// TODO - should cascade work here or not?
|
||||
Delete(false).
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(DoesNotExist())
|
||||
}
|
||||
|
||||
func TestDeclarativeInvalidProject(t *testing.T) {
|
||||
Given(t).
|
||||
Path("guestbook").
|
||||
Project("garbage").
|
||||
When().
|
||||
Declarative("declarative-apps/app.yaml").
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(HealthIs(HealthStatusUnknown)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeUnknown)).
|
||||
When().
|
||||
// TODO - should cascade work here or not?
|
||||
Delete(false).
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(DoesNotExist())
|
||||
}
|
||||
|
||||
func TestDeclarativeInvalidRepoURL(t *testing.T) {
|
||||
Given(t).
|
||||
Repo("http://foo").
|
||||
Path("guestbook").
|
||||
When().
|
||||
Declarative("declarative-apps/app.yaml").
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(HealthIs(HealthStatusHealthy)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeUnknown)).
|
||||
When().
|
||||
// TODO - should cascade work here or not?
|
||||
Delete(false).
|
||||
Then().
|
||||
Expect(Success("")).
|
||||
Expect(DoesNotExist())
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
. "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
"github.com/argoproj/argo-cd/test/e2e/fixture"
|
||||
)
|
||||
@@ -43,6 +45,8 @@ func (a *Actions) Create() *Actions {
|
||||
args = append(args, "--parameter", parameter)
|
||||
}
|
||||
|
||||
args = append(args, "--project", a.context.project)
|
||||
|
||||
if a.context.namePrefix != "" {
|
||||
args = append(args, "--nameprefix", a.context.namePrefix)
|
||||
}
|
||||
@@ -55,6 +59,20 @@ func (a *Actions) Create() *Actions {
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
func (a *Actions) Declarative(filename string) *Actions {
|
||||
values := map[string]interface{}{
|
||||
"ArgoCDNamespace": fixture.ArgoCDNamespace,
|
||||
"DeploymentNamespace": fixture.DeploymentNamespace(),
|
||||
"Name": a.context.name,
|
||||
"Path": a.context.path,
|
||||
"Project": a.context.project,
|
||||
"RepoURL": fixture.RepoURL(),
|
||||
}
|
||||
a.lastOutput, a.lastError = fixture.Declarative(filename, values)
|
||||
return a
|
||||
}
|
||||
|
||||
func (a *Actions) PatchApp(patch string) *Actions {
|
||||
a.runCli("app", "patch", a.context.name, "--patch", patch)
|
||||
return a
|
||||
@@ -75,6 +93,10 @@ func (a *Actions) Sync() *Actions {
|
||||
args = append(args, "--resource", a.context.resource)
|
||||
}
|
||||
|
||||
if a.context.localPath != "" {
|
||||
args = append(args, "--local", a.context.localPath)
|
||||
}
|
||||
|
||||
a.runCli(args...)
|
||||
return a
|
||||
}
|
||||
@@ -97,11 +119,7 @@ func (a *Actions) Refresh(refreshType RefreshType) *Actions {
|
||||
}
|
||||
|
||||
func (a *Actions) Delete(cascade bool) *Actions {
|
||||
args := []string{"app", "delete", a.context.name}
|
||||
if cascade {
|
||||
args = append(args, "--cascade")
|
||||
}
|
||||
a.runCli(args...)
|
||||
a.runCli("app", "delete", a.context.name, fmt.Sprintf("--cascade=%v", cascade))
|
||||
return a
|
||||
}
|
||||
|
||||
|
||||
@@ -22,11 +22,13 @@ type Context struct {
|
||||
prune bool
|
||||
configManagementPlugin string
|
||||
async bool
|
||||
localPath string
|
||||
project string
|
||||
}
|
||||
|
||||
func Given(t *testing.T) *Context {
|
||||
fixture.EnsureCleanState(t)
|
||||
return &Context{t: t, destServer: KubernetesInternalAPIServerAddr, name: fixture.Name(), prune: true}
|
||||
return &Context{t: t, destServer: KubernetesInternalAPIServerAddr, name: fixture.Name(), project: "default", prune: true}
|
||||
}
|
||||
|
||||
func (c *Context) SSHRepo() *Context {
|
||||
@@ -103,3 +105,13 @@ func (c *Context) Async(async bool) *Context {
|
||||
c.async = async
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Context) LocalPath(localPath string) *Context {
|
||||
c.localPath = localPath
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *Context) Project(project string) *Context {
|
||||
c.project = project
|
||||
return c
|
||||
}
|
||||
|
||||
@@ -187,9 +187,9 @@ func Success(message string) Expectation {
|
||||
}
|
||||
|
||||
// asserts that the last command was an error with substring match
|
||||
func Error(message string) Expectation {
|
||||
func Error(message, err string) Expectation {
|
||||
return func(c *Consequences) (state, string) {
|
||||
if c.actions.lastError != nil && strings.Contains(c.actions.lastOutput, message) {
|
||||
if c.actions.lastError != nil && strings.Contains(c.actions.lastOutput, message) && strings.Contains(c.actions.lastError.Error(), err) {
|
||||
return succeeded, fmt.Sprintf("found error with message '%s'", c.actions.lastOutput)
|
||||
}
|
||||
return failed, fmt.Sprintf("expected error with message '%s', got error '%v' message '%s'", message, c.actions.lastError, c.actions.lastOutput)
|
||||
|
||||
@@ -3,36 +3,21 @@ package fixture
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
argoexec "github.com/argoproj/pkg/exec"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func init() {
|
||||
// ensure we log all shell execs
|
||||
log.SetLevel(log.DebugLevel)
|
||||
}
|
||||
|
||||
func Run(workDir, name string, args ...string) (string, error) {
|
||||
|
||||
start := time.Now()
|
||||
|
||||
log.WithFields(log.Fields{"name": name, "args": args, "workDir": workDir}).Info("running command")
|
||||
|
||||
cmd := exec.Command(name, args...)
|
||||
cmd.Env = os.Environ()
|
||||
cmd.Dir = workDir
|
||||
|
||||
outBytes, err := cmd.Output()
|
||||
output := string(outBytes)
|
||||
if err != nil {
|
||||
exErr, ok := err.(*exec.ExitError)
|
||||
if ok {
|
||||
output = output + string(exErr.Stderr)
|
||||
}
|
||||
}
|
||||
|
||||
for i, line := range strings.Split(output, "\n") {
|
||||
log.Infof("%d: %s", i, line)
|
||||
}
|
||||
|
||||
log.WithFields(log.Fields{"err": err, "duration": time.Since(start)}).Info("ran command")
|
||||
|
||||
return output, err
|
||||
return argoexec.RunCommandExt(cmd, argoexec.CmdOpts{})
|
||||
}
|
||||
|
||||
@@ -276,3 +276,17 @@ func checkLocalRepo() {
|
||||
log.WithFields(log.Fields{"repoUrl": repoUrl}).Fatal("cannot patch repo unless it is local")
|
||||
}
|
||||
}
|
||||
|
||||
// create the resource by creating using "kubctl apply", with bonus templating
|
||||
func Declarative(filename string, values interface{}) (string, error) {
|
||||
|
||||
bytes, err := ioutil.ReadFile("testdata/" + filename)
|
||||
CheckError(err)
|
||||
|
||||
tmpFile, err := ioutil.TempFile("", "")
|
||||
CheckError(err)
|
||||
_, err = tmpFile.WriteString(Tmpl(string(bytes), values))
|
||||
CheckError(err)
|
||||
|
||||
return Run("", "kubectl", "-n", ArgoCDNamespace, "apply", "-f", tmpFile.Name())
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
)
|
||||
|
||||
// utility method to template a string using a map
|
||||
func Tmpl(text string, values map[string]interface{}) string {
|
||||
func Tmpl(text string, values interface{}) string {
|
||||
parse, err := template.New(text).Parse(text)
|
||||
CheckError(err)
|
||||
buf := new(bytes.Buffer)
|
||||
|
||||
@@ -41,3 +41,25 @@ func TestHelmCrdInstallIsCreated(t *testing.T) {
|
||||
return p.Name == "hook"
|
||||
}))
|
||||
}
|
||||
|
||||
func TestDeclarativeHelm(t *testing.T) {
|
||||
Given(t).
|
||||
Path("helm").
|
||||
When().
|
||||
Declarative("declarative-apps/app.yaml").
|
||||
Sync().
|
||||
Then().
|
||||
Expect(OperationPhaseIs(OperationSucceeded)).
|
||||
Expect(HealthIs(HealthStatusHealthy)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeSynced))
|
||||
}
|
||||
|
||||
func TestDeclarativeHelmInvalidValuesFile(t *testing.T) {
|
||||
Given(t).
|
||||
Path("helm").
|
||||
When().
|
||||
Declarative("declarative-apps/invalid-helm.yaml").
|
||||
Then().
|
||||
Expect(HealthIs(HealthStatusHealthy)).
|
||||
Expect(SyncStatusIs(SyncStatusCodeUnknown))
|
||||
}
|
||||
|
||||
@@ -56,6 +56,9 @@ func TestPreSyncHookFailure(t *testing.T) {
|
||||
Create().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(Error("hook Failed PreSync", "")).
|
||||
// make sure resource are also printed
|
||||
Expect(Error("pod OutOfSync Missing", "")).
|
||||
Expect(OperationPhaseIs(OperationFailed)).
|
||||
// if a pre-sync hook fails, we should not start the main sync
|
||||
Expect(SyncStatusIs(SyncStatusCodeOutOfSync)).
|
||||
|
||||
@@ -81,7 +81,7 @@ func TestSyncStatusOptionIgnore(t *testing.T) {
|
||||
When().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(Error("1 resources require pruning")).
|
||||
Expect(Error("", "1 resources require pruning")).
|
||||
Expect(OperationPhaseIs(OperationSucceeded)).
|
||||
// this is a key check - we expect the app to be healthy because, even though we have a resources that needs
|
||||
// pruning, because it is annotated with IgnoreExtraneous it should not contribute to the sync status
|
||||
|
||||
@@ -123,12 +123,12 @@ func TestAddProjectDestination(t *testing.T) {
|
||||
t.Fatalf("Unable to add project destination %v", err)
|
||||
}
|
||||
|
||||
output, err := fixture.RunCli("proj", "add-destination", projectName,
|
||||
_, err = fixture.RunCli("proj", "add-destination", projectName,
|
||||
"https://192.168.99.100:8443",
|
||||
"test1",
|
||||
)
|
||||
assert.Error(t, err)
|
||||
assert.True(t, strings.Contains(output, "already defined"))
|
||||
assert.True(t, strings.Contains(err.Error(), "already defined"))
|
||||
|
||||
proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.ArgoCDNamespace).Get(projectName, metav1.GetOptions{})
|
||||
assert.NoError(t, err)
|
||||
@@ -167,12 +167,12 @@ func TestRemoveProjectDestination(t *testing.T) {
|
||||
t.Fatalf("Unable to remove project destination %v", err)
|
||||
}
|
||||
|
||||
output, err := fixture.RunCli("proj", "remove-destination", projectName,
|
||||
_, err = fixture.RunCli("proj", "remove-destination", projectName,
|
||||
"https://192.168.99.100:8443",
|
||||
"test1",
|
||||
)
|
||||
assert.NotNil(t, err)
|
||||
assert.True(t, strings.Contains(output, "does not exist"))
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "does not exist")
|
||||
|
||||
proj, err := fixture.AppClientset.ArgoprojV1alpha1().AppProjects(fixture.ArgoCDNamespace).Get(projectName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
@@ -279,7 +279,8 @@ func TestUseJWTToken(t *testing.T) {
|
||||
_, err = fixture.RunCli("proj", "role", "create-token", projectName, roleName)
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, err = fixture.RunCli("proj", "role", "add-policy", projectName, roleName, "-a", "get", "-o", "*", "-p", "allow")
|
||||
assert.NoError(t, err)
|
||||
|
||||
for _, action := range []string{"get", "update", "sync", "create", "override", "*"} {
|
||||
_, err = fixture.RunCli("proj", "role", "add-policy", projectName, roleName, "-a", action, "-o", "*", "-p", "allow")
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,5 +21,5 @@ func TestPruningRequired(t *testing.T) {
|
||||
DeleteFile("pod-2.yaml").
|
||||
Sync().
|
||||
Then().
|
||||
Expect(Error("1 resources require pruning"))
|
||||
Expect(Error("", "1 resources require pruning"))
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ func TestCannotAddAppFromPrivateRepoWithoutCfg(t *testing.T) {
|
||||
When().
|
||||
Create().
|
||||
Then().
|
||||
Expect(Error("repository not accessible: authentication required"))
|
||||
Expect(Error("", "repository not accessible: authentication required"))
|
||||
}
|
||||
|
||||
// make sure you can create an app from a private repo, if the repo is set-up in the CM
|
||||
|
||||
41
test/e2e/sync_options_test.go
Normal file
41
test/e2e/sync_options_test.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package e2e
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
. "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
||||
. "github.com/argoproj/argo-cd/test/e2e/fixture/app"
|
||||
)
|
||||
|
||||
// TestSyncOptionsValidateFalse verifies we can disable validation during kubectl apply, using the
|
||||
// 'argocd.argoproj.io/sync-options: Validate=false' sync option
|
||||
func TestSyncOptionsValidateFalse(t *testing.T) {
|
||||
Given(t).
|
||||
Path("sync-options-validate-false").
|
||||
When().
|
||||
Create().
|
||||
Sync().
|
||||
Then().
|
||||
Expect(OperationPhaseIs(OperationSucceeded))
|
||||
// NOTE: it is a bug that we do not detect this as OutOfSync. This is because we
|
||||
// are dropping fields as part of remarshalling. See: https://github.com/argoproj/argo-cd/issues/1787
|
||||
// Expect(SyncStatusIs(SyncStatusCodeOutOfSync))
|
||||
}
|
||||
|
||||
// TestSyncOptionsValidateTrue verifies when 'argocd.argoproj.io/sync-options: Validate=false' is
|
||||
// not present, then validation is performed and we fail during the apply
|
||||
func TestSyncOptionsValidateTrue(t *testing.T) {
|
||||
// k3s does not validate at all, so this test does not work
|
||||
if os.Getenv("ARGOCD_E2E_K3S") == "true" {
|
||||
t.SkipNow()
|
||||
}
|
||||
Given(t).
|
||||
Path("sync-options-validate-false").
|
||||
When().
|
||||
Create().
|
||||
PatchFile("invalid-cm.yaml", `[{"op": "remove", "path": "/metadata/annotations"}]`).
|
||||
Sync().
|
||||
Then().
|
||||
Expect(OperationPhaseIs(OperationFailed))
|
||||
}
|
||||
15
test/e2e/testdata/cluster-role/cluster-role.yaml
vendored
Normal file
15
test/e2e/testdata/cluster-role/cluster-role.yaml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1beta1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
namespace: cert-manager
|
||||
name: my-cluster-role-binding
|
||||
annotations:
|
||||
argocd.argoproj.io/hook: PreSync
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-admin
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: default
|
||||
namespace: default
|
||||
12
test/e2e/testdata/cluster-role/pod.yaml
vendored
Normal file
12
test/e2e/testdata/cluster-role/pod.yaml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: my-pod
|
||||
spec:
|
||||
containers:
|
||||
- name: main
|
||||
image: alpine:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- "true"
|
||||
restartPolicy: Never
|
||||
22
test/e2e/testdata/crd-validation/deployment.yaml
vendored
Normal file
22
test/e2e/testdata/crd-validation/deployment.yaml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: "80"
|
||||
imagePullPolicy: IfNotPresent
|
||||
14
test/e2e/testdata/declarative-apps/app.yaml
vendored
Normal file
14
test/e2e/testdata/declarative-apps/app.yaml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: {{.Name}}
|
||||
namespace: {{.ArgoCDNamespace}}
|
||||
spec:
|
||||
project: {{.Project}}
|
||||
source:
|
||||
repoURL: {{.RepoURL}}
|
||||
targetRevision: HEAD
|
||||
path: {{.Path}}
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: {{.DeploymentNamespace}}
|
||||
17
test/e2e/testdata/declarative-apps/invalid-helm.yaml
vendored
Normal file
17
test/e2e/testdata/declarative-apps/invalid-helm.yaml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: {{.Name}}
|
||||
namespace: {{.ArgoCDNamespace}}
|
||||
spec:
|
||||
project: {{.Project}}
|
||||
source:
|
||||
repoURL: {{.RepoURL}}
|
||||
targetRevision: HEAD
|
||||
path: {{.Path}}
|
||||
helm:
|
||||
valueFiles:
|
||||
- does-not-exist-values.yaml
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: {{.DeploymentNamespace}}
|
||||
20
test/e2e/testdata/guestbook_local/guestbook-ui-deployment.yaml
vendored
Normal file
20
test/e2e/testdata/guestbook_local/guestbook-ui-deployment.yaml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
apiVersion: apps/v1beta2
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: guestbook-ui
|
||||
spec:
|
||||
replicas: 0
|
||||
revisionHistoryLimit: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: guestbook-ui
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: guestbook-ui
|
||||
spec:
|
||||
containers:
|
||||
- image: gcr.io/heptio-images/ks-guestbook-demo:0.3
|
||||
name: guestbook-ui
|
||||
ports:
|
||||
- containerPort: 81
|
||||
10
test/e2e/testdata/guestbook_local/guestbook-ui-svc.yaml
vendored
Normal file
10
test/e2e/testdata/guestbook_local/guestbook-ui-svc.yaml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: guestbook-ui
|
||||
spec:
|
||||
ports:
|
||||
- port: 81
|
||||
targetPort: 81
|
||||
selector:
|
||||
app: guestbook-ui
|
||||
6
test/e2e/testdata/guestbook_local/kustomization.yaml
vendored
Normal file
6
test/e2e/testdata/guestbook_local/kustomization.yaml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
resources:
|
||||
- ./guestbook-ui-deployment.yaml
|
||||
- ./guestbook-ui-svc.yaml
|
||||
2
test/e2e/testdata/helm/Chart.yaml
vendored
Normal file
2
test/e2e/testdata/helm/Chart.yaml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
version: 1.0.0
|
||||
name: helm
|
||||
6
test/e2e/testdata/helm/templates/config-map.yaml
vendored
Normal file
6
test/e2e/testdata/helm/templates/config-map.yaml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: my-map
|
||||
data:
|
||||
foo: bar
|
||||
0
test/e2e/testdata/helm/values.yaml
vendored
Normal file
0
test/e2e/testdata/helm/values.yaml
vendored
Normal file
8
test/e2e/testdata/sync-options-validate-false/invalid-cm.yaml
vendored
Normal file
8
test/e2e/testdata/sync-options-validate-false/invalid-cm.yaml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# This configmap fails when running `kubectl apply`, but succeeds when running `kubectl apply --validate=false`
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: invalid-cm
|
||||
annotations:
|
||||
argocd.argoproj.io/sync-options: Validate=false
|
||||
invalidKey: this-fails
|
||||
20
test/fixture/revision_metadata/author.go
Normal file
20
test/fixture/revision_metadata/author.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package revision_metadata
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
argoexec "github.com/argoproj/pkg/exec"
|
||||
|
||||
"github.com/argoproj/argo-cd/errors"
|
||||
)
|
||||
|
||||
var Author string
|
||||
|
||||
func init() {
|
||||
userName, err := argoexec.RunCommand("git", argoexec.CmdOpts{}, "config", "--get", "user.name")
|
||||
errors.CheckError(err)
|
||||
userEmail, err := argoexec.RunCommand("git", argoexec.CmdOpts{}, "config", "--get", "user.email")
|
||||
errors.CheckError(err)
|
||||
Author = fmt.Sprintf("%s <%s>", strings.TrimSpace(userName), strings.TrimSpace(userEmail))
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
// TestBuildManifests makes sure we are consistent in naming, and all kustomization.yamls are buildable
|
||||
func TestBuildManifests(t *testing.T) {
|
||||
|
||||
out, err := argoexec.RunCommand("kustomize", "version")
|
||||
out, err := argoexec.RunCommand("kustomize", argoexec.CmdOpts{}, "version")
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, Contains(out, "KustomizeVersion:2") || Contains(out, "KustomizeVersion:v2"), "kustomize should be version 2")
|
||||
|
||||
@@ -35,7 +35,7 @@ func TestBuildManifests(t *testing.T) {
|
||||
return nil
|
||||
}
|
||||
dirName := filepath.Dir(path)
|
||||
_, err = argoexec.RunCommand("kustomize", "build", dirName)
|
||||
_, err = argoexec.RunCommand("kustomize", argoexec.CmdOpts{}, "build", dirName)
|
||||
return err
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
ARG UI_BASE_IMAGE=alpine:3.7
|
||||
|
||||
FROM node:11.15.0 as build
|
||||
|
||||
WORKDIR /src
|
||||
@@ -11,6 +13,9 @@ ARG ARGO_VERSION=latest
|
||||
ENV ARGO_VERSION=$ARGO_VERSION
|
||||
RUN NODE_ENV='production' yarn build
|
||||
|
||||
FROM alpine:3.7
|
||||
####################################################################################################
|
||||
# Final UI Image
|
||||
####################################################################################################
|
||||
FROM $UI_BASE_IMAGE
|
||||
|
||||
COPY --from=build ./src/dist/app /app
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
"@types/react-router": "^4.0.27",
|
||||
"@types/react-router-dom": "^4.2.3",
|
||||
"@types/superagent": "^3.5.7",
|
||||
"argo-ui": "git://github.com/argoproj/argo-ui.git",
|
||||
"argo-ui": "https://github.com/argoproj/argo-ui.git",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-loader": "^7.1.3",
|
||||
|
||||
@@ -246,7 +246,7 @@ export class ApplicationDetails extends React.Component<RouteComponentProps<{ na
|
||||
services.repos.appDetails(src.repoURL, src.path, src.targetRevision, src.details)
|
||||
.catch(() => ({ type: 'Directory' as appModels.AppSourceType, path: application.spec.source.path }))}>
|
||||
{(details: appModels.RepoAppDetails) => <ApplicationParameters
|
||||
save={(app) => services.applications.updateSpec(app.metadata.name, app.spec)} application={application} details={details} />}
|
||||
save={(app) => this.updateApp(app)} application={application} details={details} />}
|
||||
</DataLoader>
|
||||
),
|
||||
}, {
|
||||
@@ -301,11 +301,11 @@ export class ApplicationDetails extends React.Component<RouteComponentProps<{ na
|
||||
iconClassName: 'fa fa-sync',
|
||||
title: <span className='show-for-medium'>Sync</span>,
|
||||
action: () => this.showDeploy('all'),
|
||||
}, {
|
||||
}, ...(application.status.operationState && [{
|
||||
iconClassName: 'fa fa-info-circle',
|
||||
title: <span className='show-for-medium'>Sync Status</span>,
|
||||
action: () => this.setOperationStatusVisible(true),
|
||||
}, {
|
||||
action: () => this.setOperationStatusVisible(true),
|
||||
}] || []), {
|
||||
iconClassName: 'fa fa-history',
|
||||
title: <span className='show-for-medium'>History and rollback</span>,
|
||||
action: () => this.setRollbackPanelVisible(0),
|
||||
@@ -354,8 +354,11 @@ export class ApplicationDetails extends React.Component<RouteComponentProps<{ na
|
||||
const treeSource = new Observable<{ application: appModels.Application, tree: appModels.ApplicationTree }>((observer) => {
|
||||
services.applications.resourceTree(app.metadata.name)
|
||||
.then((tree) => observer.next({ application: app, tree }))
|
||||
.catch((e) => observer.error(e));
|
||||
}).repeat().retryWhen((errors) => errors.delay(500));
|
||||
.catch((e) => {
|
||||
observer.next({ application: app, tree: fallbackTree });
|
||||
observer.error(e);
|
||||
});
|
||||
}).repeat().retryWhen((errors) => errors.delay(1000));
|
||||
if (appInfo.watchEvent) {
|
||||
return treeSource;
|
||||
} else {
|
||||
@@ -370,15 +373,8 @@ export class ApplicationDetails extends React.Component<RouteComponentProps<{ na
|
||||
}
|
||||
|
||||
private async updateApp(app: appModels.Application) {
|
||||
try {
|
||||
await services.applications.updateSpec(app.metadata.name, app.spec);
|
||||
this.refreshRequested.next({});
|
||||
} catch (e) {
|
||||
this.appContext.apis.notifications.show({
|
||||
content: <ErrorNotification title='Unable to update application' e={e}/>,
|
||||
type: NotificationType.Error,
|
||||
});
|
||||
}
|
||||
await services.applications.updateSpec(app.metadata.name, app.spec);
|
||||
this.refreshRequested.next({});
|
||||
}
|
||||
|
||||
private groupAppNodesByKey(application: appModels.Application, tree: appModels.ApplicationTree) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Duration, NotificationType, Ticker } from 'argo-ui';
|
||||
import { Duration, NotificationType, Ticker, Tooltip } from 'argo-ui';
|
||||
import * as moment from 'moment';
|
||||
import * as PropTypes from 'prop-types';
|
||||
import * as React from 'react';
|
||||
@@ -83,25 +83,25 @@ export const ApplicationOperationState: React.StatelessComponent<Props> = ({appl
|
||||
<div className='argo-table-list'>
|
||||
<div className='argo-table-list__head'>
|
||||
<div className='row'>
|
||||
<div className='columns small-1 application-operation-state__icons_container_padding'>
|
||||
<div className='columns large-1 show-for-large application-operation-state__icons_container_padding'>
|
||||
API VERSION
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 show-for-large'>
|
||||
KIND
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 show-for-large'>
|
||||
NAMESPACE
|
||||
</div>
|
||||
<div className='columns small-2'>
|
||||
<div className='columns large-2 small-2'>
|
||||
NAME
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 small-2'>
|
||||
STATUS
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 show-for-large'>
|
||||
HOOK
|
||||
</div>
|
||||
<div className='columns small-4'>
|
||||
<div className='columns large-4 small-8'>
|
||||
MESSAGE
|
||||
</div>
|
||||
</div>
|
||||
@@ -109,30 +109,30 @@ export const ApplicationOperationState: React.StatelessComponent<Props> = ({appl
|
||||
{syncResult.resources.map((resource, i) => (
|
||||
<div className='argo-table-list__row' key={i}>
|
||||
<div className='row'>
|
||||
<div className='columns small-1 application-operation-state__icons_container_padding'>
|
||||
<div className='columns large-1 show-for-large application-operation-state__icons_container_padding'>
|
||||
<div className='application-operation-state__icons_container'>
|
||||
{resource.hookType && (<i title='Resource lifecycle hook' className='fa fa-anchor' />)}
|
||||
</div>
|
||||
{resource.group ? resource.group + '/' + resource.version : resource.version}
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 show-for-large'>
|
||||
{resource.kind}
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 show-for-large'>
|
||||
{resource.namespace}
|
||||
</div>
|
||||
<div className='columns small-2'>
|
||||
<div className='columns large-2 small-2'>
|
||||
{resource.name}
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 small-2'>
|
||||
<utils.ResourceResultIcon
|
||||
resource={resource}/> {resource.status || resource.hookPhase}
|
||||
resource={resource}/> {resource.hookType ? resource.hookPhase : resource.status}
|
||||
</div>
|
||||
<div className='columns small-1'>
|
||||
<div className='columns large-1 show-for-large'>
|
||||
{resource.hookType}
|
||||
</div>
|
||||
<div className='columns small-4'>
|
||||
{resource.message}
|
||||
<div className='columns large-4 small-8'>
|
||||
<Tooltip content={resource.message}><span>{resource.message}</span></Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -62,6 +62,7 @@ export const ApplicationSummary = (props: {
|
||||
<i className='fa fa-external-link'/> {app.spec.source.repoURL}
|
||||
</a>
|
||||
),
|
||||
edit: (formApi: FormApi) => <FormField formApi={formApi} field='spec.source.repoURL' component={Text}/>,
|
||||
},
|
||||
{
|
||||
title: 'TARGET REVISION',
|
||||
|
||||
@@ -122,7 +122,7 @@ export const ComparisonStatusIcon = ({status}: { status: appModels.SyncStatusCod
|
||||
export function syncStatusMessage(app: appModels.Application) {
|
||||
let message = '';
|
||||
let rev = app.spec.source.targetRevision || 'HEAD';
|
||||
if (app.status.sync.revision.length >= 7 && !app.status.sync.revision.startsWith(app.spec.source.targetRevision)) {
|
||||
if (app.status.sync.revision && (app.status.sync.revision.length >= 7 && !app.status.sync.revision.startsWith(app.spec.source.targetRevision))) {
|
||||
rev += ' (' + app.status.sync.revision.substr(0, 7) + ')';
|
||||
}
|
||||
switch (app.status.sync.status) {
|
||||
@@ -171,7 +171,7 @@ export const ResourceResultIcon = ({resource}: { resource: appModels.ResourceRes
|
||||
let color = COLORS.sync_result.unknown;
|
||||
let icon = 'fa-question-circle';
|
||||
|
||||
if (resource.status) {
|
||||
if (!resource.hookType && resource.status) {
|
||||
switch (resource.status) {
|
||||
case appModels.ResultCodes.Synced:
|
||||
color = COLORS.sync_result.synced;
|
||||
@@ -195,7 +195,7 @@ export const ResourceResultIcon = ({resource}: { resource: appModels.ResourceRes
|
||||
}
|
||||
return <i title={title} className={'fa ' + icon} style={{ color }} />;
|
||||
}
|
||||
if (resource.hookPhase) {
|
||||
if (resource.hookType && resource.hookPhase) {
|
||||
let className = '';
|
||||
switch (resource.hookPhase) {
|
||||
case appModels.OperationPhases.Running:
|
||||
|
||||
@@ -17,7 +17,7 @@ function generatePolicy(project: string, role: string, action?: string, object?:
|
||||
return `p, proj:${project}:${role}, applications, ${action || ''}, ${(object ? project + '/' + object : '')}, ${permission || ''}`;
|
||||
}
|
||||
|
||||
const actions = ['get', 'create', 'update', 'delete', 'sync'];
|
||||
const actions = ['get', 'create', 'update', 'delete', 'sync', 'override'];
|
||||
|
||||
export const ProjectRolePoliciesEdit = (props: ProjectRolePoliciesProps) => (
|
||||
<DataLoader load={() => services.applications.list([props.projName], { fields: ['items.metadata.name'] })}>
|
||||
|
||||
@@ -133,12 +133,6 @@ export interface ApplicationSource {
|
||||
*/
|
||||
path: string;
|
||||
|
||||
/**
|
||||
* DEPRECATED.
|
||||
* Overridden component parameters.
|
||||
*/
|
||||
componentParameterOverrides?: ComponentParameter[];
|
||||
|
||||
helm?: ApplicationSourceHelm;
|
||||
|
||||
kustomize?: ApplicationSourceKustomize;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import * as deepMerge from 'deepmerge';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import * as models from '../models';
|
||||
@@ -49,7 +50,6 @@ export class ApplicationsService {
|
||||
}
|
||||
|
||||
public updateSpec(appName: string, spec: models.ApplicationSpec): Promise<models.ApplicationSpec> {
|
||||
spec.source.componentParameterOverrides = null;
|
||||
return requests.put(`/applications/${appName}/spec`).send(spec).then((res) => res.body as models.ApplicationSpec);
|
||||
}
|
||||
|
||||
@@ -167,16 +167,18 @@ export class ApplicationsService {
|
||||
}
|
||||
|
||||
private parseAppFields(data: any): models.Application {
|
||||
const app = data as models.Application;
|
||||
app.kind = app.kind || 'Application';
|
||||
if (app.spec) {
|
||||
app.spec.project = app.spec.project || 'default';
|
||||
delete app.spec.source.componentParameterOverrides;
|
||||
}
|
||||
if (app.status) {
|
||||
app.status.resources = app.status.resources || [];
|
||||
app.status.summary = app.status.summary || {};
|
||||
}
|
||||
return app;
|
||||
data = deepMerge({
|
||||
apiVersion: 'argoproj.io/v1alpha1',
|
||||
kind: 'Application',
|
||||
spec: {
|
||||
project: 'default',
|
||||
},
|
||||
status: {
|
||||
resources: [],
|
||||
summary: {},
|
||||
},
|
||||
}, data);
|
||||
|
||||
return data as models.Application;
|
||||
}
|
||||
}
|
||||
|
||||
255
ui/yarn.lock
255
ui/yarn.lock
@@ -826,9 +826,9 @@ are-we-there-yet@~1.1.2:
|
||||
delegates "^1.0.0"
|
||||
readable-stream "^2.0.6"
|
||||
|
||||
"argo-ui@git://github.com/argoproj/argo-ui.git":
|
||||
"argo-ui@https://github.com/argoproj/argo-ui.git":
|
||||
version "1.0.0"
|
||||
resolved "git://github.com/argoproj/argo-ui.git#20bf3cbe3db2c60f5882bd95c153c538e39a0b7b"
|
||||
resolved "https://github.com/argoproj/argo-ui.git#b1392db861fa5031b20e1c2cbd3884d91b941cf4"
|
||||
dependencies:
|
||||
"@fortawesome/fontawesome-free" "^5.8.1"
|
||||
"@tippy.js/react" "^2.1.2"
|
||||
@@ -856,7 +856,9 @@ are-we-there-yet@~1.1.2:
|
||||
rxjs "^5.5.6"
|
||||
superagent "^3.8.2"
|
||||
superagent-promise "^1.1.0"
|
||||
ts-loader "^6.0.4"
|
||||
typescript "^2.8.3"
|
||||
webpack-cli "^3.3.5"
|
||||
winston "^3.1.0"
|
||||
ws "^4.0.0"
|
||||
xterm "2.4.0"
|
||||
@@ -1591,6 +1593,11 @@ big.js@^3.1.3:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
|
||||
|
||||
big.js@^5.2.2:
|
||||
version "5.2.2"
|
||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
||||
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
|
||||
|
||||
binary-extensions@^1.0.0:
|
||||
version "1.11.0"
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
|
||||
@@ -1688,6 +1695,13 @@ braces@^2.3.0, braces@^2.3.1:
|
||||
split-string "^3.0.2"
|
||||
to-regex "^3.0.1"
|
||||
|
||||
braces@^3.0.1:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
brorand@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
|
||||
@@ -1921,6 +1935,15 @@ caseless@~0.12.0:
|
||||
version "0.12.0"
|
||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||
|
||||
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||
dependencies:
|
||||
ansi-styles "^3.2.1"
|
||||
escape-string-regexp "^1.0.5"
|
||||
supports-color "^5.3.0"
|
||||
|
||||
chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.0:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||
@@ -1931,15 +1954,6 @@ chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.0:
|
||||
strip-ansi "^3.0.0"
|
||||
supports-color "^2.0.0"
|
||||
|
||||
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||
dependencies:
|
||||
ansi-styles "^3.2.1"
|
||||
escape-string-regexp "^1.0.5"
|
||||
supports-color "^5.3.0"
|
||||
|
||||
chalk@^2.3.0, chalk@^2.4.1:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
|
||||
@@ -2048,6 +2062,15 @@ cliui@^4.0.0:
|
||||
strip-ansi "^4.0.0"
|
||||
wrap-ansi "^2.0.0"
|
||||
|
||||
cliui@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
|
||||
integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
|
||||
dependencies:
|
||||
string-width "^3.1.0"
|
||||
strip-ansi "^5.2.0"
|
||||
wrap-ansi "^5.1.0"
|
||||
|
||||
clone-deep@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
|
||||
@@ -2340,6 +2363,17 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
|
||||
safe-buffer "^5.0.1"
|
||||
sha.js "^2.4.8"
|
||||
|
||||
cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
|
||||
dependencies:
|
||||
nice-try "^1.0.4"
|
||||
path-key "^2.0.1"
|
||||
semver "^5.5.0"
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
cross-spawn@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
|
||||
@@ -2356,17 +2390,6 @@ cross-spawn@^5.0.1:
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
cross-spawn@^6.0.0, cross-spawn@^6.0.5:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
|
||||
dependencies:
|
||||
nice-try "^1.0.4"
|
||||
path-key "^2.0.1"
|
||||
semver "^5.5.0"
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
cryptiles@2.x.x:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
|
||||
@@ -2794,6 +2817,11 @@ elliptic@^6.0.0:
|
||||
minimalistic-assert "^1.0.0"
|
||||
minimalistic-crypto-utils "^1.0.0"
|
||||
|
||||
emoji-regex@^7.0.1:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
|
||||
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
|
||||
|
||||
emojis-list@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
||||
@@ -2815,7 +2843,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
|
||||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
|
||||
enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
|
||||
integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
|
||||
@@ -3198,6 +3226,13 @@ fill-range@^4.0.0:
|
||||
repeat-string "^1.6.1"
|
||||
to-regex-range "^2.1.0"
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||
dependencies:
|
||||
to-regex-range "^5.0.1"
|
||||
|
||||
finalhandler@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
|
||||
@@ -3247,6 +3282,16 @@ find-up@^3.0.0:
|
||||
dependencies:
|
||||
locate-path "^3.0.0"
|
||||
|
||||
findup-sync@3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
|
||||
integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
|
||||
dependencies:
|
||||
detect-file "^1.0.0"
|
||||
is-glob "^4.0.0"
|
||||
micromatch "^3.0.4"
|
||||
resolve-dir "^1.0.1"
|
||||
|
||||
findup-sync@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
|
||||
@@ -3429,6 +3474,11 @@ get-caller-file@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
|
||||
|
||||
get-caller-file@^2.0.1:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
|
||||
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
|
||||
|
||||
get-stdin@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
|
||||
@@ -3505,6 +3555,13 @@ glob@^7.1.3:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
global-modules@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
|
||||
integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
|
||||
dependencies:
|
||||
global-prefix "^3.0.0"
|
||||
|
||||
global-modules@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
|
||||
@@ -3525,6 +3582,15 @@ global-prefix@^1.0.1:
|
||||
is-windows "^1.0.1"
|
||||
which "^1.2.14"
|
||||
|
||||
global-prefix@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
|
||||
integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
|
||||
dependencies:
|
||||
ini "^1.3.5"
|
||||
kind-of "^6.0.2"
|
||||
which "^1.3.1"
|
||||
|
||||
global@^4.3.0:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
|
||||
@@ -3943,7 +4009,7 @@ ignore@^3.3.5:
|
||||
version "3.3.10"
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
|
||||
|
||||
import-local@^2.0.0:
|
||||
import-local@2.0.0, import-local@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
|
||||
integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
|
||||
@@ -3988,7 +4054,7 @@ inherits@2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
|
||||
|
||||
ini@^1.3.4, ini@~1.3.0:
|
||||
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
|
||||
|
||||
@@ -4000,7 +4066,7 @@ internal-ip@^4.2.0:
|
||||
default-gateway "^4.0.1"
|
||||
ipaddr.js "^1.9.0"
|
||||
|
||||
interpret@^1.1.0:
|
||||
interpret@1.2.0, interpret@^1.1.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
|
||||
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
|
||||
@@ -4189,6 +4255,11 @@ is-number@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||
|
||||
is-odd@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
|
||||
@@ -4881,6 +4952,13 @@ json5@^0.5.0, json5@^0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
|
||||
|
||||
json5@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
|
||||
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
|
||||
dependencies:
|
||||
minimist "^1.2.0"
|
||||
|
||||
jsondiffpatch@^0.3.5:
|
||||
version "0.3.10"
|
||||
resolved "https://registry.yarnpkg.com/jsondiffpatch/-/jsondiffpatch-0.3.10.tgz#79b132ea4e50b370fd9f5b150625462a05fedcd2"
|
||||
@@ -5018,6 +5096,15 @@ loader-runner@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
|
||||
|
||||
loader-utils@1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
|
||||
integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
|
||||
dependencies:
|
||||
big.js "^5.2.2"
|
||||
emojis-list "^2.0.0"
|
||||
json5 "^1.0.1"
|
||||
|
||||
loader-utils@^0.2.16, loader-utils@~0.2.2:
|
||||
version "0.2.17"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
|
||||
@@ -5298,6 +5385,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, mic
|
||||
snapdragon "^0.8.1"
|
||||
to-regex "^3.0.2"
|
||||
|
||||
micromatch@^4.0.0:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
|
||||
integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
|
||||
dependencies:
|
||||
braces "^3.0.1"
|
||||
picomatch "^2.0.5"
|
||||
|
||||
miller-rabin@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
|
||||
@@ -5915,7 +6010,7 @@ os-locale@^2.0.0:
|
||||
lcid "^1.0.0"
|
||||
mem "^1.1.0"
|
||||
|
||||
os-locale@^3.0.0:
|
||||
os-locale@^3.0.0, os-locale@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
|
||||
integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
|
||||
@@ -6145,6 +6240,11 @@ performance-now@^2.1.0:
|
||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||
|
||||
picomatch@^2.0.5:
|
||||
version "2.0.7"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
|
||||
integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
|
||||
|
||||
pify@^2.0.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||
@@ -7591,6 +7691,15 @@ string-width@^1.0.1, string-width@^1.0.2:
|
||||
is-fullwidth-code-point "^2.0.0"
|
||||
strip-ansi "^4.0.0"
|
||||
|
||||
string-width@^3.0.0, string-width@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
|
||||
integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
|
||||
dependencies:
|
||||
emoji-regex "^7.0.1"
|
||||
is-fullwidth-code-point "^2.0.0"
|
||||
strip-ansi "^5.1.0"
|
||||
|
||||
string_decoder@^1.0.0, string_decoder@~1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
||||
@@ -7624,7 +7733,7 @@ strip-ansi@^4.0.0:
|
||||
dependencies:
|
||||
ansi-regex "^3.0.0"
|
||||
|
||||
strip-ansi@^5.0.0:
|
||||
strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
|
||||
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
|
||||
@@ -7689,6 +7798,13 @@ superagent@^3.8.2:
|
||||
qs "^6.5.1"
|
||||
readable-stream "^2.3.5"
|
||||
|
||||
supports-color@6.1.0, supports-color@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
|
||||
integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
supports-color@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
|
||||
@@ -7706,13 +7822,6 @@ supports-color@^5.5.0:
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
supports-color@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
|
||||
integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
symbol-observable@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
|
||||
@@ -7854,6 +7963,13 @@ to-regex-range@^2.1.0:
|
||||
is-number "^3.0.0"
|
||||
repeat-string "^1.6.1"
|
||||
|
||||
to-regex-range@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
to-regex@^3.0.1, to-regex@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
|
||||
@@ -7934,6 +8050,17 @@ ts-jest@^24.0.2:
|
||||
semver "^5.5"
|
||||
yargs-parser "10.x"
|
||||
|
||||
ts-loader@^6.0.4:
|
||||
version "6.0.4"
|
||||
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63"
|
||||
integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g==
|
||||
dependencies:
|
||||
chalk "^2.3.0"
|
||||
enhanced-resolve "^4.0.0"
|
||||
loader-utils "^1.0.2"
|
||||
micromatch "^4.0.0"
|
||||
semver "^6.0.0"
|
||||
|
||||
ts-node@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-4.1.0.tgz#36d9529c7b90bb993306c408cd07f7743de20712"
|
||||
@@ -8209,6 +8336,11 @@ uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
|
||||
|
||||
v8-compile-cache@2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
|
||||
integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
|
||||
|
||||
v8-compile-cache@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c"
|
||||
@@ -8331,6 +8463,23 @@ webpack-cli@^3.2.3:
|
||||
v8-compile-cache "^2.0.2"
|
||||
yargs "^12.0.4"
|
||||
|
||||
webpack-cli@^3.3.5:
|
||||
version "3.3.5"
|
||||
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.5.tgz#f4d1238a66a2843d9cebf189835ea22142e72767"
|
||||
integrity sha512-w0j/s42c5UhchwTmV/45MLQnTVwRoaUTu9fM5LuyOd/8lFoCNCELDogFoecx5NzRUndO0yD/gF2b02XKMnmAWQ==
|
||||
dependencies:
|
||||
chalk "2.4.2"
|
||||
cross-spawn "6.0.5"
|
||||
enhanced-resolve "4.1.0"
|
||||
findup-sync "3.0.0"
|
||||
global-modules "2.0.0"
|
||||
import-local "2.0.0"
|
||||
interpret "1.2.0"
|
||||
loader-utils "1.2.3"
|
||||
supports-color "6.1.0"
|
||||
v8-compile-cache "2.0.3"
|
||||
yargs "13.2.4"
|
||||
|
||||
webpack-dev-middleware@^3.5.1:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.0.tgz#71f1b04e52ff8d442757af2be3a658237d53a3e5"
|
||||
@@ -8486,7 +8635,7 @@ which-module@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
|
||||
|
||||
which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0:
|
||||
which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
||||
dependencies:
|
||||
@@ -8557,6 +8706,15 @@ wrap-ansi@^2.0.0:
|
||||
string-width "^1.0.1"
|
||||
strip-ansi "^3.0.1"
|
||||
|
||||
wrap-ansi@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
|
||||
integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
|
||||
dependencies:
|
||||
ansi-styles "^3.2.0"
|
||||
string-width "^3.0.0"
|
||||
strip-ansi "^5.0.0"
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
@@ -8667,6 +8825,14 @@ yargs-parser@^11.1.1:
|
||||
camelcase "^5.0.0"
|
||||
decamelize "^1.2.0"
|
||||
|
||||
yargs-parser@^13.1.0:
|
||||
version "13.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
|
||||
integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
|
||||
dependencies:
|
||||
camelcase "^5.0.0"
|
||||
decamelize "^1.2.0"
|
||||
|
||||
yargs-parser@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
|
||||
@@ -8698,6 +8864,23 @@ yargs@12.0.2:
|
||||
y18n "^3.2.1 || ^4.0.0"
|
||||
yargs-parser "^10.1.0"
|
||||
|
||||
yargs@13.2.4:
|
||||
version "13.2.4"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
|
||||
integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
|
||||
dependencies:
|
||||
cliui "^5.0.0"
|
||||
find-up "^3.0.0"
|
||||
get-caller-file "^2.0.1"
|
||||
os-locale "^3.1.0"
|
||||
require-directory "^2.1.1"
|
||||
require-main-filename "^2.0.0"
|
||||
set-blocking "^2.0.0"
|
||||
string-width "^3.0.0"
|
||||
which-module "^2.0.0"
|
||||
y18n "^4.0.0"
|
||||
yargs-parser "^13.1.0"
|
||||
|
||||
yargs@^11.0.0:
|
||||
version "11.1.0"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
|
||||
|
||||
@@ -33,11 +33,15 @@ const (
|
||||
EventReasonOperationCompleted = "OperationCompleted"
|
||||
)
|
||||
|
||||
func (l *AuditLogger) logEvent(objMeta metav1.ObjectMeta, gvk schema.GroupVersionKind, info EventInfo, message string) {
|
||||
func (l *AuditLogger) logEvent(objMeta metav1.ObjectMeta, gvk schema.GroupVersionKind, info EventInfo, message string, logFields map[string]string) {
|
||||
logCtx := log.WithFields(log.Fields{
|
||||
"type": info.Type,
|
||||
"reason": info.Reason,
|
||||
})
|
||||
for field, val := range logFields {
|
||||
logCtx = logCtx.WithField(field, val)
|
||||
}
|
||||
|
||||
switch gvk.Kind {
|
||||
case "Application":
|
||||
logCtx = logCtx.WithField("application", objMeta.Name)
|
||||
@@ -78,11 +82,14 @@ func (l *AuditLogger) logEvent(objMeta metav1.ObjectMeta, gvk schema.GroupVersio
|
||||
}
|
||||
|
||||
func (l *AuditLogger) LogAppEvent(app *v1alpha1.Application, info EventInfo, message string) {
|
||||
l.logEvent(app.ObjectMeta, v1alpha1.ApplicationSchemaGroupVersionKind, info, message)
|
||||
l.logEvent(app.ObjectMeta, v1alpha1.ApplicationSchemaGroupVersionKind, info, message, map[string]string{
|
||||
"dest-server": app.Spec.Destination.Server,
|
||||
"dest-namespace": app.Spec.Destination.Namespace,
|
||||
})
|
||||
}
|
||||
|
||||
func (l *AuditLogger) LogAppProjEvent(proj *v1alpha1.AppProject, info EventInfo, message string) {
|
||||
l.logEvent(proj.ObjectMeta, v1alpha1.AppProjectSchemaGroupVersionKind, info, message)
|
||||
l.logEvent(proj.ObjectMeta, v1alpha1.AppProjectSchemaGroupVersionKind, info, message, nil)
|
||||
}
|
||||
|
||||
func NewAuditLogger(ns string, kIf kubernetes.Interface, component string) *AuditLogger {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user