Compare commits

...

1785 Commits

Author SHA1 Message Date
argo-bot
38755a4c1e Bump version to 2.2.9 2022-05-18 11:55:29 +00:00
argo-bot
1c559fd7ba Bump version to 2.2.9 2022-05-18 11:55:16 +00:00
jannfis
0fc0d10a4e Merge pull request from GHSA-r642-gv9p-2wjj
Signed-off-by: jannfis <jann@mistrust.net>

Co-authored-by: Michael Crenshaw <michael@crenshaw.dev>

Co-authored-by: Michael Crenshaw <michael@crenshaw.dev>
2022-05-18 13:16:21 +02:00
Michael Crenshaw
5e767a4b9e Merge pull request from GHSA-6gcg-hp2x-q54h
* fix: do not allow symlinks from directory-type applications

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

* chore: fix imports and unnecessary parameters

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

* chore: lint

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

* chore: use t.TempDir for simpler tests

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

* address comments

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>
2022-05-18 13:13:41 +02:00
jannfis
5cee8f84e3 Merge pull request from GHSA-xmg8-99r8-jc2j
Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

Co-authored-by: Michael Crenshaw <michael@crenshaw.dev>
2022-05-18 13:06:31 +02:00
argo-bot
93d588c86e Bump version to 2.2.8 2022-03-23 00:18:30 +00:00
argo-bot
377eb799ff Bump version to 2.2.8 2022-03-23 00:18:11 +00:00
Alexander Matyushentsev
ff11b58816 fix: fix broken e2e test (#8862)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2022-03-22 14:59:46 -07:00
Alexander Matyushentsev
b1625eb8cc Merge pull request from GHSA-2f5v-8r3f-8pww
* fix: application resource APIs must enforce project restrictions

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Fix unit tests

Signed-off-by: jannfis <jann@mistrust.net>

Co-authored-by: jannfis <jann@mistrust.net>
2022-03-22 10:57:31 -07:00
argo-bot
b8e154f767 Bump version to 2.2.7 2022-03-09 00:58:23 +00:00
argo-bot
c4ab0938f9 Bump version to 2.2.7 2022-03-09 00:58:07 +00:00
Alexander Matyushentsev
3fe5753f33 fix: correct jsonnet paths resolution (#8721)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2022-03-08 15:59:33 -08:00
argo-bot
2e550c3f07 Bump version to 2.2.6 2022-03-06 05:50:51 +00:00
argo-bot
d841aae433 Bump version to 2.2.6 2022-03-06 05:50:37 +00:00
Alexander Matyushentsev
b570ab8b17 fix: prevent file traversal using helm file values param and application details api (#8606)
* fix: prevent file traversal using helm file values param and application details api

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* apply reviewer notes: move resolve.go into separate package; use uuid to generate random file

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2022-03-03 13:37:33 -08:00
Jesse Suen
8c82655c66 fix!: enforce app create/update privileges when getting repo details (#8558)
Signed-off-by: Jesse Suen <jesse@akuity.io>
2022-03-03 13:03:20 -08:00
Alexander Matyushentsev
a9e1040314 feat: support custom helm values file schemes (#8535)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2022-03-03 12:55:07 -08:00
Jesse Suen
6f4bbb5a55 docs: add security documentation related to git repositories (#8463)
Signed-off-by: Jesse Suen <jesse@akuity.io>
2022-02-11 13:49:01 -08:00
argo-bot
8f981ccfcf Bump version to 2.2.5 2022-02-05 01:26:23 +00:00
argo-bot
dbf043e6f1 Bump version to 2.2.5 2022-02-05 01:26:11 +00:00
jannfis
f6501652c4 fix: Resolve symlinked value files correctly (#8387)
* fix: Resolve symlinked value files correctly

Signed-off-by: jannfis <jann@mistrust.net>

* fix: Resolve symlinked value files correctly

Signed-off-by: jannfis <jann@mistrust.net>
2022-02-04 15:11:07 -08:00
argo-bot
78d749ec88 Bump version to 2.2.4 2022-02-03 20:33:05 +00:00
argo-bot
8217d70085 Bump version to 2.2.4 2022-02-03 20:32:49 +00:00
jannfis
02e61797b3 Merge pull request from GHSA-63qx-x74g-jcr7
Signed-off-by: jannfis <jann@mistrust.net>
2022-02-03 20:37:46 +01:00
jannfis
998f063a80 chore: upgrade dex to v2.30.2 (backport of #8237) (#8257)
Signed-off-by: jannfis <jann@mistrust.net>

Co-authored-by: Alexander Matyushentsev <Alexander_Matyushentsev@intuit.com>
2022-01-24 10:17:41 -08:00
argo-bot
987f6659b8 Bump version to 2.2.3 2022-01-18 17:45:46 +00:00
argo-bot
e099a6a851 Bump version to 2.2.3 2022-01-18 17:45:31 +00:00
Alexander Matyushentsev
afbd59ba63 refactor: introduce 'byClusterName' secret index to speedup cluster server URL lookup (#8133)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2022-01-17 19:25:00 -08:00
pasha-codefresh
b1e3a07d92 fix: application exist panic when execute api call (#8188)
fix: application exist panic when execute api call (#8188)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2022-01-15 09:05:19 +01:00
Ishita Sequeira
c3144c0059 fix: route health check stuck in 'Progressing' (#8170)
Signed-off-by: ishitasequeira <isequeir@redhat.com>
2022-01-14 09:03:39 +00:00
jannfis
33547f149b chore: Update to Redis 6.2.4 (#8157) (#8158)
Signed-off-by: jannfis <jann@mistrust.net>
2022-01-12 13:45:56 -08:00
Alexander Matyushentsev
06dc9aa836 docs: update roadmap document with v2.2 release changes (#8089)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2022-01-05 09:21:41 -08:00
argo-bot
03b17e0233 Bump version to 2.2.2 2022-01-01 06:18:52 +00:00
argo-bot
d5909f7168 Bump version to 2.2.2 2022-01-01 06:18:35 +00:00
pasha-codefresh
7d0d665747 fix: issue with project scoped resources (#8048)
fix: issue with project scoped resources (#8048)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-12-30 09:12:45 -08:00
Michael Crenshaw
834a102c09 chore: escape proj in regex (#7985)
* chore: escape proj in regex

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

* chore: test normal cases

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

* chore: typo

Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>
2021-12-30 09:12:40 -08:00
plakyda-codefresh
4bcd8cf733 fix: Default value for retry validation #8055 (#8064)
fix: Default value for retry validation #8055 (#8064)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-12-30 09:04:56 -08:00
pasha-codefresh
a069c602dc fix: sync window panel is crashed if resource name not contain letters (#8053)
fix: sync window panel is crashed if resource name not contain letters (#8053)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-12-29 11:08:52 -08:00
Alexander Matyushentsev
e309ceebac fix: upgrade github.com/argoproj/gitops-engine to v0.5.2
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-22 13:45:57 -08:00
plakyda-codefresh
4a7f0bbfd8 fix: retry disabled text (#8004)
fix: retry disabled text (#8004)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-12-22 11:40:30 -08:00
Niklas Steiner
28a54bf2a2 fix: Opening app details shows UI error on some apps (#8016) (#8019)
Signed-off-by: Niklas Steiner <niklas@sbg.at>
2021-12-22 11:17:50 -08:00
Alexander Matyushentsev
e209426a7e fix: correctly handle project field during partial cluster update (#7994)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-21 11:10:39 -08:00
May Zhang
06a95f86ce fix: Cluster API does not support updating labels and annotations (#7901)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-12-21 11:10:32 -08:00
argo-bot
122ecefc3a Bump version to 2.2.1 2021-12-17 01:23:50 +00:00
argo-bot
004d73ce92 Bump version to 2.2.1 2021-12-17 01:23:35 +00:00
Alexander Matyushentsev
81e1a58328 fix: resource details page crashes when resource is not deployed and hide managed fields is selected (#7971)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-16 17:21:54 -08:00
pasha-codefresh
84f949ff17 fix: issue with headless installation (#7958)
fix: issue with headless installation (#7958)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-12-16 10:20:06 -08:00
jomenxiao
a7e7f32a0f fix nil point (#7905)
Signed-off-by: jomenxiao <jomenxiao@gmail.com>
2021-12-16 08:24:54 -08:00
argo-bot
6da92a8e81 Bump version to 2.2.0 2021-12-14 18:01:04 +00:00
argo-bot
d5368f5714 Bump version to 2.2.0 2021-12-14 18:00:47 +00:00
Jesse Suen
25cfb27d51 feat: update gitops-engine to v0.5.1 and add additional tuning options (#7917)
Signed-off-by: Jesse Suen <jesse@akuity.io>
2021-12-13 18:51:41 -08:00
Alexander Matyushentsev
47d23e1f07 fix: resource tracking normalization should not always drop old label (#7911)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-13 10:16:00 -08:00
Alexander Matyushentsev
1dc14dc172 fix: resource tracking normalization shuold drop empty labels (#7909)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-11 11:17:22 -08:00
Alexander Matyushentsev
5c06333914 fix: improve migration from label to annotation tracking (#7899)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-10 16:15:37 -08:00
jannfis
656bee1402 chore: Upgrade to golang 1.16.11 (#7874)
* chore: Upgrade to golang 1.16.11

Signed-off-by: jannfis <jann@mistrust.net>

* Missed this one

Signed-off-by: jannfis <jann@mistrust.net>
2021-12-09 07:04:49 +00:00
pasha-codefresh
2a30c92a7e fix: Resource tracking typo (#7873)
* move projects

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* Revert "move projects"

This reverts commit d0e21353

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* fix typo in resource tracking

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-12-08 09:59:05 -08:00
pasha-codefresh
6a1fec9d33 fix: issue with keepalive (#7861)
* fix issue with keepalive

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* empty commit

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-12-08 09:58:43 -08:00
Alexander Matyushentsev
0faeeb843d refactor: add indexes to secret informers to speedup settings parsing (#7882)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-07 14:15:55 -08:00
Saumeya Katyal
48bdabad1a fix: css change for clear button in filters (#7868)
Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-12-07 10:02:34 -08:00
Alexander Matyushentsev
c3fd7f5f2d fix: fix UI build failure: use correct monaco editor setting name (#7856)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-03 14:32:37 -08:00
Alexander Matyushentsev
3f75a7faa3 feat: allow hiding managed fields in resource manifest viewer (#7855)
* fix: remove double scroll in editor

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* feat: add Hide Managed Fields checkbox

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-03 13:46:43 -08:00
Alexander Matyushentsev
0f14657301 refactor: avoid loading project in frequently executed controller methods (#7853)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-12-03 13:20:46 -08:00
Chetan Banavikalmutt
02768367b5 fix: admin dashboard doesn't use the right context (#7826)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-12-02 22:23:11 -08:00
Jesse Suen
3b628b3af8 fix: env vars to tune cluster cache were broken (#7779)
Signed-off-by: Jesse Suen <jesse@akuity.io>
2021-11-30 13:49:21 -08:00
Alexander Matyushentsev
d8d2920eff refactor: upgrade casbin to latest stable version (v2.39.1) (#7802)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-30 13:48:42 -08:00
Alexander Matyushentsev
1a72853ca3 refactor: use cached project while calculating resource tree (#7747)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-19 13:15:24 -08:00
Alexander Matyushentsev
5354e7d823 chore: use gitops-engine v0.5.0
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-19 13:14:53 -08:00
Mark Sarcevicz
34d8f12c99 Fix: Kuberenetes manifest to have new Github.com ssh known host keys for ArgoCD deployments (#7722)
* Kuberenetes manifest to have new ssh known host keys for ArgoCD deployments

https://github.blog/2021-09-01-improving-git-protocol-security-github/
Signed-off-by: smark88 <msarcevicz@influxdata.com>

* added to docs

Signed-off-by: smark88 <msarcevicz@influxdata.com>

* fix: regenerate manifests using 'make manifests'

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-17 13:33:44 -08:00
argo-bot
8840688e6e Bump version to 2.2.0-rc1 2021-11-12 16:25:15 +00:00
argo-bot
c081ef0b00 Bump version to 2.2.0-rc1 2021-11-12 16:24:57 +00:00
Alexander Matyushentsev
caa246a38d refactor: allow using own config maps to register the cmp plugins instead of 'argocd-cmp-cm' (#7677)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-10 14:57:14 -08:00
pasha-codefresh
ebf27dea3e feat: Improve unit test coverage for util/app/app.go (#7641)
feat: Improve unit test coverage for util/app/app.go (#7641)
Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-11-10 13:41:04 -08:00
Yuan Tang
98fcb417eb build: Pin Python to 3.9.8 to work with arch x64 on GitHub Actions (#7678)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-10 12:44:48 -08:00
Yuan Tang
a3517d594b docs: Update CI troubleshooting guide on build steps (#7639)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-08 09:49:00 -08:00
Yuan Tang
e0c9827a37 chore: Correct function names in docstring in server/project/project.go (#7650)
* docs: Correct function names in docstring in server/project/project.go

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-08 09:48:28 -08:00
May Zhang
375e27bd7a Feat: cmp server (#6585)
* feat: config management plugin enhancement (#6585)

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
Signed-off-by: May Zhang <may_zhang@intuit.com>
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-08 09:47:10 -08:00
Yuan Tang
46fdb6f364 fix: Add missing passCredentials in swagger.json (#7640)
* fix: Add missing passCredentials in swagger.json

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>

* Retrigger CI pipeline

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-08 08:49:28 -08:00
pasha-codefresh
2e84638827 fix: timezone fix test (#7643)
* group diff should set resource id use new interface

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* remove redundant

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* remove eof

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* sync window broken tests

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* sync window broken tests

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-11-07 19:08:02 +01:00
Yuan Tang
0a64781616 build: Add Helm v3.7.1 checksum for arm64 to fix build on Apple M1 (#7635)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-05 14:39:57 -07:00
Yuan Tang
43a29e6b2d docs: Add -s to sign off empty commits that retriggers CI (#7628)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-05 14:39:42 -07:00
Leonardo Luz Almeida
b77f947e1d fix: TestRepository should assume git by default (#7630)
* fix: TestRepository should assume git by default

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>

* fix proto diff

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>
2021-11-05 13:51:02 -07:00
Leonardo Luz Almeida
dc24380065 chore: refactoring gpg test data embeding it in go code (#7625)
Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>
2021-11-05 08:45:14 +01:00
Leonardo Luz Almeida
b0278c4493 fix: handle repo creation when secret does not have proper label (#7617)
* fix: handle repo creation when secret does not have proper label

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>

* address code review comments with linters

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>

* remove gpg test data refactoring code

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>
2021-11-04 17:14:53 -07:00
Alexander Matyushentsev
1431e04b90 fix: add missing await on cluster list page (#7621)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-04 17:14:25 -07:00
Alexander Matyushentsev
5bb45435e0 docs: more post v2.3 roadmap items (#7509)
* docs: more post v2.3 roadmap items

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* replace multiple sources with helm + repo; add app dependencies feature

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-04 09:36:48 -07:00
pasha-codefresh
691b77ff9e feat: split yamls (#7595)
feat: split yamls (#7595)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-11-04 08:33:08 -07:00
Yuan Tang
b52793ab07 docs: Add link to awesome-argo for more resources (#7619)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-11-04 08:25:34 -07:00
Chandler Wilkerson
fc13eda8d6 feat: Add KubeVirt custom health checks (#7176)
Signed-off-by: cwilkers <cwilkers@redhat.com>
2021-11-04 08:23:48 -07:00
Ishita Sequeira
ff45418948 feat: add timezone option to sync window (#7442)
* feat: add timezone option to sync window

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Retrigger CI pipeline

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Addressed PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* feat: add timezone option to sync window

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Addressed PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Addressed PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-11-04 08:22:24 +01:00
Leonardo Luz Almeida
0d4e40ed6a fix: Address issue during diff when secret data is nil (#7603)
* fix: update gitops-engine to latest + log improvements

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>

* run go mod tidy

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>
2021-11-03 12:46:05 -07:00
pasha-codefresh
fe3cc7218c feat: cache argo cd rbac (#7587)
feat: cache argo cd rbac (#7587)

Part of: #4296

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>
Signed-off-by: pashavictorovich <pavel@codefresh.io>
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-03 11:28:52 -07:00
Alexander Matyushentsev
513d8a4ae0 fix: fix invalid resource icons (#7610)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-03 08:19:06 +01:00
plakyda-codefresh
6036e9b4c9 feat: remove cluster confirmation (#7602)
feat: remove cluster confirmation (#7602)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-11-02 11:37:59 -07:00
Leonardo Luz Almeida
8a6b759c4a fix: address edge cases with sync windows (#7517)
* fix: address edge cases with sync windows

Signed-off-by: Leonardo Luz Almeida <leoluz@users.noreply.github.com>

* trigger build

Signed-off-by: Leonardo Luz Almeida <leoluz@users.noreply.github.com>

* trigger build

Signed-off-by: Leonardo Luz Almeida <leoluz@users.noreply.github.com>
2021-11-02 08:48:00 -07:00
Saumeya Katyal
c2b3e74089 feat: autocompletion for resource shortnames (#7466)
* feat: autocompletion for resource shortnames

Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-11-02 08:33:51 -07:00
John Keates
8b10b64dfa Update USERS.md (#7589)
Add Wehkamp as a argocd user.
2021-11-01 11:31:57 -07:00
jphelton
e5c34f472e fix: argocd-dex now merges existing dex.config.oauth2 block instead of overwriting (#7583)
* fix: argocd-dex now merges existing dex.config.oauth2 block with autogenerated block

Signed-off-by: Joshua Helton <jdoghelton@gmail.com>
Signed-off-by: jphelton <jdoghelton@gmail.com>

* simplified statement based on PR feedback

Signed-off-by: Joshua Helton <jdoghelton@gmail.com>
2021-11-01 11:30:42 -07:00
Ben Ye
49b71522c4 feat: support pprof endpoints (#7533)
Signed-off-by: Ben Ye <ben.ye@bytedance.com>
2021-11-01 10:49:43 -07:00
Alexander Matyushentsev
7a6b2ffe56 fix: controller fails to connect to cluster using exec auth provider (#7586)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-11-01 10:02:57 +01:00
jannfis
c7792522c5 fix: Improve user experience for update-password CLI command (#7581)
* fix: Improve user experience for update-password CLI command

Signed-off-by: jannfis <jann@mistrust.net>

* Regenerate CLI docs

Signed-off-by: jannfis <jann@mistrust.net>
2021-10-30 10:30:58 +02:00
Simon Ninon
f4fd836a1b fix: return a codes.NotFound error when trying to get a non-existent repository (#7548)
* fix: return a codes.NotFound error when trying to get a non-existent repository

Signed-off-by: Simon Ninon <simon.ninon@gmail.com>

* move s.db.RepositoryExists call after the permission check

Signed-off-by: Simon Ninon <simon.ninon@gmail.com>

* update ArgoDB mock and add unit tests

Signed-off-by: Simon Ninon <simon.ninon@gmail.com>
2021-10-30 10:11:19 +02:00
Mathieu Parent
2770c690a5 Update to Helm v3.7.1, allow to pass credentials and new OCI support (#7249)
* chore: Update Helm to v3.7.1

Signed-off-by: Mathieu Parent <math.parent@gmail.com>
2021-10-29 17:48:27 -07:00
Nills Franssens
5b914750a4 docs: remove mention of ksonnet in basics (#7567)
Signed-off-by: Nills Franssens <nills.franssens@gmail.com>
2021-10-29 10:46:05 -07:00
Yuan Tang
43cba9cc0b docs: Remove misleading minus sign after version number (#7559)
* docs: Remove unnecessary version numbers in high_availability.md

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>

* Fix

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-10-28 15:49:32 -07:00
Alex Stockinger
0dbffb8557 Clarify key/cert encoding in cluster credentials (#7545)
Fixes #7544

Signed-off-by: Alex Stockinger <mail@alexstockinger.de>
2021-10-28 13:02:19 -07:00
pasha-codefresh
7b0cf773cc feat: Replace option in cli, sync command (#7526)
feat: Replace option in cli, sync command (#7526)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-28 13:01:32 -07:00
Denis Lavrushko
d3bec0faaa docs: Added iits-consulting to the Users.md (#7566)
* added IITS organizations to the USERS.md file

Signed-off-by: Denis Lavrushko <denis.lavrushko@iits-consulting.de>
2021-10-28 12:21:09 -07:00
Saumeya Katyal
7750f579bb docs: toolchain doc minor command update (#7568)
Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-10-28 12:16:54 -07:00
Jeff Maaks
5aeb113968 Update private-repositories.md -- add Azure Repos (#7040)
Added a link to the documentation for creating an access token on Azure Repos
2021-10-28 12:11:40 -07:00
Engin Diri
4522a88289 feat: Show "Open application" link in Application details list view (#7455)
Signed-off-by: Engin Diri <engin.diri@mail.schwarz>
2021-10-28 12:04:29 -07:00
Ben Ye
5f4ecf1ef2 feat: improve cluster info fetch from secret by reducing unnecessary unmarshalling (#7530)
Signed-off-by: Ben Ye <ben.ye@bytedance.com>
2021-10-28 11:11:25 -07:00
Masakinpo
7ced59f346 chore: fix typo in docs/operator-manual/high_availability.md (#7551)
* fix typo in docs/operator-manual/high_availability.md

Signed-off-by: Masakinpo <masakinpo.jp@gmail.com>

* chore: fix typo in docs/operator-manual/high_availability.md

Signed-off-by: Masakinpo <masakinpo.jp@gmail.com>
2021-10-27 10:44:43 -07:00
Omer Kahani
a912611b7a Adding Snyk (#7537)
Signed-off-by: Omer Kahani <kahaniomer@gmail.com>
2021-10-25 18:19:21 -07:00
Alexander Matyushentsev
a21b0363e3 fix: Argo CD should provide apiversion and kinds to 'helm template' command (#7519)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-25 16:52:19 -07:00
Viktor Farcic
07b8a1f63c docs: Video about Image Updater (#7547)
Signed-off-by: Viktor Farcic <viktor@farcic.com>
2021-10-25 20:23:57 +02:00
Keith Chong
1804d771c7 feat: Add banner position option #7313 (#7462)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2021-10-23 11:09:17 -07:00
kiran
7fe8e5ff37 Added paytmlabs argocd blog in readme (#7529)
Signed-off-by: kiran <kiran.sundaravarathan@paytm.com>

Co-authored-by: kiran <kiran.sundaravarathan@paytm.com>
2021-10-22 17:26:47 -07:00
pasha-codefresh
b8510f35f1 fix: mkdocs doesnt work with 3.10.0 python (#7518)
fix: mkdocs doesnt work with 3.10.0 python (#7518)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-21 15:46:31 -07:00
pasha-codefresh
aa6aed3c04 feat: max cookie length (#7515)
feat: max cookie length (#7515)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-21 14:37:39 -07:00
Snyk bot
d6d620e98c fix: upgrade @types/react-helmet from 5.0.8 to 5.0.17 (#7473)
Snyk has created this PR to upgrade @types/react-helmet from 5.0.8 to 5.0.17.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/argoproj/project/e257be49-1bf5-455e-a11b-cdab3dbef067?utm_source=github&utm_medium=referral&page=upgrade-pr
2021-10-21 11:13:23 -07:00
Michael Crenshaw
3e17a69df3 chore: default to no gpg for Procfile - avoids missing temp dir failure (#7506)
Signed-off-by: Michael Crenshaw <michael@crenshaw.dev>

Co-authored-by: Michael Crenshaw <michael_crenshaw@intuit.com>
2021-10-21 11:12:47 -07:00
Alexander Matyushentsev
da63fb26d1 fix: don't use revision caching during app creation (#7508)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-20 20:24:14 -07:00
Mohammad Yosefpor
401b266235 fix: supporting OCI dependencies. Fixes #6062 (#6994)
* fix: supporting OCI dependencies

Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com>

* chore: add org to USERS.md

Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com>

* fix(tests): remove invalid TestRepoPermission e2e test

Signed-off-by: Mohammad Yosefpor <myusefpur@gmail.com>
2021-10-20 18:22:37 -07:00
Alexander Matyushentsev
f46ac844b8 chore: add pasha-codefresh to reviewers list (#7503)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-20 13:09:13 -07:00
May Zhang
046840dcf7 fix: docker image for ui-test (#7461)
fix: docker image for ui-test (#7461)

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-10-20 11:34:28 -07:00
Atsushin
d460f844a4 fix: Fix Color Support in Logs (#7476)
Signed-off-by: Atsushi Neki <nekiaiken@gmail.com>
2021-10-20 11:31:24 -07:00
Leonardo Luz Almeida
970bb80b28 feat: add new sync option to fail if finds shared resources (#7444)
* feat: add new sync option to fail if finds shared resources

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>

* docs: add docs for FailOnSharedResource sync option

Signed-off-by: Leonardo Luz Almeida <leoluz@users.noreply.github.com>
2021-10-20 08:06:41 -07:00
Alexander Matyushentsev
81e801d8ee fix: Invalid memory address or nil pointer dereference in processRequestedAppOperation (#7501)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-20 08:03:55 -07:00
Alexander Matyushentsev
872eff292b fix: Operation has completed with phase: Running (#7482)
* fix: Operation has completed with phase: Running

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-19 17:16:31 -07:00
Julian Strobl
00874af5f2 fix: client certificate ignored during (re)login (#7423)
fix: client certificate ignored during (re)login (#7423)

Signed-off-by: Julian Strobl <julian.strobl@telekom.de>

Co-authored-by: Julian Strobl <julian.strobl@telekom.de>
2021-10-19 13:12:35 -07:00
Hritik Gupta
ad97ed52d5 doc: fixed content in toolchain guide (#7470)
doc: fixed content in toolchain guide (#7470)

Signed-off-by: hgupta3 <hritik_gupta@intuit.com>
2021-10-19 13:08:41 -07:00
Alexander Matyushentsev
7ea35924c9 fix: Application status panel shows Syncing instead of Deleting (#7486)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-19 10:30:09 -07:00
Byungjin Park (Claud)
c7074fe67a docs: Add KarrotPay to Users (#7467)
Signed-off-by: Byungjin Park <posquit0.bj@gmail.com>
2021-10-19 10:13:27 -07:00
jannfis
9a11790df2 fix: Allow plugins to lock repository at top-level to prevent git races (#6223)
* fix: Allow plugins to lock complete repository

Signed-off-by: jannfis <jann@mistrust.net>

* Add some documentation

Signed-off-by: jannfis <jann@mistrust.net>

* Adapt documentation

Signed-off-by: jannfis <jann@mistrust.net>

* Codegen

Signed-off-by: jannfis <jann@mistrust.net>

* Update codegen

Signed-off-by: jannfis <jann@mistrust.net>

* Update codegen

Signed-off-by: jannfis <jann@mistrust.net>
2021-10-19 18:51:59 +02:00
Yuan Tang
695699d08e docs: Add Akuity to the list of users (#7480)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-10-19 08:20:32 -07:00
Álvaro González
374965a606 docs: add a google warning and fix some formats (#7340)
Signed-off-by: alvarogonzalez-packlink <alvarogonzalez@packlink.com>
2021-10-19 01:36:59 -07:00
pasha-codefresh
ddc9f56d05 feat: Cluster name as part of sync (#7394)
feat: Cluster name as part of sync (#7394)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-18 18:44:54 -07:00
pasha-codefresh
3312dc0037 feat: Resource id tracking method doc (#7468)
feat: Resource id tracking method doc (#7468)
Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-18 18:44:08 -07:00
pasha-codefresh
67dd012b87 feat: add cluster name UI (#7409)
* group diff should set resource id use new interface

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* add cluster destination should support name

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-18 13:03:49 -07:00
Leonardo Luz Almeida
10bb1c4e1f docs: add remaining metric docs (#7469)
Signed-off-by: Leonardo Luz Almeida <leoluz@users.noreply.github.com>
2021-10-18 10:10:34 -07:00
ChangZhuo Chen (陳昌倬)
f3730da01e fix: Fix typo in SparkApplication health check script (#7433) (#7434)
Closes: #7433

Signed-off-by: ChangZhuo Chen (陳昌倬) <czchen@czchen.org>
2021-10-17 22:24:42 -07:00
Snyk bot
d8f6ee2d72 fix: upgrade @types/react-dom from 16.8.5 to 16.9.14 (#7400)
Snyk has created this PR to upgrade @types/react-dom from 16.8.5 to 16.9.14.

See this package in npm:


See this project in Snyk:
https://app.snyk.io/org/argoproj/project/e257be49-1bf5-455e-a11b-cdab3dbef067?utm_source=github&utm_medium=referral&page=upgrade-pr
2021-10-17 20:35:07 -07:00
Leonardo Luz Almeida
b5d1433a1f Fix argocd_cluster_connection_status metric (#7419)
* bug: fix argocd_cluster_connection_status metric + docs

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>
2021-10-17 19:58:02 -07:00
Vaibhav Thakur
83ff035df7 Add Tigera to USERS.md (#7435)
Signed-off-by: Vaibhav Thakur <vaibhav@tigera.io>

Co-authored-by: Vaibhav Thakur <vaibhav@tigera.io>
2021-10-17 11:50:02 -07:00
jiraguha
1d4b91efa2 Add Rise the money app for teens to USERS.md (#7465)
Signed-off-by: jpiraguha <jiraguha@gmail.com>
2021-10-17 11:39:43 -07:00
May Zhang
43bcbfb093 fix: makeslice: cap out of range (#7463)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-10-17 10:43:14 -07:00
May Zhang
f0cd21a9f3 fix: invalid memory address or nil pointer dereference during cluster… (#7445)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-10-16 21:57:39 -07:00
Guy Elia
d7d8fe3da2 Add BigPanda to USERS.md (#7416)
Add BigPanda as an ArgoCD user
2021-10-12 10:00:51 -07:00
Assel Meher
c80c1d4f95 fix: fix parameter name when the value is a list (#7360) (#7362)
* fix: #7360

Signed-off-by: Assel Meher <asselmeher@gmail.com>

* fix assert in tests

Signed-off-by: Assel Meher <asselmeher@gmail.com>
2021-10-12 09:50:50 -07:00
Alexander Krantz
6644cbe452 fix: prevent displayed namespace from being undefined (#7401)
Signed-off-by: Alex Krantz <alex@krantz.dev>
2021-10-12 08:28:24 -07:00
Regina Scott
ae02bc27fc feat: add hide toggle for health status bar (#7153)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-10-11 14:41:48 -07:00
Mustafa
5faea8f339 docs: Append echo to kubectl in getting_started.md (#7403)
Add echo to the end of the kubectl command to fetch initial admin secrets so that '%' new line character is not printed at the end of the secret.

Signed-off-by: mustafa89 <mustafa.mujahid@outlook.com>

Co-authored-by: Mustafa Mujahid <mustafa.mujahid@tradebyte.com>
2021-10-11 22:49:06 +02:00
pasha-codefresh
678d35d850 feat: project destination cli (#7407)
feat: project destination cli (#7407)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-11 06:42:47 -07:00
c1_zh
363e1d2d49 feat: Make Casbin matcher configurable on runtime(globMatch(default) or RegexMatch) (#7165)
* feat: Make Casbin matcher configurable on runtime(globMatch(default) or RegexMatch)

Signed-off-by: cezhang <c1zhang.dev@gmail.com>
2021-10-09 12:01:09 -07:00
Alexander Matyushentsev
b2c70df619 docs: update v2.3+ roadmap (#7353)
* docs: update v2.3+ roadmap

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Address reviewer notes: Add 'Merge Argo CD Image Updater into Argo CD' and 'Multi-tenancy improvements'

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-08 15:46:15 -07:00
May Zhang
3c874ae065 fix: Utilize a backoff for git retried operations (#7395)
* fix: git retry duration

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: adjust default values

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: adjust default values

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-10-08 14:00:09 -07:00
Jan-Otto Kröpke
4dd570eb11 docs: Kustomize load_restrictor -> load-restrictor (#7358)
Signed-off-by: Jan-Otto Kröpke <joe@adorsys.de>
2021-10-08 11:56:05 -07:00
Chetan Banavikalmutt
1bc231dd99 fix: failing automated UI smoke tests (#7392)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-10-08 11:49:00 -07:00
Hritik Gupta
8a8373faba feat(ui): Ability to view previous container logs in log viewer (#7393)
feat(ui): Ability to view previous container logs in log viewer (#7393)

Signed-off-by: hgupta3 <hritik_gupta@intuit.com>
2021-10-08 11:33:26 -07:00
Leonardo Luz Almeida
384f5b2bae Expose Application labels in prometheus metric (#7374)
Expose Application labels in prometheus metric (#7374)

Signed-off-by: Leonardo Luz Almeida <leonardo_almeida@intuit.com>
2021-10-08 10:15:51 -07:00
pasha-codefresh
b0736219b6 feat: Resources should be normalized in order to prevent our of sync during migration (#7388)
feat: Resources should be normalized in order to prevent our of sync during migration (#7388)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-07 09:51:29 -07:00
Hrittik Roy
4399348ae5 docs: Add p3r to Users.md (#7346)
docs: Add p3r to Users.md (#7346)

* Update USERS.md

* Add p3r to Users.md

Signed-off-by: GitHub <noreply@github.com>

* Update USERS.md

Signed-off-by: GitHub <noreply@github.com>
2021-10-07 09:49:39 -07:00
Chetan Banavikalmutt
df5cce866f fix: unable to read jqPathExpressions (#7375)
The commit introduces the following changes:
1. Update the admin settings resource-overrides CLI to work with jqPathExpressions
2. Allow jqPathExpressions to be set from the UI

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-10-06 09:59:09 -07:00
pasha-codefresh
07eeddf5f1 feat: group diff should set resource id use new interface (#7381)
feat: group diff should set resource id use new interface (#7381)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-06 09:08:20 -07:00
Chetan Banavikalmutt
0c757534ed fix: remove misleading Helm labels from Redis resources in HA mode (#7368)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-10-05 13:00:26 +02:00
Chetan Banavikalmutt
d8d7b30f58 fix: username is required with access token (#7359)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-10-04 14:58:16 -07:00
Alexander Matyushentsev
9d88e614cd fix: creating JWT token fails (#7366)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-10-04 14:43:49 -07:00
Fabiano Arruda
4e025838c0 Update USERS.md (#7348) 2021-10-04 09:49:15 -07:00
pasha-codefresh
d0c6280d38 feat: change annotation format (#7345)
* change annotation format

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-04 09:48:51 -07:00
Keith Chong
e084a110e4 feat: Allow Banner to be non-closable #7261 (#7312)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2021-10-04 09:45:13 -07:00
pasha-codefresh
df7e5ffd96 feat: annotation-label tracking method (#7342)
feat: annotation-label tracking method (#7342)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-03 16:08:51 -07:00
Oleksandr Saulyak
6f8b10c324 fix: updated argo-ui package with fixes for #7192 / #7262 (#7344)
Signed-off-by: oleksandr-codefresh <oleksandr.saulyak@codefresh.io>
2021-10-02 10:50:32 -07:00
Jille Timmermans
eb70a1e3fa docs: Add an example for setting up Helm charts with GitOps (#7060)
Took me embarrassingly long to figure out.

Signed-off-by: Jille Timmermans <jille@quis.cx>
2021-10-01 11:18:30 -07:00
plakyda-codefresh
35bd9e1ed6 fix: retry options in app details modal (#7329)
fix: retry options in app details modal (#7329)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-10-01 10:24:46 -07:00
Matt Pursley
778be231b9 fix: a few typos in kustomize.md (#7334)
Signed-off-by: Matt Pursley <mattpursley@improbable.io>
2021-10-01 10:17:47 -07:00
Abhishek Veeramalla
d790e96aa9 fix: Retry with exponential backoff result in time to wait of zero(#7173) (#7339)
* fix: Retry with exponential backoff result in time to wait of zero(#7173)

Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>

* fix issue reported by golintci

Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2021-10-01 10:02:44 -07:00
Saumeya Katyal
a6039e1be9 fix: add url check and wrapping for commit msg field (#7218)
* fix: add url check and wrapping for commit msg field

Signed-off-by: saumeya <saumeyakatyal@gmail.com>

* move url regex to util

lint check

Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-10-01 09:23:49 -07:00
pasha-codefresh
3d4deeb4f0 fix: compare app state (#7341)
* fix compare app state

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-10-01 09:18:01 -07:00
pasha-codefresh
ebd87b77ed feat: improve sync logic (#7328)
feat: improve sync logic (#7328)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-30 14:49:29 -07:00
Yuan Tang
31b2cbee70 chore: More informative error message when redirect URL is invalid (#7331)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-09-30 13:29:12 -07:00
pasha-codefresh
a2677f5537 fix: Rm browser history (#7327)
fix: Rm browser history (#7327)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-30 13:25:46 -07:00
Álvaro González
65d669565b docs: configuring Google OIDC and Google groups for RBAC (#7308)
Signed-off-by: alvarogonzalez-packlink <alvarogonzalez@packlink.com>
2021-09-30 02:02:19 -07:00
Ishita Sequeira
07f4034aaa feat: lua script for pause/resume action for Deployments (#7293)
Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-09-29 17:58:35 -07:00
Yi Cai
459833d7c3 fix: default schedule options are cropped #5261 (#7289)
* fix: default schedule options are cropped #5261

Signed-off-by: ciiay <yicai@redhat.com>
2021-09-29 14:53:49 -07:00
Andrii Shaforostov
bbdbf81108 feat: update argo-ui (#7323)
* use merged argo-ui, align dependencies with argo-ui

Signed-off-by: andrii-codefresh <andrii@codefresh.io>

* use merged argo-ui, align dependencies with argo-ui

Signed-off-by: andrii-codefresh <andrii@codefresh.io>
2021-09-29 14:51:42 -07:00
Alexander Matyushentsev
1842c98374 fix: core-install.yaml always refers to latest argocd image (#7321)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-29 14:05:18 -07:00
Chetan Banavikalmutt
94372adcd4 fix: handle applicationset backup forbidden error (#7306)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-09-29 12:33:58 -07:00
plakyda-codefresh
e3df023310 fix: Move orphaned filter to Filters block (#7082)
fix: Move orphaned filter to Filters block (#7082)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-09-29 12:29:21 -07:00
Duy Le
6f5f7ffeee fix: tooltip zindex overwrite toolbar (#7220)
Signed-off-by: Duy Le <duyngoc834@gmail.com>
2021-09-29 12:24:41 -07:00
chandu484
97302103d9 Add Keeeb User to userlist (#7288) 2021-09-29 11:03:29 -07:00
Regina Scott
380037b63d fix: preventOverflow console warnings (#7298)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-09-29 10:27:25 -07:00
pasha-codefresh
0d68194205 feat: tracking method for annotations should be in another format (#7316)
feat: tracking method for annotations should be in another format (#7316)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-29 10:14:49 -07:00
Abhishek Veeramalla
20313adbe2 docs: minor formatting change in the docs (#7305)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2021-09-29 11:43:57 +02:00
pasha-codefresh
a731997c59 feat: tracking method e2e (#7310)
feat: tracking method e2e (#7310)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-28 12:46:01 -07:00
pasha-codefresh
bb88a1c975 feat: rename app identifier (#7251)
feat: rename app identifier (#7251)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-28 08:35:17 -07:00
Alexander Matyushentsev
917d0797fa fix: deploy CI task should start docker using current user id to avoid permission denied error (#7300)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-27 19:01:55 -07:00
plakyda-codefresh
993cb838a9 feat: Project autocomplete (Connect repo SSH) (#7286)
feat: Project autocomplete (Connect repo SSH) (#7286)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-09-27 17:19:00 -07:00
Regina Scott
eb2c69d45e fix: long banner messages get cut off (#7264)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-09-27 13:31:14 -07:00
Alexander Matyushentsev
65012f502b chore: use kustomize verison bundled into argocd to upgrade argocd manifests in argoproj/argoproj-deployments (#7299)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-27 12:58:15 -07:00
ml
2f6e91ad22 chore: fix typo in directory name (#7248)
Signed-off-by: ml <ml@visu.li>
2021-09-27 11:33:00 -07:00
shivjm
b264729bfb docs: fix example ServiceMonitor for argocd-repo-server (#7254)
Signed-off-by: Shiv Jha-Mathur <shivjm@users.noreply.github.com>
2021-09-23 12:46:19 -07:00
pasha-codefresh
3952f66fc7 fix: remove not existing repo (#7280)
* remove not existing repo

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* fix test

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-22 14:27:07 +02:00
plakyda-codefresh
b1f979aad6 feat: retry option app creation (#7252)
feat: retry option app creation (#7252)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-09-21 15:42:26 -07:00
Yuan Tang
2a579a6c05 docs: Add missing links to 1.8-2.1 upgrading guides (#7263)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-09-21 15:02:26 -07:00
dependabot[bot]
9e234b9dec chore(deps): bump tmpl from 1.0.4 to 1.0.5 in /ui (#7266)
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-21 15:02:14 -07:00
John Chen
4f69e93802 docs: add comment about current-user-password (#7258)
It is not immediately clear what the `<current-user-password>` should be as shown by this issue: https://github.com/argoproj/argo-cd/issues/4096.
This comment should make it more clear that when users are setting passwords as the default `admin` user, they should be using the `admin` password here.

Signed-off-by: John Chen <johnchen456@gmail.com>
2021-09-21 14:34:13 -07:00
Alexander Matyushentsev
3799d706df refactor: cache virtual project calculation to improve performance (#7274)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-21 12:20:49 -07:00
yyyyyy888
344353cb16 docs: Add Sutpc company into the user list. (#7267)
Signed-off-by: yangtian9999 <yangtian9999@163.com>
2021-09-21 12:20:08 -07:00
dependabot[bot]
d698e5d68a chore(deps): bump prismjs from 1.24.1 to 1.25.0 in /ui (#7265)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.24.1 to 1.25.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.24.1...v1.25.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-21 11:32:50 -07:00
dependabot[bot]
5f9993a75b chore(deps): bump nth-check from 2.0.0 to 2.0.1 in /ui (#7270)
Bumps [nth-check](https://github.com/fb55/nth-check) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/fb55/nth-check/releases)
- [Commits](https://github.com/fb55/nth-check/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: nth-check
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-21 09:43:13 -07:00
Alexander Matyushentsev
f613fab6f3 refactor: stop using @beyonk/google-fonts-webpack-plugin to download google fonts (#7253)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-18 08:22:53 +02:00
Alexander Matyushentsev
183d729d40 fix: Argo CD should not use cached git/helm revision during app creation/update validation (#7244)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-16 18:35:15 -07:00
Regina Scott
b26e92873f fix: typo causing docs to not render properly (#7242)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-09-16 13:00:02 -07:00
Alexander Matyushentsev
36ab4dadda fix: Argo CD server address unspecified with Argo CD CLI v2.1.x (#7238)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-16 11:23:29 -07:00
pasha-codefresh
91fea1470f feat: add test to redis_hook.go (#7233)
* add test to redis_hook.go

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* restart action

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-16 08:06:29 -07:00
pasha-codefresh
17e6ebdce1 feat: show difference in repos that exist and that should be changed (#7224)
* show difference in repos that exist and that should be changed

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-16 08:02:50 -07:00
pasha-codefresh
6f794d0dc9 fix: Redis should reconnect on connectivity issue (#7207)
fix: Redis should reconnect on connectivity issue (#7207)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-15 09:05:48 -07:00
Miguel Ángel Cabrera Miñagorri
9cf71bef90 fix: support gpg keys generation in centos-7 distros (#7221)
Signed-off-by: Miguel A. Cabrera Minagorri <mcabrera@vmware.com>
2021-09-15 08:26:46 -07:00
gin
25db5038c7 docs(users): add mixi in users.md (#7210)
Signed-off-by: gin <10017674+lirlia@users.noreply.github.com>
2021-09-14 12:52:19 -07:00
Remington Breeze
b6c458e8f4 fix(ui): Add Error Boundary around Extensions and comply with new Extensions API (#7215)
* fix: Add error boundary around Extensions and change path where UI looks for extensions

Signed-off-by: Remington Breeze <remington@breeze.software>

* Add error message to error boundary

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-09-14 12:51:37 -07:00
Alexander Matyushentsev
2147ed3aea fix: cluster API should not drop system labels and annotations (#7212)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-14 10:37:57 -07:00
Remington Breeze
3df6be73e7 fix(ui): More tab was displayed for resources that did not have extensions installed (#7209)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-09-13 22:18:38 -07:00
jannfis
d823efee5d proposal: Change application identifier to allow app names longer than 63 chars (#6425)
proposal: Change application identifier to allow app names longer than 63 chars (#6425)

Signed-off-by: jannfis <jann@mistrust.net>
2021-09-13 08:49:15 -07:00
pasha-codefresh
1817b6b4d4 Scoped resources doc (#7206)
* add doc about scoped resources

Signed-off-by: pashavictorovich <pavel@codefresh.io>

* docs: explain project scoped resources

Signed-off-by: Kostis Kapelonis <kostis@codefresh.io>

Co-authored-by: Kostis Kapelonis <kostis@codefresh.io>
2021-09-13 08:47:39 -07:00
pasha-codefresh
7ed06cc9f6 feat: Scoped resources cluster e2e (#7199)
feat: Scoped resources cluster e2e (#7199)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-12 19:05:49 -07:00
Yuan Tang
49378a95c4 chore: Update Ingress apiVersion to networking.k8s.io/v1beta1 (#7188)
* chore: Update Ingress apiVersion to networking.k8s.io/v1beta1

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>

* Revert changes in  controller/cache/info_test.go

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-09-10 10:04:52 -07:00
jannfis
a38f3176e2 chore: Update haproxy for redis-ha to 2.0.25 (#7194)
Signed-off-by: jannfis <jann@mistrust.net>
2021-09-10 09:13:27 -07:00
pasha-codefresh
08d1cf0e55 feat: Ability to test rbac and implement it with scoped repos (#7187)
feat: Ability to test rbac and implement it with scoped repos (#7187)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-09 21:42:32 -07:00
Thomas
85c45ca76e fix: use selected helm-values (#7166)
Signed-off-by: Thomas Münzl <thomasmuenzl@icloud.com>
2021-09-09 20:48:32 -07:00
Yi Cai
626c963b1c docs: minor update on dependencies.md (#7190)
Signed-off-by: ciiay <yicai@redhat.com>
2021-09-09 15:28:49 -07:00
Suraj Bodade
fc49eb2e46 fixed small typos in github credentials types (#7161)
Signed-off-by: suraj-zemoso <suraj.bodade@zemosolabs.com>
2021-09-09 11:40:06 -07:00
irizzant
e0c07b8027 #7144 fix: add custom volume as Helm working dir (#7162)
#7144 fix: add custom volume as Helm working dir (#7162)

Signed-off-by: irizzant <i.rizzante@gmail.com>
2021-09-09 10:31:03 -07:00
Chetan Banavikalmutt
7122b83fc3 feat: support adding labels and annotations to cluster secret (#7139)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-09-09 09:03:32 -07:00
pasha-codefresh
c64e8df84c feat: ability to switch user during test execution (#7164)
feat: ability to switch user during test execution (#7164)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-09-09 08:58:46 -07:00
Ben Ye
be884d2172 feat: Support delete-resource command in cli (#7093)
* feat: support delete-resource command in argocd cli

Signed-off-by: Ben Ye <ben.ye@bytedance.com>

* add E2E test and fix documents

Signed-off-by: Ben Ye <ben.ye@bytedance.com>

* sync app

Signed-off-by: Ben Ye <ben.ye@bytedance.com>
2021-09-06 09:11:06 -07:00
Ijeh Onyeka
d2100a30a0 add youverify to companies actively using argocd (#7163) 2021-09-04 15:09:51 -07:00
ThoTischner
9559613c8f feat: Closes #6956 - Adding confluent health checks (#6957)
* Issue argoproj#6956 - Adding confluent health checks

Signed-off-by: ThoTischner <thomas-schwaig@web.de>

* Issue argoproj#6956 - Change Unknown to Progressing

Signed-off-by: ThoTischner <thomas-schwaig@web.de>
2021-09-03 21:51:00 +02:00
dependabot[bot]
bd7f8c8eda chore(deps): bump tar from 6.1.3 to 6.1.11 in /ui (#7123)
Bumps [tar](https://github.com/npm/node-tar) from 6.1.3 to 6.1.11.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.3...v6.1.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-03 19:32:33 +02:00
jannfis
a90ab1a2e1 chore: Upgrade github.com/bradleyfalzon/ghinstallation to v2.0.2 (#7151)
Signed-off-by: jannfis <jann@mistrust.net>
2021-09-03 10:28:10 -07:00
Thomas
a5126648e1 fix: use basehref as cookie-path (#7105)
Signed-off-by: Thomas Münzl <thomasmuenzl@icloud.com>
2021-09-03 19:21:31 +02:00
Petr Drastil
d9e8a0fc31 chore: Upgrade dex server image to 2.30.0 (#7102)
* chore: Upgrade dex server to 2.30.0

Signed-off-by: Petr Drastil <petr.drastil@gmail.com>

* Revert dex server probes

Signed-off-by: Petr Drastil <petr.drastil@gmail.com>
2021-09-03 19:20:01 +02:00
Ishita Sequeira
b559bf88d1 feat: Add health checks for route.openshift.io (#7112)
* feat: Add health checks for route.openshift.io

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Addressed PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-09-03 17:27:16 +02:00
Ishita Sequeira
c0f2bf55a7 feat: health check for openshift DeploymentConfig (#7114)
* feat: health check for openshift DeploymentConfig

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Address PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-09-03 17:26:31 +02:00
Ishita Sequeira
4b92f96034 feat: Add health checks for olm operators (#7126)
* feat: Add health checks for olm operators

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Addressed the PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-09-03 17:25:42 +02:00
smartbit
24054820da docs: update url of External Secrets Operator (#7120)
has moved from ContainerSolutions' github account to it's own github project
2021-09-03 11:10:58 +02:00
Alexander Matyushentsev
22600228c2 fix: Correct this attempt to modify const 'store' variable (#7145)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-02 11:37:20 -07:00
renjikari
9025318adf docs: Add freee as a user (#7140)
Signed-off-by: Shunki Fujiwara <shunki-fujiwara@freee.co.jp>
2021-09-02 03:43:13 -07:00
Alexander Matyushentsev
5d9aa989f3 fix: gracefully shutdown metrics server when dex config changes (#7138)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-01 18:55:05 -07:00
Alexander Matyushentsev
9613b240fb fix: upgrade gitops engine (fix #7088) (#7137)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-01 17:45:42 -07:00
Alexander Matyushentsev
8fbcc1c7fc fix: cluster filter popping out of box (#7135)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-09-01 15:33:27 -07:00
Remington Breeze
d2ff65ae39 feat(ui): Display event timestamps in human readable format (#7132)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-09-01 15:08:40 -07:00
c1_zh
dd26a48f8a fix: Network view is confusing if same ingress is targeting two services #2338 (#7113)
Signed-off-by: cezhang <c1zhang.dev@gmail.com>
2021-09-01 14:46:40 -07:00
Chetan Banavikalmutt
8c19c7864d docs: add a section about banners (#7109)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-09-01 12:52:59 -07:00
pasha-codefresh
a9f009cb10 feat: e2e for clusters (#7118)
feat: e2e for clusters (#7118)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-31 10:32:54 -07:00
May Zhang
ce1d8031ae fix: repository name already exists when multiple helm dependencies f… (#7096)
* fix: repository name already exists when multiple helm dependencies from same private repo server

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: add test cases

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: clean up

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-08-31 08:30:03 -07:00
pasha-codefresh
dd2900eaeb feat: scoped repo e2e tests (#7110)
feat: scoped repo e2e tests (#7110)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-30 10:10:32 -07:00
pasha-codefresh
c0bcd6b255 feat: repo list and repo get command + e2e tests (#7108)
feat: repo list and repo get command + e2e tests (#7108)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-30 10:08:33 -07:00
Álvaro González
6897aa4ed2 docs: add configuration guide for using Google Load Balancers with GKE (#6747)
* docs: add configuration guide for using Google Load Balancers with GKE

Signed-off-by: alvarogonzalez-packlink <alvarogonzalez@packlink.com>

* docs: fix format on notes and warnings

Signed-off-by: alvarogonzalez-packlink <alvarogonzalez@packlink.com>
2021-08-30 15:58:49 +02:00
Yi Cai
42903044f3 fix: Summary Colors don't match key and numbers don't match colors #5200 (#7042)
Signed-off-by: ciiay <yicai@redhat.com>
2021-08-27 12:41:09 -07:00
Thomas
700806f408 fix: reset token-cookie on logout (oidc) (#7092)
fix: reset token-cookie on logout (oidc) (#7092)

Signed-off-by: jimtoniq <thomasmuenzl@icloud.com>
2021-08-27 11:09:19 -07:00
pasha-codefresh
b271d6ac5c feat: Test create repository with project ( part of scoped resources e2e tests ) (#7103)
feat: Test create repository with project ( part of scoped resources e2e tests ) (#7103)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-27 10:29:31 -07:00
Jonah Back
a940cb5914 fix(ui): calculate service info correctly for networking.k8s.io/v1 ingress (#6923)
Signed-off-by: Jonah Back <jonah@jonahback.com>
2021-08-26 14:47:26 -07:00
Alexander Matyushentsev
87de4edd15 fix: document IP addresses logging (#7094)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-26 13:01:40 -07:00
Alexander Matyushentsev
abba8dddce docs: update VERSION file and CHANGELOG (#7083)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-26 11:28:51 -07:00
plakyda-codefresh
44520ea479 feat: resource name filter + filter block for resource table view (#7081)
feat: resource name filter + filter block for resource table view (#7081)

Signed-off-by: viktorplakida <plakyda1@gmail.com>
2021-08-26 10:32:36 -07:00
pasha-codefresh
ae803a2f1e feat: goreman option to exclude (#7080)
feat: goreman option to exclude (#7080)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-25 12:40:55 -07:00
pasha-codefresh
49a854a738 feat: Scoped clusters (#7039)
feat: Scoped clusters (#7039)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-25 09:53:58 -07:00
Benjamin Manifold
81155ccb0c feat: Cassandra Health Check. Closes #6843 (#7017)
Signed-off-by: benmanifold <benmanifold@gmail.com>
2021-08-25 11:27:07 +02:00
Josh Gavant
18057fa5ee docs: clarify new repo, port-forward flags (#6937)
The instructions for telling the CLI how to automatically use
port-forward were intertwined with the instructions for registering a
repo; this separates them.

This also moves the port-forward flags instructions to the first place
in the doc a user would need them.

Signed-off-by: Josh Gavant <joshgavant@gmail.com>
2021-08-25 11:26:44 +02:00
May Zhang
ca5003f3ba fix: password reset requirements (#7071)
* fix: password reset meet requirement

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-08-24 23:21:03 -07:00
Alexander Matyushentsev
1d3d03f5d3 fix: Custom Styles feature is broken (#7067)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-24 15:08:12 -07:00
Remington Breeze
a894d4b128 fix(ui): Unschedulable button changed widths on click (#7030)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-24 11:29:45 -07:00
Remington Breeze
440e4dc5d9 fix(ui): Add State to props passed to Extensions (#7045)
Signed-off-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-24 11:23:56 -07:00
Alexander Matyushentsev
d6973c7b8a fix: fix building remote container (#7062)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-24 09:48:14 -07:00
pasha-codefresh
34e904dd7b fix: make codegen (#7059)
fix: make codegen

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-24 09:02:44 -07:00
Omar De Donato
c7e532941f docs: added Technacy in USERS.md (#7051)
We at Technacy love using Argo CD

Signed-off-by: Omar <omar.dedonato@technacy.it>
2021-08-23 13:23:28 +02:00
Alexander Matyushentsev
613db278a7 fix: keep uid_entrypoint.sh for backward compatibility (#7047)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-23 08:38:29 +02:00
pasha-codefresh
91c883668e feat: Scoped repo unit tests (#7026)
feat: Scoped repo unit tests

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-22 18:01:36 -07:00
Yi Cai
d12eafa826 fix: Truncated synchronize check-boxes should have tooltips #4233 (#6954)
Signed-off-by: ciiay <yicai@redhat.com>
2021-08-20 12:41:25 -07:00
Alexander Matyushentsev
0dcac9a8d9 fix: reload extension when selected resource node changes (#7034)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-19 22:14:00 -07:00
Jesse Suen
0078a4d9ee docs: add @wanghong230 as a reviewer (#7029)
Signed-off-by: Jesse Suen <jessesuen@gmail.com>
2021-08-19 17:02:51 -07:00
Jesse Suen
8ceceb8b55 docs: add @rbreeze as an approver (#7028)
Signed-off-by: Jesse Suen <jessesuen@gmail.com>
2021-08-19 13:56:47 -07:00
Remington Breeze
2e3405134b fix(ui): Resource details crashed due to extensions (#7025)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-19 09:55:16 -07:00
pasha-codefresh
5b1906d2a7 feat: Cover grpc crud rbac (#7008)
feat: Cover grpc crud rbac (#7008)

Signed-off-by: Victor Plakyda <plakyda1@gmail.com>
Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-19 08:43:48 -07:00
pasha-codefresh
0093bddc39 fix(ui): user account list yaml (#7021)
fix(ui): user account list yaml (#7021)

Signed-off-by: Victor Plakyda <plakyda1@gmail.com>
2021-08-19 08:40:20 -07:00
Alexander Matyushentsev
788613cb14 feat: support loading extensions in Argo CD UI (#7019)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-19 08:39:51 -07:00
pasha-codefresh
53dd0da8c3 fix(ui): applications table view, Closes #6733 (#6995)
Co-authored-by: Victor Plakyda <plakyda1@gmail.com>
2021-08-18 12:23:34 -07:00
Guido Zockoll
8f21138d54 docs: added type:git to secret examples (fixes #6984) (#7013)
* Update declarative-setup.md

added `type: git` to the secrets

* warning about labels getting lost

when using sealed-secrets the labels will get lost and has to be readded
2021-08-18 20:18:28 +02:00
Saumeya Katyal
676a8714bf fix: Unschedulable button style (#7003)
Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-08-18 09:24:03 -07:00
Philipp Dallig
4ae1d876fd fix: Running on Openshift 4.x with readOnlyRootFilesystem (#6998)
Signed-off-by: Philipp Dallig <philipp.dallig@gmail.com>
2021-08-18 12:18:01 +02:00
Chris Sinjakli
efc8ec1d78 chore: Log application name for invalid application spec (#6991)
When creating an application directly through the CLI or a `kubectl
apply`, it's relatively obvious which application is invalid (provided
you aren't applying several at once) as you're there creating it
interactively.

It's less clear when applications are generated by the application set
controller. When that happens, you need to go looking in the controller
logs, where you'll find something like:

> time="2021-08-10T11:36:02Z" level=error msg="application spec is
> invalid: InvalidSpecError: application destination
> {https://kubernetes.default.svc default} is not permitted in project
> 'my-project'"

which doesn't have any connection back to the application being
generated. This is particularly tricky to track down if you're searching
your logs via some sort of aggregator rather than watching `kubectl logs
-f`.

After this change, the log produced would be:

> time="2021-08-10T11:36:02Z" level=error msg="application spec for
> guestbook is invalid: InvalidSpecError: application destination
> {https://kubernetes.default.svc default} is not permitted in project
> 'my-project'"

There's probably fancier ways this information could be presented (e.g.
if application sets were represented in the UI and knew about failures
to apply their generated applications), but this logging change seems
like a cheap way to make this situation more debuggable.

Signed-off-by: Chris Sinjakli <chris@sinjakli.co.uk>
2021-08-18 11:10:52 +02:00
Alexander Matyushentsev
e3b7a2be13 fix: resouce health filter should include node if node or node's root health matches filter (#7002)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-17 14:34:27 -07:00
Alexander Matyushentsev
44ec4e0a82 fix: upgrade argo-ui version (#7010)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-17 12:50:07 -07:00
pasha-codefresh
24ad4618c2 fix: Git errors to grpc (#7005)
fix: Git errors to grpc (#7005)

Signed-off-by: olegz-codefresh <olegz@codefresh.io>
2021-08-17 12:27:44 -07:00
Yuan Tang
d3fb6fb7db chore: Update to use NewSharedInformerFactoryWithOptions due to deprecation (#7009)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-08-17 21:23:13 +02:00
RoCha
95d9016ed4 feat: healtcheck for iam.cnrm.cloud.google.com/IAMPolicyMember (#6783)
Signed-off-by: Romain Chalumeau <rchalumeau@magicleap.com>
2021-08-17 21:20:30 +02:00
Alexander Matyushentsev
e195995790 docs: update obsolete resource customization docs (#7000)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-16 10:49:34 -07:00
Spiros Economakis
124995c275 feat: Add a metric to express connection status to each cluster (#6862)
The cluster collector includes one more metric for kubernetes cluster connection
which rely on `SyncError`.

Ticket: #6855
Signed-off-by: Spiros Economakis <spiros.oikonomakis@gmail.com>
2021-08-16 09:52:47 -07:00
pasha-codefresh
7b89c4e53c feat: Project scoped repo (#6943)
feat: Project scoped repo (#6943)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-16 09:38:37 -07:00
David Collom
1ab85de378 fix: Disable generating of CA Certificates (#6987)
Signed-off-by: David Collom <david.collom@jetstack.io>
2021-08-14 10:04:41 +02:00
Remington Breeze
eb76649ef5 chore(ui): Relocate CheckboxRow component to Filters instead of argo-ui (#6990)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-13 15:33:36 -07:00
Remington Breeze
3887289090 fix(ui): Migrate to keyhook helpers in argo-ui, update keybindings accordingly (#6953)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-13 14:26:11 -07:00
Yi Cai
d842e8333a feat: Allow collapsing of individual diff sections in diff view #3608 (#6978)
Signed-off-by: ciiay <yicai@redhat.com>
2021-08-13 08:31:37 -07:00
Alexander Matyushentsev
311926b8c9 fix: argocd core commands should not drop existing persistent flags (#6981)
* fix: argocd core commands should not drop existing persistent flags

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* run cli codegen

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-12 23:10:59 -07:00
Yuan Tang
63d809614c docs: Fix links to subsections in roadmap (#6986)
* docs: Fix links to completed subsections in roadmap

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>

* One more link

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-08-12 22:50:15 -07:00
Yuan Tang
741329afb6 docs: Add cluster URL when creating an app to be consistent with the screenshot (#6731)
Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-08-12 22:23:00 -07:00
Nico Schottelius
d36cf3e2bb Update USERS.md - added ungleich.ch (#6979)
Signed-off-by: Nico Schottelius <nico.schottelius@ungleich.ch>

Co-authored-by: Nico Schottelius <nico@nico-notebook.schottelius.org>
2021-08-12 22:17:54 -07:00
Alexander Matyushentsev
53bbb8ecf4 docs: update roadmap and release checklist (#6980)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-12 16:59:39 -07:00
dependabot[bot]
86ca66b2d6 chore(deps): bump jszip from 3.5.0 to 3.7.1 in /ui-test (#6952)
Bumps [jszip](https://github.com/Stuk/jszip) from 3.5.0 to 3.7.1.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/master/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.5.0...v3.7.1)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-12 13:19:20 -07:00
pasha-codefresh
6ac9753b63 feat: support ability get cluster by name from cli, Closes #6865 (#6972)
feat: support ability get cluster by name from cli, Closes #6865 (#6972)

Support get cluster cmd by name
https://github.com/argoproj/argo-cd/issues/6865

Signed-off-by: olegz-codefresh <olegz@codefresh.io>
2021-08-12 13:18:18 -07:00
pasha-codefresh
afb1c8b210 feat(ui): add top value for large breakpoint Closes #6944 (#6975)
feat(ui): add `top` value for `large` breakpoint Closes #6944 (#6975)

Signed-off-by: andrii-codefresh <andrii@codefresh.io>
2021-08-12 12:35:20 -07:00
dependabot[bot]
117eadaceb chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /ui-test (#6950)
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-12 12:33:41 -07:00
dependabot[bot]
10b4e44c42 chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /ui (#6949)
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-12 12:33:18 -07:00
dependabot[bot]
8cf8a8cf81 chore(deps): bump url-parse from 1.5.1 to 1.5.3 in /ui (#6951)
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-12 12:33:10 -07:00
pasha-codefresh
8a29cf8fbf fix(ui): Fix checkbox style in Delete pod modal Closes #6947 (#6961)
* Fix checkbox style in Delete pod modal

Signed-off-by: Victor Plakyda <plakyda1@gmail.com>

* Fix checkbox

Signed-off-by: Victor Plakyda <plakyda1@gmail.com>

Co-authored-by: Victor Plakyda <plakyda1@gmail.com>
2021-08-12 12:05:17 -07:00
ritchiekng
4a3dd76f19 Create USERS.md (#6973)
Fixing issue where link not working
2021-08-12 12:02:30 -07:00
Jesse Suen
b91732a8eb fix: rollout v1.0 'Paused' status.phase should map to Argo CD 'Suspended' (#6967)
Signed-off-by: Jesse Suen <jessesuen@gmail.com>
2021-08-12 11:37:08 -07:00
ritchiekng
97e8c7d00d Update USERS.md - added MeDirect (#6955)
* Update USERS.md

Signed-off-by: Steve Ritchie <steve.ritchie@medirect.com.mt>

* Update USERS.md

Updating website for Medirect
2021-08-11 16:28:51 -07:00
Alexander Matyushentsev
e5ee00f4d0 fix: basehref not set correctly (#6962)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-11 15:22:33 -07:00
Alexander Matyushentsev
aab0b173d5 fix: update deprecated helm2 installation URL (#6960)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-11 12:33:59 -07:00
Alexander Matyushentsev
50993206a5 fix: make sure repo server discard cached empty response (#6948)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-10 19:25:07 -07:00
Alexander Matyushentsev
4164db88f5 fix: applications/resources filter improvement and bug fixes (#6931)
* fix: applications/resources filter improvement and bug fixes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-10 17:10:24 -07:00
May Zhang
c5eb25ceba fix: use secure way to generate initial password (#6938)
* fix: use secure way to generate initial password

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: use secure way to generate initial password

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-08-09 19:22:10 -07:00
pasha-codefresh
685b07ed34 feat(ui): Retry strategy, Application + Applications, #5318 (#6864)
feat(ui): Retry strategy, Application + Applications, #5318 (#6864)

Signed-off-by: Victor Plakyda <plakyda1@gmail.com>
2021-08-09 17:26:31 -07:00
jannfis
3091bc5b6f docs: Update contributor docs (#6615)
* Sync

Signed-off-by: jannfis <jann@mistrust.net>

* docs: Update contributor docs

Signed-off-by: jannfis <jann@mistrust.net>

* New paragraph about code submission

Signed-off-by: jannfis <jann@mistrust.net>

* Update

Signed-off-by: jannfis <jann@mistrust.net>

* Update code submissions before triage paragraph

Signed-off-by: jannfis <jann@mistrust.net>
2021-08-09 12:15:21 +02:00
Saravanan Arumugam (Aswath)
810a977846 Added RightRev As the user's list. (#6929)
Added RightRev As the user's list.

Signed-off-by: Saravanan Arumugam (Aswath) <saravanan.a@rightrev.com>
2021-08-08 08:55:39 -07:00
jannfis
adade448a8 docs: Update security considerations (#6930)
* docs: Update security considerations

Signed-off-by: jannfis <jann@mistrust.net>

* docs: Update security considerations

Signed-off-by: jannfis <jann@mistrust.net>
2021-08-08 08:55:01 -07:00
jannfis
c22d8321cc docs: Update security contacts in security policy (#6928)
* docs: Update security contact

Signed-off-by: jannfis <jann@mistrust.net>

* docs: Update security contact

Signed-off-by: jannfis <jann@mistrust.net>

* docs: Update security contact

Signed-off-by: jannfis <jann@mistrust.net>
2021-08-07 17:58:21 -07:00
Daisuke Taniwaki
819225c709 fix: Set header to OIDC requests (#6869)
Signed-off-by: Daisuke Taniwaki <daisuketaniwaki@gmail.com>
2021-08-05 12:02:22 +02:00
Connor
dd50b88cd1 docs: Add documentation on using OIDC with Dex (#6904)
* docs: Add documentation on using OIDC with Dex

Signed-off-by: Connor Kelly <connor.r.kelly@gmail.com>

* docs: Add documentation on using OIDC with Dex -- fix typo

Signed-off-by: Connor Kelly <connor.r.kelly@gmail.com>

* Fix warning box for Dex OIDC group configuration knob

Signed-off-by: Connor Kelly <connor.r.kelly@gmail.com>
2021-08-05 11:57:18 +02:00
Alexander Matyushentsev
8b1c364f58 fix: application sync panel crashes if app has no sync options (#6914)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-04 16:56:08 -07:00
Yi Cai
d74ce38c8c fix: Reword Generate new token dialog (#6913)
Signed-off-by: ciiay <yicai@redhat.com>
2021-08-04 16:48:27 -07:00
Alexander Matyushentsev
826288f861 fix: assume ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS, ARGOCD_SERVER_REPO_SERVER_TIMEOUT_SECONDS env vars have seconds (#6912)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-04 13:51:16 -07:00
Yi Cai
e86c5ea17c fix: UI 6337 cluster filter improvement for issue #6337 (#6856)
* fix: when cluster field is bge-dev1, the applications with cluster dev1 is selected #6337

Signed-off-by: ciiay <yicai@redhat.com>
2021-08-04 13:05:49 -07:00
Noam Gal
f7614e0c4e fixed max to use MaxInt64 value (#6911)
Signed-off-by: Noam Gal <noam.gal@codefresh.io>
2021-08-04 11:07:54 -07:00
Chetan Banavikalmutt
2130c8a949 fix: unset command should remove env vars when there's no error (#6908)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-08-04 10:54:16 -07:00
pasha-codefresh
9d6ccee305 feat: rollback should work without id passed #6825. (#6877)
feat: rollback should work without id passed #6825. (#6877)

Signed-off-by: pashavictorovich <pavel@codefresh.io>
2021-08-04 10:51:54 -07:00
Remington Breeze
9c0495d9a3 fix: Add https prefix to ingress URLs if hosts field is present (#6901)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-04 09:33:41 -07:00
woshicai
ef653cac57 fix: client input arguments with equal sign (#6885)
Signed-off-by: Charles Cai <charles.cai@sap.com>

Co-authored-by: Charles Cai <charles.cai@sap.com>
2021-08-04 14:20:18 +02:00
Bob Claerhout
9099d0ba83 docs: Add replace description on individual resource level (#6905)
Signed-off-by: Bob Claerhout <claerhout.bob@gmail.com>
2021-08-04 14:14:21 +02:00
May Zhang
50b0010470 fix: logout redirect URL (#6903)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-08-03 17:05:58 -07:00
Alexander Matyushentsev
6b0d449997 refactor: update resources install order according to helm implementation (#6902)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-03 16:53:39 -07:00
Alexander Matyushentsev
c607a3b294 fix: controller should not create orphaned resources warning by default (#6898)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-03 16:05:19 -07:00
Alexander Matyushentsev
4fef2114fe feat: Improve Replace sync option description in UI (#6899)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-03 16:05:08 -07:00
dependabot[bot]
8c216ed7a8 chore(deps): bump tar from 6.1.0 to 6.1.3 in /ui (#6900)
Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.3.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.3)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-03 13:50:29 -07:00
Joseph Michael Casey
d404f0e425 docs(users): add Capital One (#6897) 2021-08-03 10:51:49 -07:00
Yi Cai
c5ebc584d0 fix: menu for application loses text when title area buttons collapse #6474 (#6887)
Signed-off-by: ciiay <yicai@redhat.com>
2021-08-03 10:06:12 -07:00
Remington Breeze
241a6fb1ba fix(ui): Bump argo-ui to hide filter suggestions on enter and show on typing (#6891)
* fix(ui): Bump argo-ui to hide filter suggestions on enter and show on typing

Signed-off-by: Remington Breeze <remington@breeze.software>

* remove unneccessary yarn.lock changes

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-03 09:34:07 -07:00
Remington Breeze
93e624d590 fix(ui): Add View Details option to resource actions menu (#6893)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-03 09:33:25 -07:00
Jan-Otto Kröpke
8f4e002ae4 fix: upgrade to kustomize 4.2.0 (#6861)
Signed-off-by: Jan-Otto Kröpke <joe@adorsys.de>
2021-08-03 09:24:22 -07:00
May Zhang
3abf8c6735 fix: add documentation for using argocd repocreds with --enable-coi and --type helm (#6890)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-08-03 10:48:20 +02:00
Jun
3ff8481694 feat: Rollback command support omit history id (#6863)
Signed-off-by: junnplus <junnplus@gmail.com>
2021-08-02 22:32:09 -07:00
Remington Breeze
0d23207c59 fix(ui): Incorrect path for non-namespaced resources (#6895)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-02 17:56:12 -07:00
balchua
fcd28b6eb1 docs: rename credit agricole to credit agricole CIB. (#6871)
* rename credit agricole to credit agricole CIB.

Signed-off-by: balchua <balchua@yahoo.com>

* fix semantic pr.

Signed-off-by: balchua <balchua@yahoo.com>
2021-08-02 12:29:54 -07:00
Remington Breeze
7e27d1072f fix(ui): Page navigation no longer visible with status bar (#6888)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-08-02 12:29:37 -07:00
Alexander Matyushentsev
1e5c763d6f fix: make sure orphaned filter checkbox is clickable (#6886)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-08-02 11:51:40 -07:00
woshicai
7fbf50493b fix: docs about custom image user #6851 (#6872)
* fix: docs about custom image user, change it from argocd to 999

Signed-off-by: Charles Cai <charles.cai@sap.com>

* update: docs for upgrading version

Signed-off-by: Charles Cai <charles.cai@sap.com>

Co-authored-by: Charles Cai <charles.cai@sap.com>
2021-08-02 11:43:01 -07:00
Geoffrey Huntley
f170d24ed1 docs(users): add gitpod (#6879)
Signed-off-by: Geoffrey Huntley <ghuntley@ghuntley.com>
2021-08-02 11:39:08 -07:00
Joe Bowbeer
bcfc112d82 docs: installation.md (#6860)
Signed-off-by: Joe Bowbeer <joe.bowbeer@gmail.com>
2021-07-30 15:57:17 -07:00
Yi Cai
66acd16bce fix: Project filter selector does not get unset upon clear filters #6750 (#6866)
Signed-off-by: ciiay <yicai@redhat.com>
2021-07-30 15:47:00 -07:00
Remington Breeze
bee20c2154 fix(ui): Prevent UI crash if app status or resources is empty (#6858) 2021-07-30 08:48:05 -07:00
Alexander Matyushentsev
17bef1c2c6 fix: util.cli.SetLogLevel should update global log level (#6852)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-29 13:01:38 -07:00
Alexander Matyushentsev
2abf284f81 fix: include cluster level RBAC into argocd-core manifests (#6854)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-29 12:49:06 -07:00
David Maciel
221d0c048d Fix #6567 Admin token now expires (#6846) 2021-07-29 11:19:53 -07:00
dependabot[bot]
cd9dcecccd chore(deps): bump glob-parent from 5.1.1 to 5.1.2 in /ui-test (#6848)
Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2.
- [Release notes](https://github.com/gulpjs/glob-parent/releases)
- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2)

---
updated-dependencies:
- dependency-name: glob-parent
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-29 11:18:57 -07:00
dependabot[bot]
52090425c6 chore(deps): bump ws from 7.4.1 to 7.5.3 in /ui-test (#6849)
Bumps [ws](https://github.com/websockets/ws) from 7.4.1 to 7.5.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.1...7.5.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-29 11:18:19 -07:00
Klaus Dorninger
228c465393 fix: #6844 multiple global projects can be configured (#6845)
Signed-off-by: Klaus Dorninger <github@dornimaug.org>
2021-07-29 11:01:52 -07:00
Keith Chong
4a69cce7b1 test: Add initial automated UI smoke tests (#4393) (#4694)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2021-07-29 10:11:11 -07:00
Alexander Matyushentsev
c7738a0cae fix: core installation must include CRD definitions (#6841)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-28 16:30:11 -07:00
Remington Breeze
369385388d fix(ui): Bump argo-ui version to fix autocomplete issues (#6836)
* fix(ui): Bump argo-ui version to fix autocomplete issues

Signed-off-by: Remington Breeze <remington@breeze.software>

* Remove unnecessary upgrades

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-28 14:55:24 -07:00
May Zhang
321a9734ec fix: Correct usage info for argocd account delete-token (#6831)
* Correct usage info for `argocd account delete-token`

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: Correct usage info for `argocd account delete-token`

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: Correct usage info for `argocd account delete-token`

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-07-28 13:40:39 -07:00
Alexander Matyushentsev
0c644e0df7 docs: add v2.1 changelog (#6834)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-28 13:34:13 -07:00
Alexander Matyushentsev
bd1390c182 fix: empty repo url should not crash UI (#6833)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-28 13:05:06 -07:00
Alexander Matyushentsev
ba5c300cc5 fix: argocd admin repo generate-spec should convert secret data (#6820)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-27 19:26:40 -07:00
Alexander Matyushentsev
1b99ce2bf3 refactor: rename Argo CD headless feature to Core (#6819)
* refactor: rename Argo CD headless feature to Core

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Apply reviewer notes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-27 16:36:13 -07:00
Kshama Jain
e1e0f27a7b feat: update rollout health check for Argo Rollouts v1.0 and v1.1 (#6380)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>

Co-authored-by: Jesse Suen <Jesse_Suen@intuit.com>
2021-07-27 10:00:20 -07:00
David Maciel
62104da946 Update link to Helm secrets (#6810)
The helm secrets link (https://github.com/futuresimple/helm-secrets) is pointing to the deprecated version of the tool. In their Deprecation notice (https://github.com/zendesk/helm-secrets#deprecation-information) they recommend moving to the maintained fork https://github.com/jkroepke/helm-secrets
2021-07-26 17:55:36 -07:00
Alexander Matyushentsev
d6a5d7700f fix: status bar rounding on applcition list page (#6811)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-26 17:08:25 -07:00
Tianchu Zhao
f1d740c4df docs(users): add woolworths,wooliesx (#6792)
Signed-off-by: Tianchu Zhao <evantczhao@gmail.com>
2021-07-26 14:58:47 -07:00
Alexander Matyushentsev
fb357defe3 feat: support --inline flag in 'argocd admin app/proj generate-spec' commands (#6804)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-26 14:58:13 -07:00
Alexander Matyushentsev
75a5f79ed2 fix: reduce filters panel width (#6809)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-26 14:54:53 -07:00
RoCha
8c973a40e3 docs: Change load_restrictor none to LoadRestrictionsNone (#6806)
Signed-off-by: Romain Chalumeau <rchalumeau@magicleap.com>
2021-07-26 13:31:34 -07:00
saprette
30ede1c4bf fix: Webhook does not trigger refresh when using target revision format refs/heads/<branch name> (#6800)
* fix: [#6785] Webhook does not trigger refresh when using target revision format refs/heads/<branch name>

Signed-off-by: Samuel Prette <samuel.prette@clearstream.com>

* fix: Update tests for [#6785] fix

Signed-off-by: Samuel Prette <samuel.prette@clearstream.com>
2021-07-26 12:47:34 -07:00
Jan Jansen
af516e9f0d chore: pre filter groups before enforcing #4296 (#6651)
* chore: pre filter groups before enforcing

Part of: #4296

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>

* chore: prevent serialization if it is a mapclaims

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>

* add comments

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>
2021-07-26 11:11:36 -07:00
Alexander Matyushentsev
c3abe77bd5 fix: Cannot read property 'forEach' of undefined (#6803)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-26 10:36:50 -07:00
Daniel Galán y Martins
02bf2bfc20 docs: Add Joblift to USERS (#6807)
Signed-off-by: Daniel Galán y Martins <git@galan.de>
2021-07-26 10:27:20 -07:00
Alexander Matyushentsev
f66a38875b refactor: enhance application resources filter panels (#6793)
* refactor: enhance application resources filter panels

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* use fixed position for resources filter on application details page

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-22 21:54:24 -07:00
Alexander Matyushentsev
7c3c3528b6 fix: copy ui assets into correct dist directory during image build (#6790)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-22 16:02:58 -07:00
Remington Breeze
eff2d2f816 feat(ui): Relocate resource filters (#6777)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-22 13:08:25 -07:00
Remington Breeze
84c70b776a fix(ui): Allow filters in input that are not listed in suggestions (#6788)
* fix(ui): Allow filters in input that are not listed in suggestions

Signed-off-by: Remington Breeze <remington@breeze.software>

* Add back accidentally removed line

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-22 13:02:07 -07:00
Alexander Matyushentsev
e68618d168 fix: add incorrectly removed --staticassets flag (#6778)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-22 08:37:04 -07:00
Alexander Matyushentsev
6262a8c750 feat: merge argocd-util into 'argocd admin' subcommand (#6773)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-21 17:00:49 -07:00
Alexander Matyushentsev
e058bc4228 chore: remove '-i' parameter from docker run command (#6776)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-21 13:49:10 -07:00
Alexander Matyushentsev
082e66bd5b chore: fix broken dev image build (#6775)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-21 13:34:14 -07:00
Avishai Carmel
ba221b9cee Users: add Lightricks (#6772) 2021-07-21 13:16:41 -07:00
Eldar Yusupov
2497679dcb feat: Add Redis SSL support. Fixes #4688 (#6742)
* feat: Add Redis SSL support

Signed-off-by: Eldar Yusupov <eyusupov@gmail.com>
2021-07-21 10:07:24 -07:00
Florian Hopfensperger
5f5f0285e9 fix: Static path for UI (#6769)
Signed-off-by: Florian Hopfensperger <florian.hopfensperger@de.ibm.com>
2021-07-21 09:37:45 -07:00
Alexander Matyushentsev
561452ac94 feat: Headless Argo CD (aka GitOps Agent) (#6361)
* feat: add --headless flag to Argo CD CLI command

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* docs: add headless installation manifests and documentation

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Apply reviewer notes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Remove port forwarding logs

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-20 21:51:36 -07:00
Remington Breeze
d7a8a877ad feat: Add API server capability to serve UI extensions from shared dir (#6766)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-20 16:50:00 -07:00
Regina Scott
9c690a10e2 WIP: add status bar to applications list, issue #6275 (#6710)
Signed-off-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Regina Scott
2021-07-20 14:55:43 -07:00
Alexander Matyushentsev
03dcff6659 fix: fix broken Test_nativeHelmChart_ExtractChart_insecure test (#6765)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-20 11:04:40 -07:00
Pieter van der Meer
3220b7613d fix: add insecure-skip-tls-verify on helm pull when Creds.InsecureSkipVerify is set to true (#6458)
* add "--insecure-skip-tls-verify" on helm pull when Creds.InsecureSkipVerify is set to true

* Requested change of alax

Co-authored-by: Pieter van der Meer <Pieter@dataworkz.nl>
2021-07-20 09:37:07 -07:00
Abhinav Sonkar
fbe2649857 docs: Add Axual (#6714)
* Add Axual

Signed-off-by: Abhinav Sonkar <abhinav@axual.com>

* Add alphabetically

Signed-off-by: Abhinav Sonkar <abhinav@axual.com>

Co-authored-by: Abhinav Sonkar <abhinav@axual.com>
2021-07-19 18:48:08 -07:00
Alexander Matyushentsev
c33e850d38 fix: argocd-server crashes due to nil pointer dereference (#6757)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-19 18:16:10 -07:00
Alexander Matyushentsev
b627435996 fix: TypeError: Cannot read property 'group' of undefined (#6755)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-19 16:51:38 -07:00
Alexander Matyushentsev
e251b14d6b fix: The UI crashes when trying to access some application with an empty commit message (#6756)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-19 16:51:18 -07:00
Alexander Matyushentsev
58ac345f2b feat: support managing cluster resources in a namespaced mode (#6581)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-19 11:58:58 -07:00
Remington Breeze
ef744e3c15 feat(ui): Persist visibility of apps list filters in local storage (#6748)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-19 11:00:51 -07:00
Alexander Matyushentsev
a9a69b74c9 docs: Argo CD Headless proposal (aka GitOps Agent) (#6385)
* docs: Argo CD Headless proposal (aka GitOps Agent)

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-19 10:39:09 -07:00
ZymoticB
e17565ae81 fix: allow argocd-notification ingress to repo-server (#6746)
* Allow argocd-notification ingress to repo-server

This change allows an argocd-notification installation using the provided
manifests to ingress to the repo-server.

I am not sure if there is a prevailing opinion about how to manage a
cross project network policy for these related components so I thought
I would put up a PR to spark that discussion. This could live in a separate
NetworkPolicy object managed by the argocd-notifications manifests but I
thought it wuold be better for the possible ingresses for the argocd project
to all live in the argo-cd manifests. I know that notifications are an optional
component, so maybe this is better provided as a separate manifest that can
be strategic merged in? (I am a kustomize user).

Regardless, I think this policy is something that be maintained by argoproj
in some form to reduce release burden of users trying to hand maintain network
policies.

Signed-off-by: Tyler Dixon <tdixon@buf.build>

* make manifests

Signed-off-by: Tyler Dixon <tdixon@buf.build>
2021-07-16 13:59:30 -07:00
jannfis
1838fc0587 chore: Include k8s v1.21 in e2e test, drop v1.16 (#6716)
Signed-off-by: jannfis <jann@mistrust.net>
2021-07-16 09:43:08 -07:00
Nabil BENDAFI
90bacef5bb feat: allow argocd-cm to reference K8S Secrets (#4188) (#4342)
* feat: allow argocd-cm to reference K8S Secrets

Signed-off-by: Nabil BENDAFI <nbendafi@yseop.com>
2021-07-16 09:40:16 -07:00
Viktor Farcic
2ca14c6310 docs: Yet another ArgoCD-related video (#6730)
Signed-off-by: Viktor Farcic <viktor@farcic.com>
2021-07-16 09:17:44 -07:00
Yuan Tang
af7f3fbd48 docs: Add Alibaba Group to USERS.md (#6740)
* docs: Add Alibaba Group to USERS.md

Signed-off-by: Yuan Tang <terrytangyuan@gmail.com>
2021-07-16 09:15:35 -07:00
rohanmathure
30d2ba1f1c docs: Add chime as a user (#6725)
Signed-off-by: Rohan Mathure <rohan.mathure@chime.com>
2021-07-14 21:01:55 -07:00
Alex Collins
2b3601cfa3 feat(ui): Adds resource filter panel. Fixes #6379 #6331 #6081 (#6717)
Signed-off-by: Alex Collins <alex_collins@intuit.com>
2021-07-14 16:01:12 -07:00
Yi Cai
1b46143d07 fix: Cluster filter is broken on applications list page #6616 (#6715)
Signed-off-by: ciiay <yicai@redhat.com>
2021-07-14 21:00:19 +02:00
jannfis
3bba77c36f chore: Skip cluster e2e tests if already run (#6705)
* chore: Skip cluster e2e tests if already run

Signed-off-by: jannfis <jann@mistrust.net>

* Use defer to record test run

Signed-off-by: jannfis <jann@mistrust.net>
2021-07-13 19:19:48 +02:00
Josh Soref
1602ec992d chore: Spelling (#5373)
* spelling: across

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: anyway

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: assessment

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: attribute

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: crlf

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: cmux

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: committed

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: convenience

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: does-not

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: e.g.

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: fall back

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: fall back to

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: then ... falls back

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: formatted

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: github

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: gitlab

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: gitops

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: health checks

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: located

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: logging

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: oidc

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: openshift

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: os

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: powershell

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: preferred

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: redact

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: repo

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: similarly

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: staging

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: statefulset

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: stopped

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: superseded

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: synchronization

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: to

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: unified

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: verification

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: zookeeper

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
2021-07-13 19:02:03 +02:00
Alexander Matyushentsev
45fbca510b docs: document health statuses in custom health checks (#6692)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-13 08:56:52 +02:00
Nico Ring
c8eab2c15d fix: correct type of Service for AWS ALB ingress (#6511)
Signed-off-by: Nico Ring <ringnico@web.de>
2021-07-13 08:56:06 +02:00
Alexander Matyushentsev
083390ef87 fix: downgrade normalize-url to avoid crash in safari (#6703)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-12 13:51:01 -07:00
Saumeya Katyal
d6dd6afd05 build: Upgrade npm dependencies to remove vulnerablities (#6700)
Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-07-12 09:54:18 -07:00
xuhrc
9a788c3470 fix: label selector is useless when name variable is not set (#5975)
when name variable is empty, the label selector is useless.

Signed-off-by: stanhrxu <stanhrxu@tencent.com>
2021-07-12 09:26:00 -07:00
Alexander Matyushentsev
dec710e8cb fix: download Pod Logs button not honouring argocd-server rootpath (#6548) (#6627)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-12 09:09:31 -07:00
Denis Krivenko
2693b5480e feat: Implement MinIO Tenant CRD health check (#6509)
* feat: Implement MinIO Tenant CRD health check

Signed-off-by: dnskr <dnskrv88@gmail.com>

* feat: Replace 'Unknown' and 'Missing' health check statuses with 'Progressing' for MinIO Tenant CRD

Signed-off-by: dnskr <dnskrv88@gmail.com>

Co-authored-by: Denis Krivenko <dnskrv88@gmail.com>
2021-07-11 14:18:33 -07:00
Saumeya Katyal
da3f21b62d fix: Version warning banner in docs (#6682)
Signed-off-by: saumeya <saumeyakatyal@gmail.com>

add side-bar media queries

removed extra comments

Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-07-11 10:23:28 +02:00
Alexander Matyushentsev
17d698d77f chore: stop publishing documentation to github pages (#6688)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-10 10:28:17 +02:00
Yi Cai
5f5b788202 fix: pods Tooltip runs offscreen #5481 (#6685)
Signed-off-by: ciiay <yicai@redhat.com>
2021-07-09 15:55:01 -07:00
Yi Cai
040202e7d0 fix: [#5462] ArgoCD UI External links dropdown caret positioned incorrectly in list view (#6668)
* fix: #5462 ArgoCD UI External links dropdown caret positioned incorrectly in list view

Signed-off-by: ciiay <yicai@redhat.com>

* fix: minor uddaptes to fix eslint error

Signed-off-by: ciiay <yicai@redhat.com>
2021-07-09 23:02:48 +02:00
Balazs Zachar
7e68b1ef71 feat: add custom resource health checks for trident.netapp.io/TridentOrchestrator and trident.netapp.io/TridentBackendConfig (Closes [ISSUE #6550]) (#6552)
* feat: add custom resource health checks for trident.netapp.io/TridentOrchestrator and trident.netapp.io/TridentBackendConfig

Signed-off-by: Balazs Zachar <zachar.balazs@gmail.com>

* feat: extend TridentOrchestrator check with degraded state (based on official documentation)

Signed-off-by: Balazs Zachar <zachar.balazs@gmail.com>
2021-07-08 18:39:23 -07:00
Remington Breeze
abdb4c0679 fix(ui): Add retry button to filters that failed to load (#6630)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-08 18:11:26 -07:00
Remington Breeze
0ff1ec511a fix(ui): Autocomplete menu did not change direction when not enough room (#6629)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-07-08 18:10:50 -07:00
jannfis
8030f4202a chore: Update Golang builder to 1.16.5 (#6653)
* chore: Update Golang builder to 1.16.5

Signed-off-by: jannfis <jann@mistrust.net>

* Use variables to refer to Go version in workflows

Signed-off-by: jannfis <jann@mistrust.net>
2021-07-08 12:35:06 +02:00
jannfis
b893eccea0 chore: Update container base image to Ubuntu 21.04 (#6652)
Signed-off-by: jannfis <jann@mistrust.net>
2021-07-07 21:08:21 +02:00
Yujun Zhang
e0db23b63d feat: make http client retryable (#6632)
Signed-off-by: Yujun Zhang <zhangyujun@gmail.com>
2021-07-06 12:12:51 +02:00
Takuma Kume
ef7ee088f5 feat: Supported set metadata annotations with argocd-util app generate-spec command (#6633)
* feat: Supported set metadata annotations with `argocd-util appgenerate-spec` command

Signed-off-by: takumakume <takuma.kume@pepabo.com>

* docs: Added `--annotations` option of `argocd-util app generate-spec` command

Signed-off-by: takumakume <takuma.kume@pepabo.com>

* fix: `--annotations` option changes the `.metadata` section, so change it to the appropriate place

Signed-off-by: takumakume <takuma.kume@pepabo.com>

* docs: Added `--annotations` option of `argocdapp create` command

Signed-off-by: takumakume <takuma.kume@pepabo.com>

* fix: set an empty value if there is no `=` in `--annotations`

Signed-off-by: takumakume <takuma.kume@pepabo.com>

* docs: added an example `--annotations` are `=` delimited

Signed-off-by: takumakume <takuma.kume@pepabo.com>
2021-07-06 12:11:48 +02:00
Shyukri Shyukriev
8cecf1eee6 docs: add MariaDB (#6638)
Signed-off-by: Shyukri Shyukriev <shyukri.shyukriev@mariadb.com>
2021-07-06 09:37:46 +02:00
Alexander Matyushentsev
f12650c32b fix: Application list page filter counts are confusing (#6625) (#6626)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-02 17:02:34 -07:00
Saumeya Katyal
ba4c65540b fix: Modify column size for Count field (#6611)
Signed-off-by: saumeya <saumeyakatyal@gmail.com>
2021-07-02 23:09:34 +02:00
Alexander Matyushentsev
2ab10516be refactor: use git+https://github.com/argoproj/argo-ui.git instead of argo-ux npm package (#6622)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-02 14:00:37 -07:00
dependabot[bot]
7149e35822 chore(deps): bump prismjs from 1.23.0 to 1.24.0 in /ui (#6609)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.23.0 to 1.24.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.23.0...v1.24.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-01 09:26:21 -07:00
dependabot[bot]
e59ed2208f chore(deps): bump color-string from 1.5.3 to 1.5.5 in /ui (#6610)
Bumps [color-string](https://github.com/Qix-/color-string) from 1.5.3 to 1.5.5.
- [Release notes](https://github.com/Qix-/color-string/releases)
- [Changelog](https://github.com/Qix-/color-string/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Qix-/color-string/commits/1.5.5)

---
updated-dependencies:
- dependency-name: color-string
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-01 08:57:54 -07:00
Alexander Matyushentsev
8b40f96584 docs: document Argo CD development process (#6546)
docs: document Argo CD development process (#6546)

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-07-01 08:55:07 -07:00
Regina Scott
6d1b789b53 fix: remove deprecated css function (#6607)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-07-01 08:54:44 -07:00
Remington Breeze
2a41018756 feat(ui): Improved applications list filters (#6091)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-06-30 17:29:22 -07:00
Alexander Matyushentsev
9f1af587ee refactor: upgrade gitops engine (#6578) (#6606)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-30 14:44:23 -07:00
Jonathan West
4a4b43f1d2 fix: unable to delete an Application if its target cluster is deleted, Argo CD enters infinite app deletion reconciliation loop (#6557)
Signed-off-by: Jonathan West <jonwest@redhat.com>
2021-06-29 16:32:21 -04:00
dependabot[bot]
5bd2f61c56 chore(deps): bump color-string from 1.5.3 to 1.5.5 in /ui (#6586)
Bumps [color-string](https://github.com/Qix-/color-string) from 1.5.3 to 1.5.5.
- [Release notes](https://github.com/Qix-/color-string/releases)
- [Changelog](https://github.com/Qix-/color-string/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Qix-/color-string/commits/1.5.5)

---
updated-dependencies:
- dependency-name: color-string
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-29 09:43:09 -07:00
jannfis
1d0b5fc7ec docs: Update security policy (#6593)
Signed-off-by: jannfis <jann@mistrust.net>
2021-06-29 07:52:56 -07:00
jannfis
76632d927e chore: Upgrade golang dependencies to latest versions (#6592)
Signed-off-by: jannfis <jann@mistrust.net>
2021-06-29 07:52:43 -07:00
dependabot[bot]
9b867ff075 chore(deps): bump prismjs from 1.23.0 to 1.24.0 in /ui (#6584)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.23.0 to 1.24.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.23.0...v1.24.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-28 14:29:53 -07:00
Chetan Banavikalmutt
f81ed952cb feat: add proxy field to repository create form (#6565)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-06-28 14:26:24 -07:00
Alexander Matyushentsev
ef910c8458 fix: argocd-util generate-spec should not print argocd-cm ConfigMap (#6582)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-28 13:19:03 -07:00
jannfis
e5d9c39308 chore: Fix some annoyances when running locally (#6576)
Signed-off-by: jannfis <jann@mistrust.net>
2021-06-28 20:54:26 +02:00
Marcio Ribeiro
46418f7a45 docs: Add Boticario and Beleza na Web To users (#6569)
Add Boticario and Beleza na Web To users
2021-06-28 09:39:11 -07:00
mitreangjelkoski
379298337f docs: Added Chargetrip as official users of ArgoCD (#6579)
Optional. My organization is added to USERS.md.
2021-06-28 09:38:56 -07:00
jannfis
d47f466198 fix: Allow gRPC connections from gRPC versions >1.17.x (#6577)
* fix: Allow gRPC connections from gRPC versions >1.17.x

Signed-off-by: jannfis <jann@mistrust.net>

* Use correct muxer for matching

Signed-off-by: jannfis <jann@mistrust.net>
2021-06-28 08:02:11 +02:00
jannfis
f74d8072c5 chore: Remove deprecated go build flag -i from protogen (#6571)
Signed-off-by: jannfis <jann@mistrust.net>
2021-06-25 18:31:43 +02:00
Xavi Torelló
0e9aa8e6b6 docs: Use latest GH release to avoid extra curl (#6556) 2021-06-25 11:39:09 +02:00
Vladyslav Miletskyi
ce1bcb3e4b docs: link docs about different PrunePropagationPolicy values (#6555)
This part of the documentation is not clear enough. It takes a lot of digging to actually find a clear explanation of what those policies are bringing to the end-user.

Source: https://github.com/argoproj/argo-cd/discussions/6239
Signed-off-by: Miletskyi Vladyslav <vladyslav.miletskyi@eu.equinix.com>
2021-06-24 16:51:47 +02:00
Jan Gräfen
ee8393dba5 docs: Add Generali Deutschland AG to users (#6542)
Signed-off-by: Jan Gräfen <223234+jangraefen@users.noreply.github.com>
2021-06-23 23:00:11 +02:00
Jan Gräfen
33a8d80a42 chore: Remove unneeded secret type check (#6543)
Signed-off-by: Jan Gräfen <223234+jangraefen@users.noreply.github.com>
2021-06-23 13:28:34 -07:00
Jan Gräfen
a80656d345 docs: Add missing documentation for repository secrets (#6540)
docs: Add missing documentation for repository secrets (#6540)

Signed-off-by: Jan Gräfen <223234+jangraefen@users.noreply.github.com>
2021-06-23 12:26:16 -07:00
Jan Gräfen
4d9e8bc2e6 feat: Repository Configuration as Secrets (#6103)
feat: Repository Configuration as Secrets (#6103)

Signed-off-by: Jan Gräfen <223234+jangraefen@users.noreply.github.com>
2021-06-23 10:46:43 -07:00
Benjamin Henrion
31be4d8f19 chore: container did not support setting the timezone via an env var like '-e TZ=Europe/Brussels'; Solution: adding tzdata package solve this issue (#6481)
Signed-off-by: Benjamin Henrion <zoobab@gmail.com>
2021-06-23 19:42:41 +02:00
Alexander Matyushentsev
6736a3d7d7 fix: EKS Clusters Broken Due To ReadOnly Filesystem (#6504)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-23 19:41:22 +02:00
Zadkiel
63eb5de233 docs: fix typo in declarative setup (#6536)
Signed-off-by: zadkiel <hello@zadkiel.fr>
2021-06-23 09:01:18 -07:00
Alexander Matyushentsev
9815490edb fix: WebUI failure when loading pod view 't.parentRefs is undefined' (#6490) (#6535)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-22 18:20:54 -07:00
Alexander Matyushentsev
766a7ba2b1 fix: Aggregated pod logs viewer is broken (#6329) (#6534)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-22 18:14:55 -07:00
RoCha
7d32c2735a chore: Correct path to resource_customizations in TestLuaHealthScript (#6499)
Signed-off-by: Romain Chalumeau <rchalumeau@magicleap.com>
2021-06-22 17:20:32 -07:00
Antonin Bas
4ae5cdf7a4 fix: typo in networkPolicy definition in manifests (#6532)
Unless the argocd-dex-server-network-policy NetworkPolicy was meant to
authorize ALL TCP traffic, which seems unlikely, this is a typo.

Signed-off-by: Antonin Bas <abas@vmware.com>
2021-06-22 15:37:04 -07:00
Subba Reddy Veeramreddy
7f5c0142ff feat: Ignore preserveUnknownFields in Diff from CRD Spec (#6503)
Signed-off-by: Subba Reddy Veeramreddy <subbareddyv.uoh@gmail.com>
2021-06-22 09:58:15 -07:00
Chetan Banavikalmutt
c5b8aa765c docs: Add chetan as a reviewer (#6524)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-06-22 09:15:30 -07:00
Henrik Blixt
1593f8d797 docs: add hblixt as reviewer (#6519)
* docs: add hblixt as reviewer

As per 6/21 meeting, proposed and accepted as reviewer.
Thanks for the confidence, looking forward to contributing even more!

* docs: re-add ishitasequeira
2021-06-21 15:04:36 -07:00
Ishita Sequeira
f3b79aef25 chore: Add ishitasequeira as a reviewer (#6518)
Signed-off-by: Ishita Sequeira <isequeir@redhat.com>

Co-authored-by: jannfis <jann@mistrust.net>
2021-06-21 13:30:15 -07:00
Alexander Matyushentsev
c4f69ac144 refactor: upgrade rxjs version (#6515)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-21 13:13:38 -07:00
Regina Scott
dff84a7d95 docs: Add reginapizza as a reviewer (#6517)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-06-21 22:00:52 +02:00
Josh Soref
bf9622a2c4 docs: simplify declarative setup (#6487)
* Split different kinds of objects
* Remove some legacy content
* Some wording fixes

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-06-21 12:38:29 +02:00
Alexander Matyushentsev
2541fa0332 refactor: upgrade gitops engine (argoproj/gitops-engine/#286) (#6491)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-17 12:06:18 -07:00
Remington Breeze
0f6c1ab01e docs: Argo CD Extensions proposal (#6240)
Signed-off-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Jesse Suen <jessesuen@users.noreply.github.com>
2021-06-17 10:02:55 -07:00
Alexander Matyushentsev
170b657a79 docs: update 2021 roadmap (#6386)
* docs: update 2021 roadmap

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Apply reviewer notes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-17 08:48:51 -07:00
Chetan Banavikalmutt
9476ab5e18 feat: add first class support to access repositories using proxy (#5581) (#6286)
* feat: add first class support to access repositories using proxy

Currently, users need to set the proxy URLs as env variables in the repo server. This is not user-friendly and also error-prone. This PR adds support to maintain proxy URLs along with repository configs in the argocd-cm. Argo CD uses this proxy to access your repository. In case the custom proxy is absent, it defaults to reading the proxy from the env variables.

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* set both http & https proxy variables

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-06-16 14:45:10 +02:00
Alexander Matyushentsev
e58d94f430 refactor: upgrade gitops engine (argoproj/gitops-engine/#286) (#6478)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-15 12:23:42 -07:00
Alexander Matyushentsev
2c966f24a5 fix: app hard refresh should refresh cached app details (#6463)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-15 11:48:14 -07:00
Zadkiel
15a3c29b01 docs: use jq path expression to ignore differences to caBundle mutating webhook (#6470)
Signed-off-by: zadkiel <zadkiel_aharonian@carrefour.com>
2021-06-15 09:34:48 -07:00
veithammerstingl
4485025d86 Included BMW Group as Users (#6476) 2021-06-14 18:54:02 -07:00
jannfis
a647ca960a fix: Update redis to 6.2.4 (#6475)
Signed-off-by: jannfis <jann@mistrust.net>
2021-06-14 18:44:39 -07:00
amitde69
c62012d526 Update USERS.md (#6466) 2021-06-12 16:56:58 -07:00
Yujun Zhang
a0f887e854 fix: unset --plugin-env should return OK when not found (#6457)
Signed-off-by: Yujun Zhang <zhangyujun@gmail.com>
2021-06-12 12:58:18 -07:00
balchua
e415d6ee90 docs: Add Crédit Agricole CIB to list of production users. (#6465)
* add ca-cib to production users.

Signed-off-by: balchua <balchua@yahoo.com>

* fix sematic pr.

Signed-off-by: balchua <balchua@yahoo.com>
2021-06-12 10:38:20 +02:00
Amit Rout
6f959506ab docs: Argo CD installation manifest file to run test against a real cluster (#6311)
* docs: Argo CD installation manifest file to run test against a real cluster

Signed-off-by: arout <arout@redhat.com>

* Use more expressive sentence

Signed-off-by: arout <arout@redhat.com>
2021-06-11 09:43:59 +02:00
Alexander Matyushentsev
fba25d8229 fix: prevent 'cannot read property "filter" of undefined' during nodes filtering (#6453)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-10 15:47:43 -07:00
Alexander Matyushentsev
2da0e81b05 fix: missing live resources without a health check should not affect application health (#6446)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-10 13:29:22 -07:00
Ishita Sequeira
f533ed17f0 feat: simplify parametrization of Argo CD server processes (#6328)
feat: simplify parametrization of Argo CD server processes  (#6328)

Signed-off-by: Ishita Sequeira <isequeir@redhat.com>
2021-06-10 13:03:47 -07:00
David Schneider
aa86dbabbf Fix documentation for TLS configuration (#6448)
Correct the header for "Inbound TLS options for argocd-repo-server"
2021-06-10 10:35:42 -07:00
Josiah Wolf Oberholtzer
af338ddd80 feat: Support Kustomize --force flags (#6443)
Signed-off-by: Josiah Oberholtzer <josiah.oberholtzer@gmail.com>
2021-06-09 10:16:43 -07:00
Alexander Matyushentsev
e865504a98 fix: re-use same http transport in grpc proxy to avoid goroutine leak (#6444)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-09 10:15:56 -07:00
jannfis
1f9fc2cc53 fix: Fail gracefully when unable to unmarshal cluster secret (#6427)
* fix: Fail gracefully when unable to unmarshal cluster secret

Signed-off-by: jannfis <jann@mistrust.net>

* Do not log error details

Signed-off-by: jannfis <jann@mistrust.net>

* Do not return invalid clusters on list

Signed-off-by: jannfis <jann@mistrust.net>

* Additional test

Signed-off-by: jannfis <jann@mistrust.net>
2021-06-09 14:23:09 +02:00
dependabot[bot]
8c9674b272 chore(deps): bump ws from 5.2.2 to 5.2.3 in /ui (#6436)
Bumps [ws](https://github.com/websockets/ws) from 5.2.2 to 5.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/5.2.2...5.2.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-08 20:25:05 -07:00
Miguel A. Alvarado V
2f9683aac7 docs: adding "repository.credentials" to argocd-cm.yaml (#6435)
for pairity with what's in declarative-setup.md

Signed-off-by: Miguel A. Alvarado V <alvaradoma@gmail.com>
2021-06-08 16:10:40 -07:00
Alexander Matyushentsev
3dd5dc44ac fix: repo-server should reset manifests cache when k8s version/api versions change (#6434)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-08 16:10:24 -07:00
Alexander Matyushentsev
c618c1fc76 docs: move initial password instructions for v1.9+ to get top (#6307)
* docs: move initial password instructions for v1.9+ to get top

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-08 15:31:44 -07:00
Alexander Matyushentsev
9adba69e88 feat: disable reconciliation if timeout.reconciliation is set to 0 (#6406)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-08 08:57:05 -07:00
Alexander Matyushentsev
faba995bd7 chore: regenerate manifests using codegen (#6422)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-07 12:13:45 -07:00
Alexander Matyushentsev
124cc8a07e chore: pin mkdocs version to fix docs build (#6421)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-07 10:53:37 -07:00
Alexander Matyushentsev
33d691eccd fix: allows access to dex metrics from any pod (#6420)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-07 10:42:09 -07:00
Carlos Montemuino
f2093ecbf3 docs: add Glovo to users (#6416)
Signed-off-by: Carlos Montemuiño <carlos.montemuino@glovoapp.com>
2021-06-07 09:29:34 -07:00
Saleh Almatrafi
12c95d64a7 add Tamkeen Technologies to the USERS (#6408)
Co-authored-by: Saleh Almatrafi <s.almatrafi@tamkeentech.sa>
2021-06-06 10:14:49 -07:00
Dean Lindqvist Todevski
e729acd075 Update USERS.md (#6398)
* Update USERS.md

Add Zimpler to users.
2021-06-04 16:14:08 -07:00
Miguel A. Alvarado V
e444575c15 fix: Update rbac.md for typo (#6392)
Fixing what seems like a typo

Signed-off-by: Miguel A. Alvarado V <miguel@caylent.com>
2021-06-04 14:18:24 -07:00
Alexander Matyushentsev
2eb6b3bf80 fix: add client side retry to prevent 'transport is closing' errors (#6402)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-04 11:57:04 -07:00
Leah
abb0c4b260 feat: allow substitutions in plugin env variables (#6097)
* feat: allow substitutions in plugin env variables

Signed-off-by: Leah <github.leah@hrmny.sh>

* allow all variables

Signed-off-by: Leah <github.leah@hrmny.sh>

* add docs

Signed-off-by: Leah <github.leah@hrmny.sh>

* better phrasing

Signed-off-by: Leah <github.leah@hrmny.sh>

* add generic error to env var parsing

Signed-off-by: Leah <github.leah@hrmny.sh>
2021-06-04 19:11:09 +02:00
Kshama Jain
c3b12202d7 docs: enhancement proposal for config management plugin v2 (#5927)
docs: enhancement proposal for config management plugin v2 (#5927)

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-06-04 09:08:51 -07:00
Felipe Romani
118c298752 WSpot adopt (#5575)
Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-04 09:08:29 -07:00
Jake Utley
86d0ee6982 feat: allow jq path expressions in diffing customizations (#4320) (#6109)
* Add jqPathExpression field and implementation for ignoreDifferences

Signed-off-by: Jake Utley <jutley@hiya.com>

* Add a couple tests for jqPathExpression

Signed-off-by: Jake Utley <jutley@hiya.com>

* Add JQPathExpressions into relevant types in types.go

Signed-off-by: Jake Utley <jutley@hiya.com>

* Add documentation for jq path expressions

Signed-off-by: Jake Utley <jutley@hiya.com>

* Add Hiya to USERS.md

Signed-off-by: Jake Utley <jutley@hiya.com>

* Update generated code

Signed-off-by: Jake Utley <jutley@hiya.com>

* Do not require jsonPointers or jqPathExpressions

Signed-off-by: Jake Utley <jutley@hiya.com>

* Fix some linting issues

Signed-off-by: Jake Utley <jutley@hiya.com>

* Add test for valid jq that produces error

Signed-off-by: Jake Utley <jutley@hiya.com>

* Add test to correctly parse jqPathExpressions from split key configs

Signed-off-by: Jake Utley <jutley@hiya.com>

* regen

Signed-off-by: Jake Utley <jutley@hiya.com>
2021-06-03 22:06:55 -07:00
Kshama Jain
2ba6223b6c feat: update app informer to avoid stale cache (#6372)
feat: update app informer to avoid stale cache (#6372)

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-06-03 15:40:35 -07:00
Remington Breeze
16349b8819 fix(ui): Show orphaned resources option in list view did not work (#6171)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-06-03 14:14:21 -07:00
LucasBoisserie
bffdd0b6f3 fix: Update documentation Argocd app CRD health with app of apps (#6281)
fix: Update documentation Argocd app CRD health with app of apps (#6281)

Signed-off-by: LucasBoisserie <lucas.boisserie@gmail.com>
2021-06-03 10:46:09 -07:00
Remington Breeze
e9ce61d662 fix(ui): resize pod groups with large number of pods (#6382)
* fix(ui): resize pod groups with large number of pods

Signed-off-by: Remington Breeze <remington@breeze.software>

* Remove comments

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-06-02 15:35:51 -07:00
Jared Clarke
d6f579b8f6 feat: Add the ability to change user password in the UI (#5444)
* feat: Add the ability to change user password

Signed-off-by: Jared Clarke <jared.clarke@eckoh.com>
2021-06-02 15:26:16 -07:00
Remington Breeze
f43a6ad2aa fix(ui): Crash on application pod view (#6384)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-06-02 14:19:15 -07:00
Alexander Matyushentsev
3fbe818bea docs: add project scoped repositories and clusters proposal (#6065)
* docs: add project scoped repositories and clusters proposal

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-06-01 11:45:56 -07:00
Nabil BENDAFI
dfa5fef8c6 docs: typo (#6367)
Signed-off-by: Nabil BENDAFI <nbendafi@yseop.com>
2021-06-01 04:21:33 -04:00
Josh Soref
701bc5b709 docs: reword change initial password advice (#6356)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-05-31 17:32:49 -07:00
jannfis
0f6a7d5f34 feat: Upgrade Helm to v3.6.0 and pass --kube-version to templating (#6359)
Signed-off-by: jannfis <jann@mistrust.net>
2021-05-29 08:46:16 +02:00
Aikawa
e44fa434ab fix: use current logrus config when logrus is created internally (#6234) (#6301)
fix: use current logrus config when logrus is created internally (#6234) (#6301)
Signed-off-by: yu-croco <yuki.kita22@gmail.com>
2021-05-28 16:27:57 -07:00
Huanxin Hu
e3392eeb57 fix: applications list filter do not filter out the exactly cluster name (#6340)
Signed-off-by: Huanxin Hu <huanxin.hu@bytedance.com>

Co-authored-by: Huanxin Hu <huanxin.hu@bytedance.com>
2021-05-28 14:32:28 -07:00
jannfis
4a3c94b20c chore: Update Golang to v1.16.4 (#6358)
Signed-off-by: jannfis <jann@mistrust.net>
2021-05-28 19:06:06 +02:00
jannfis
2a7745b41b chore: Remove deprecated -i from go build flags (#6355)
Signed-off-by: jannfis <jann@mistrust.net>
2021-05-28 17:19:49 +02:00
Alexander Matyushentsev
e23f3f495d fix: avoid possible nip pointer dereference during syncing (#6354)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-28 07:25:35 -07:00
Alexander Matyushentsev
1708a7154d feat: add 'argocd-util cluster shards' command that prints shards statistics (#6353)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-27 15:37:55 -07:00
Kshama Jain
a6d04469c5 fix: logout redirect URL (#6347)
* fix logout redirect url

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-05-27 13:02:06 -07:00
Alexander Matyushentsev
3604a588bb refactor: upgrade k8s client to v0.21.0 (#6322)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-27 10:20:53 -07:00
dependabot[bot]
a61052ba1a chore(deps): bump dns-packet from 1.3.1 to 1.3.4 in /ui (#6346)
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-27 08:53:27 -07:00
jannfis
c5b25c067f docs: Reflect minimum required Go version with reality (#6342)
Signed-off-by: jannfis <jann@mistrust.net>
2021-05-27 14:49:08 +02:00
Vadym Liubko
54ec2fcadb docs: fix typo in sync_windows.md (#6334)
Signed-off-by: Vadym Liubko <neznam.ua@gmail.com>
2021-05-27 08:44:59 +02:00
Alexander Matyushentsev
5fd7ffdb7a fix: add missing --container flag to 'argocd app logs' command (#6320)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-25 17:37:08 -07:00
Alexander Matyushentsev
aad1a26144 fix: grpc web proxy must ensure to read full header (#6319)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-25 17:36:50 -07:00
dependabot[bot]
32f60d3504 chore(deps): bump browserslist from 4.7.2 to 4.16.6 in /ui (#6312)
Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.7.2 to 4.16.6.
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.7.2...4.16.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-25 12:27:40 -07:00
zakriya753
8cb589859f Update USERS.md (#6308)
Unifonic Inc include in Users
2021-05-25 12:27:01 -07:00
Kshama Jain
62aa859f29 fix: add generate bearer token option to argocd-util cluster generate-spec (#6317)
* Add generate bearer token option

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-05-25 10:48:09 -07:00
blakebarnett
ae5388dd79 fix: replace colons in addition to slashes in app tmp directory (#6290) (#6293)
closes https://github.com/argoproj/argo-cd/issues/6290

Signed-off-by: Blake Barnett <blakeb@me.com>
2021-05-24 13:04:29 -07:00
Alexander Matyushentsev
ffb22ff1ff fix: UI should automatically retrigger SSO login after token expiration (#6309)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-24 10:50:47 -07:00
Stéphane Este-Gracias
857d448a5c docs: Add CLI installation with Homebrew for Linux and WSL (#6297)
Signed-off-by: Stéphane Este-Gracias <sestegra@gmail.com>
2021-05-24 09:42:32 -07:00
Kshama Jain
20ba86ba5f fix: argocd cluster add <context> --in-cluster (#6276)
fix: argocd cluster add <context> --in-cluster (#6276)

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-05-24 09:25:54 -07:00
gaurav517
35a5f19d08 docs: fix git-pod url in doc (#6284)
Signed-off-by: Kumar Gaurav <kgaurav2@ebay.com>
Signed-off-by: Kumar Gaurav <gaurav@kgaurav.com>
2021-05-23 14:08:24 -07:00
Alexander Matyushentsev
cc98954847 fix: default app resync timeout is 0 seconds instead of 3 minutes (#6299)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-21 17:36:41 -07:00
Alexander Matyushentsev
696610688e fix: controller should refresh app before running sync operation (#6294)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-21 13:32:31 -07:00
Alexander Matyushentsev
0e9823efa9 fix: userinfo /v1/session/userinfo should return authenticated=false if token has expired (#6282)
fix: userinfo /v1/session/userinfo should return authenticated=false if token has expired (#6282)

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-20 12:58:24 -07:00
Alexander Matyushentsev
40629e5715 fix: enable access to metrics port in embedded network policies (#6277)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-19 22:32:57 -07:00
Alexander Matyushentsev
b57ba42b9d fix: gzip static resources if gzip is enabled (#6279)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-19 22:32:36 -07:00
Alexander Matyushentsev
b2f547e5ab fix: display log streaming error in logs viewer (#6100) (#6273)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-19 15:52:11 -07:00
Kshama Jain
da222e9621 fix: namespace install shouldn't contain namespace in the manifests (#6266)
* fix: Argocd namespace install contains namespace in the manifests

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-05-19 14:33:01 -07:00
Shoubhik Bose
cc4eea0d69 chore: Organize Application-related defaults/constants in the Application API's package. (#5893)
chore: Organize Application-related defaults/constants in the Application API's package. (#5893)

Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-05-19 12:43:04 -07:00
Alexander Matyushentsev
9b32e01104 feat: cache resolved git/helm repository revisions (#6102)
* feat: cache resolved git/helm repository revisions

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-19 12:30:15 -07:00
Shoubhik Bose
44dccdbba0 fix: run argo-cd repo server as non-root with read-only-root-fs (#5814)
fix: run  argo-cd repo server as non-root with read-only-root-fs (#5814)

Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-05-19 12:21:56 -07:00
dependabot[bot]
cf78189678 chore(deps): bump ua-parser-js from 0.7.20 to 0.7.28 in /ui (#6186)
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.20 to 0.7.28.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.20...0.7.28)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-19 08:56:05 -07:00
dependabot[bot]
da9cf5a4b6 chore(deps): bump url-parse from 1.4.7 to 1.5.1 in /ui (#6190)
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-19 08:55:44 -07:00
Remington Breeze
e84f3c6b3f fix(ui): Hide Diff tab in Application Details when App is synced (#6214)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-05-19 08:54:56 -07:00
Remington Breeze
e959c3b2a0 feat(ui): Add view toggle to hide/show unschedulable node in pod view (#6263)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-05-19 08:51:57 -07:00
Kai Reichart
748126e95f fix: jq installation arm (#6269)
Signed-off-by: Kai Reichart <kai@reichart.dev>
2021-05-19 14:03:21 +02:00
Alexander Matyushentsev
3f32a750a0 chore: use go embed instead of packr (#6262)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-18 20:46:17 -07:00
Remington Breeze
7d12385aed fix(ui): Don't count errored or completed neighbor pods toward resource consumption (#6259)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-05-18 16:01:23 -07:00
Remington Breeze
4159ebc6ce fix(ui): Resource details panel crashes when resource deleted (#6260)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-05-18 13:16:38 -07:00
jannfis
434af15d5b fix: Enable kex algo diffie-hellman-group-exchange-sha256 for go-git ssh (#6253)
* fix: Add support for diffie-hellman-group-exchange-sha256 for go-git ssh

Signed-off-by: jannfis <jann@mistrust.net>

* Update Procfile

Signed-off-by: jannfis <jann@mistrust.net>
2021-05-18 13:25:23 +02:00
Kotaro Shimizu
5c41377ca6 docs: fix ApplyOutOfSyncOnly in sync-options (#6249)
Signed-off-by: nekottyo <nekottyo@gmail.com>
2021-05-17 21:37:15 -07:00
Bob Lau
f1d72d2b86 docs: Remove duplicated IBM GitOps blog and update official URL (#6245) (#6246)
Signed-off-by: Bo Liu <lbseraph@gmail.com>
2021-05-16 11:04:08 +02:00
Yujun Zhang
5aa29ce405 chore: fix typo in comment (#6224)
Signed-off-by: Yujun Zhang <zhangyujun@gmail.com>
2021-05-15 17:27:17 +02:00
Yujun Zhang
a1419c2276 feat: use RLock and RUnlock for project to improve performance (#6225)
* feat: use RLock and RUnlock for project to improve performance

Signed-off-by: Yujun Zhang <zhangyujun@gmail.com>

* chore: go mod vendor && go mod tidy

Signed-off-by: Yujun Zhang <yujunz@nvidia.com>
2021-05-13 19:12:24 -07:00
akhalyavka
9bf83b4695 fix: rewrite Host header in dex reverse proxy (#6183)
* fix: rewrite Host header in dex reverse proxy

Signed-off-by: Alexey Khalyavka <alexey.khalyavka@datarobot.com>

* lint

Signed-off-by: Alexey Khalyavka <alexey.khalyavka@datarobot.com>
2021-05-12 09:11:44 +02:00
mickkael
5934094330 chore: docker image build compatible with arm64 (#6192)
Signed-off-by: mickkael <19755421+mickkael@users.noreply.github.com>
2021-05-12 09:07:32 +02:00
dependabot[bot]
456a2bc934 chore(deps): bump hosted-git-info from 2.8.5 to 2.8.9 in /ui (#6202)
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.5 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.5...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-11 21:47:27 -07:00
dependabot[bot]
32c73ad8bd chore(deps-dev): bump postcss from 7.0.21 to 8.2.10 in /ui (#6219)
Bumps [postcss](https://github.com/postcss/postcss) from 7.0.21 to 8.2.10.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/7.0.21...8.2.10)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-11 21:46:57 -07:00
Remington Breeze
d3fffc2b49 fix(ui): UI crashes after reinstalling ArgoCD (#6218)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-05-11 20:54:29 -07:00
aniekgul
ac2491d37d chore: upgrade redis-ha to 4.12.15, use bind value (#6205)
Signed-off-by: Aniek Gul <aniekgul@hotmail.com>
2021-05-11 09:57:40 +02:00
Joe Bowbeer
31d234560d fix: copy github app key from repocreds (#6197)
* fix: copy github app key from repocreds

Fixes #6196

Signed-off-by: Joe Bowbeer <joe.bowbeer@gmail.com>

* Add GitHub App to unit test

Signed-off-by: Joe Bowbeer <joe.bowbeer@gmail.com>
2021-05-11 09:56:49 +02:00
dependabot[bot]
4761656306 chore(deps): bump handlebars from 4.7.6 to 4.7.7 in /ui (#6187)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.7.6 to 4.7.7.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.7.6...v4.7.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-10 15:13:06 +02:00
Dominik Braun
ce28ea33c9 feat: Ask for confirmation when adding a cluster (#6172)
* feat: Ask for confirmation when adding a cluster

Signed-off-by: Dominik Braun <mail@dominikbraun.io>

* feat: Exit with code 1 on non-successful confirmation

Signed-off-by: Dominik Braun <mail@dominikbraun.io>

* feat: Optimize imports

Signed-off-by: Dominik Braun <mail@dominikbraun.io>

* feat: Use existing isatty.IsTerminal function

Signed-off-by: Dominik Braun <mail@dominikbraun.io>

* Order imports in cluster.go

Signed-off-by: Dominik Braun <mail@dominikbraun.io>

* Update CLI documentation

Signed-off-by: Dominik Braun <mail@dominikbraun.io>
2021-05-10 13:33:03 +02:00
jannfis
29b4c4deff chore: Allow ingress traffic to argocd-server by default (#6179)
Signed-off-by: jannfis <jann@mistrust.net>
2021-05-10 10:22:55 +02:00
Joshua Jackson
6c51082d40 docs: Onelogin - Update documentation for v2 openid setup (#6191)
Why do we need this change?
=======================
On April 20th, 2021 onelogin removed their v1 implementation of openid. You will get a 410 error if you try to use this url. As such update documentation to rely upon v2 api

What effects does this change have?
=======================
* Updates the onelogin documentation to correctly setup with the v2 implementation of openid

Signed-off-by: Joshua Jackson <joshua.jackson@jobvite-inc.com>
2021-05-10 10:22:24 +02:00
andybauer
5ec7d6e33e docs: added SAP GitOps blog post (#6185)
Signed-off-by: Andreas Bauer <hallo@abauer.org>
2021-05-07 16:30:05 +02:00
Dewan Ishtiaque Ahmed
09c5698c11 fix: test/remote/Makefile image path fix (#6181)
Signed-off-by: Dewan Ahmed <dewan.ishtiaque@hotmail.com>
2021-05-06 19:41:37 +02:00
Dominik Braun
1797aa5324 docs: Recommend --embed-certs flag for starting minikube (#6170)
* Recommend --embed-certs flag for starting minikube

Signed-off-by: Dominik Braun <mail@dominikbraun.io>

* docs: Recommend --embed-certs flag for starting minikube

Signed-off-by: Dominik Braun <mail@dominikbraun.io>
2021-05-06 13:31:56 +02:00
Alexander Matyushentsev
8b6af8b3d3 feat: add network policies to restrict traffic flow between argocd components (#6156)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-05-04 17:18:11 -07:00
Kyle Smith
82b177fd02 refactor: decompose Repository.GetAppDetails, remove interface{}. (#5634)
* refactor: decompose Repository.GetAppDetails, remove interface{}.

Signed-off-by: Kyle Smith <askreet@gmail.com>
2021-05-04 13:45:31 -07:00
Chetan Banavikalmutt
deac72f05f feat: allow admins to enable the usage of lua standard library (#6087)
Currently, the usage of standard lua library is always disabled, making it difficult to implement complex health check scripts.
This feat allow admins to control the usage of standard library by setting "health.lua.useOpenLibs" (merged-keys convention)/"resource.customizations.useOpenLibs.<group_kind>"
(split-keys convention) field in argocd-cm ConfigMap.

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-05-04 08:25:51 +02:00
Seiji 誠 次
6acac42412 Missing parameter (#6152)
This missing parameter in `argocd` CLI led me to open an issue https://github.com/argoproj/argo-cd/issues/6151

But I found the real problem that concerned in a missing command parameter at docs.

Signed-off-by: hakuno <seoseiji@gmail.com>
2021-05-03 13:21:05 -07:00
Remington Breeze
1e517e71e9 fix(ui): URL not updated on tab change (#6149)
* fix(ui): URL was not update on tab change

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-05-03 10:12:23 -07:00
Jonah Back
ddfd78f872 fix: copy github app key from repocreds (#6140)
Signed-off-by: Jonah Back <jonah@jonahback.com>
2021-05-03 19:08:47 +02:00
jannfis
75a201e45b chore: Update haproxy for redis-ha to 2.0.22 (#6142)
Signed-off-by: jannfis <jann@mistrust.net>
2021-05-03 09:07:16 +02:00
Trevor Royer
b4507d800d fix: knative health reporting #6130 (#6131)
* add ready = false health check

add additional tests

Signed-off-by: Trevor Royer <troyer@redhat.com>

* Fix health checks for knative resources

Signed-off-by: Trevor Royer <troyer@redhat.com>

* fix tests

Signed-off-by: Trevor Royer <troyer@redhat.com>
2021-05-01 13:09:42 +02:00
Remington Breeze
5981bd18be fix(ui): Resource detail tabs links weren't working (#6138)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-04-30 11:09:24 -07:00
Chetan Banavikalmutt
4c012245c4 feat: add support to backup applicationsets (#6095)
This commit adds support to export and import applicationset objects along with other Argo CD resources

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-04-30 12:34:58 +02:00
Kirill Zaborsky
2f1357a2b5 Fix password placeholder (#6105)
Signed-off-by: Kirill Zaborsky <qrilka@gmail.com>
2021-04-29 12:41:32 -07:00
Josh Soref
5c3f1d4b17 docs: add period to sentence (#6124)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-04-29 10:47:30 +02:00
yancl
a125794dba fix: remove break for appsCount (#6115)
Signed-off-by: yancl <kmoving@gmail.com>
2021-04-28 12:37:46 -07:00
Jan Jansen
c46c95bb4a feat: Implement cluster-api CRD health checks (#5142)
Signed-off-by: jan.jansen <jan.jansen@gdata.de>
2021-04-28 11:58:03 -07:00
Alexander Matyushentsev
9ef9be41d5 docs: update v2.0 release date in changelog (#6118)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-28 11:54:21 -07:00
J. Mark Pim
11489822d0 fix: Don't record the user claims of invalid tokens (#5897)
* fix: Only add claims to the context if they're valid

Signed-off-by: Mark Pim <j.mark.pim@gmail.com>
2021-04-28 11:50:18 -07:00
rafaelsilvaaa10
070fe0a9d8 Update Users - Adding Natura &Co (#6120)
We are currently working with argocd in production
2021-04-28 11:48:42 -07:00
Dinesh Yadav
45713b1ffc Support external vendoring of assets using go toolchain (#3217) 2021-04-28 10:36:13 -07:00
jannfis
d9bc6cf699 feat: Externalize TLS cert for argocd-server (#6071)
* feat: Externalize TLS cert for argocd-server

Signed-off-by: jannfis <jann@mistrust.net>

* Update docs for mTLS scenarios

Signed-off-by: jannfis <jann@mistrust.net>

* Inline documentation

Signed-off-by: jannfis <jann@mistrust.net>
2021-04-26 19:56:09 +02:00
Tom Keur
fa9440f885 chore (docs): add webstores to users (#6088)
Signed-off-by: Tom Keur <tom.keur@webstores.nl>
2021-04-24 17:19:02 +02:00
May Zhang
1ea0b373d2 fix: when resolve dependencies, use repo from project. (#6090)
* fix: when resolve dependencies, use repo from project.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: failed test case

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-04-23 17:32:28 -07:00
Kshama Jain
fad9030ded feat: split resource.customizations into sub keys (#6060)
feat: split resource.customizations into sub keys (#6060)

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-04-23 16:29:42 -07:00
Remington Breeze
bfd0b155ef fix(ui): Application Create panel broken (#6080)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-04-21 13:35:45 -07:00
May Zhang
050e63fded fix: manifest files with kustomize 4.1.2 (#6073)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-04-21 07:42:43 -07:00
May Zhang
b6d5c23bce fix: upgrade to kustomize 4.1.2 (#6059)
* fix: upgrade to kustomize 4.1.2

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: try to trigger the build again.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: unit test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: trigger build

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: install-codegen-tools.sh

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: trigger build

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: revert back to 3.9.4

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: try 4.1.2 again

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: adding sha256 file for kustomize 4.1.2

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: adding sha256 file for kustomize 4.1.2

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: disable a test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: remove kustomize 3

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fixed e2e test and added upgrade doc

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fixed e2e test and added upgrade doc

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-04-20 15:35:18 -07:00
Remington Breeze
1bffd827aa feat(ui): Information header for selected resource panel (#5557)
* Add new resource header for resource info panel

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-04-20 14:26:48 -07:00
Sebastián Greco
5ca09481e0 feat: Add health-checks for Elasticsearch #6052 (#6052)
* Add Elasticsearch health checks

Signed-off-by: Sebastian Greco <pup_seba@yahoo.com>
2021-04-20 11:39:48 -07:00
dependabot[bot]
411f9c44df chore(deps): bump ssri from 6.0.1 to 6.0.2 in /ui (#6058)
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-20 10:41:01 -07:00
Alexander Matyushentsev
81d5b9388b chore: publish argoproj/argocd:latest using CI (#6070)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-20 10:13:47 -07:00
hrpatel
dee71db556 fix: Run redis container as redis (#6041)
Signed-off-by: hrpatel <hrpatel@users.noreply.github.com>
2021-04-20 10:13:26 -07:00
Ishita Sequeira
31d66bcef8 fix: file descriptor leak (#6064)
Signed-off-by: Ishita Sequeira <isequeir@redhat.com>
2021-04-20 09:03:04 -07:00
May Zhang
9c5ed913d0 fix: Enable helm OCI to work for lots of different URLs without having to create a repo for each one (#6027)
* fix: add helm dependecies with custom CA

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* fixed go lint error

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* ignore existing repos

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* fix: Enable helm OCI to work for lots of different URLs without having to create a repo for each one

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: Enable helm OCI to work for lots of different URLs without having to create a repo for each one

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: lint

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: lint

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fix test code

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: dependency add for https and oci

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: go.sum and install.yaml

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fix checking if repo exits

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fix generated files

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fix go.mod and go.sum

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: clean up code

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: rename RepoCreds to HelmRepoCreds

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: Added type for repoCreds.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: checking in install.yaml

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: checking in install.yaml

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: checking in install.yaml

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: Makefile

Signed-off-by: May Zhang <may_zhang@intuit.com>

Co-authored-by: Shubham Agarwal <shubhamagarawal19@gmail.com>
2021-04-19 13:17:26 -07:00
jannfis
66f36ff002 chore: Validate checksums of downloaded files in build chain (#6057)
* chore: Validate checksums of downloaded files in build chain

Signed-off-by: jannfis <jann@mistrust.net>

* Fix arm install of kustomize

Signed-off-by: jannfis <jann@mistrust.net>

* Add sudo package to Go builder image

Signed-off-by: jannfis <jann@mistrust.net>
2021-04-19 18:46:21 +02:00
Jacob Wernette
3e43ecaa2d docs: Add argocd-vault-plugin to secret management list (#6054)
Signed-off-by: Jacob Wernette <werne2j@gmail.com>
2021-04-18 18:07:00 +02:00
Remington Breeze
6fb395f8af feat(ui): Keyboard shortcuts (#5601)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-04-16 12:07:42 -07:00
Ralph Soika
376e8a7beb docs: fixed Ingress configuration for kubernetes v1.19+ (#5961)
* fixed Ingress configuration for kubernetes v1.19+

Signed-off-by: Ralph Soika <ralph.soika@imixs.com>

* fix: fixed Ingress configuration for kubernetes v1.19+

Signed-off-by: Ralph Soika <ralph.soika@imixs.com>
2021-04-16 19:57:48 +02:00
Maxime Bouchenoire
70d7f2bcf5 docs: Link issues related to health checks in FAQ (#5993)
* docs: Link issues related to health checks in FAQ

Signed-off-by: Maxime Bouchenoire <maxime.bouchenoire@witick.io>

* docs: Add Witick to USERS.md

Signed-off-by: Maxime Bouchenoire <maxime.bouchenoire@witick.io>
2021-04-15 16:51:08 -07:00
Shoubhik Bose
3d3a250072 fix: run server as nonroot (#5820)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-04-15 16:43:39 -07:00
Shoubhik Bose
6093797498 fix: make application-controller run as nonroot (#5819)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-04-15 16:37:19 -07:00
Petr Drastil
887242c341 fix: spark application check fails on missing section (#6036)
* fix: spark application check fails on missing section

Signed-off-by: Petr Drastil <petr.drastil@gmail.com>
2021-04-15 14:44:51 -07:00
Chetan Banavikalmutt
62a6c7ae55 fix: don't resolve revision for a local sync (#6002)
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-04-15 12:51:03 -07:00
Shoubhik Bose
6aee524e0a chore: compile-time validation of adherence to interface contract (#5850)
* fix: compile time validation of interface contract

Signed-off-by: Shoubhik Bose <shbose@redhat.com>

* fix: application specific parameter override is not reflected in application parameters tab (#5845)

Signed-off-by: May Zhang <may_zhang@intuit.com>
Signed-off-by: Shoubhik Bose <shbose@redhat.com>

* chore: compile time resolution

Signed-off-by: Shoubhik Bose <shbose@redhat.com>

* chore: adherance to contract

Signed-off-by: Shoubhik Bose <shbose@redhat.com>

* Revert "fix: application specific parameter override is not reflected in application parameters tab (#5845)"

This reverts commit 43c8012062.

Signed-off-by: Shoubhik Bose <shbose@redhat.com>

Co-authored-by: May Zhang <may_zhang@intuit.com>
2021-04-15 12:45:57 -07:00
aniekgul
d78af0b463 refactor: upgrade redis-ha to 4.12.14 & cleanup generate.sh (#6021)
Signed-off-by: Aniek Gul <aniekgul@hotmail.com>
2021-04-15 20:24:08 +02:00
Shubham Agarwal
aa829c2c81 fix: execute cm dev mounter for make start (#6042)
Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>
2021-04-15 15:49:12 +02:00
Marcel Hoyer
5bc7297934 fix: bitbucket server failing diagnostics:ping (#6029) (#6034)
Signed-off-by: Marcel Hoyer <m.hoyer@cid.com>

Co-authored-by: Marcel Hoyer <m.hoyer@cid.com>
2021-04-14 13:18:12 -07:00
Shubham Agarwal
8f53bd53ec fix: add helm dependencies with custom CA (#6003)
* fix: add helm dependecies with custom CA

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* fixed go lint error

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* ignore existing repos

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* fix: Enable helm OCI to work for lots of different URLs without having to create a repo for each one

Signed-off-by: May Zhang <may_zhang@intuit.com>

* Revert "fix: Enable helm OCI to work for lots of different URLs without having to create a repo for each one"

This reverts commit a8ae8cf1b9.

* fix: only adding the dependency repo which does not exist in the repo list

Co-authored-by: May Zhang <may_zhang@intuit.com>
2021-04-14 10:05:37 -07:00
Samuel Suter
8fd6f13855 docs: Custom resource actions (#5838)
Signed-off-by: Samuel Suter <samuel.suter@sendgrid.com>
2021-04-13 20:09:25 -07:00
Jef LeCompte
8a2897d783 docs: update delete policy verbiage (#6025)
Signed-off-by: Jef LeCompte <jeffreylec@gmail.com>
2021-04-13 14:35:03 -07:00
Alexander Matyushentsev
c847bd9f4d chore: remove Argo CD CRDs from namespaced install (#6022)
* chore: remove Argo CD CRDs from namespaced install

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-13 11:41:44 -07:00
Ryota
61080b3313 docs: improve Orphaned Resources Monitoring with more examples and correct grammar (#6006)
Signed-off-by: Ryota <rytswd@gmail.com>
2021-04-13 11:59:15 +02:00
rumstead
8301d39487 Adding explicit bind to redis and sentinel for IPv4 clusters #5957 (#6005)
* fix(redis-ha): Adding explicit bind to redis and sentinel config to support IPv4 clusters. Closes #5957

Signed-off-by: Ryan Umstead <ryan.umstead@blackrock.com>
2021-04-12 14:08:38 -07:00
May Zhang
12cabdfb4e fix: adding tests for helm OCI registry (#5978)
* initial draft of adding tests for OCI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: initial draft of adding tests for OCI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* bring up registry for tests

Signed-off-by: May Zhang <may_zhang@intuit.com>

* bring up registry for tests

Signed-off-by: May Zhang <may_zhang@intuit.com>

* bring up registry for tests

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: just to test if PR is working

Signed-off-by: May Zhang <may_zhang@intuit.com>

* adding additional helm oci dependencies tests

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-04-12 09:15:43 -07:00
Yuan Tang
9da9514ba8 docs: Add Ant Group to the list of users (#6011)
Signed-off-by: terrytangyuan <terrytangyuan@gmail.com>
2021-04-12 09:07:49 -07:00
bainss
5e34a8a9b8 add Polarpoint.io (#6010)
Signed-off-by: Surjit Bains <surjit.bains@gmail.com>
2021-04-12 09:07:24 -07:00
Ishita Sequeira
2f92777f71 chore: move access checks from api server to repo server (#5940)
* chore: move api checks to reposerver

Signed-off-by: Ishita Sequeira <isequeir@redhat.com>

* resolving merge conflicts

Signed-off-by: Ishita Sequeira <isequeir@redhat.com>

* Address PR comments

Signed-off-by: Ishita Sequeira <isequeir@redhat.com>
2021-04-09 17:34:09 +02:00
Remington Breeze
ae2d0ff0a6 fix(ui): Unscheduled pods in node view are now visible. Fixes #5981 (#5988)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-04-08 09:04:47 -07:00
Josh Soref
b003f70e26 docs: SealedSecret status missing on k8s 1.16+ (#5846)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-04-07 14:30:45 -07:00
Jonah Back
445872f558 fix: use correct field for evaluating whether or not GitHub Enterprise is selected (#5987)
Signed-off-by: Jonah Back <jonah@jonahback.com>
2021-04-07 14:27:05 -07:00
jannfis
9afa8333b4 chore: Make e2e tests runnable against remote cluster (#5895)
* chore: Make e2e tests runnable against remote cluster

Signed-off-by: jannfis <jann@mistrust.net>

* Fix linter complaint

Signed-off-by: jannfis <jann@mistrust.net>

* Revert

Signed-off-by: jannfis <jann@mistrust.net>

* Address reviewer comments

Signed-off-by: jannfis <jann@mistrust.net>

* Compat with Mac

Signed-off-by: jannfis <jann@mistrust.net>

* Revert test setting

Signed-off-by: jannfis <jann@mistrust.net>
2021-04-07 14:49:17 +02:00
namku
4f9c5007a7 docs: k8s version in Ingress Configuration documentation (#5727)
* Fix k8s version in Ingress Configuration doc

Signed-off-by: Isaac Lopez <syak7771@gmail.com>

* docs: Fix k8s version in ingress api

Signed-off-by: Isaac Lopez <syak7771@gmail.com>
2021-04-07 00:11:58 -07:00
Raphaël Pinson
7c88ac861c feat: Allow to pass Kubernetes configuration overrides (#5906)
This allows to override the Kubernetes configuration used to set up the
Port Forward.

Closes [ISSUE 5905]

Signed-off-by: Raphaël Pinson <raphael.pinson@camptocamp.com>
2021-04-07 00:04:36 -07:00
Brandon Sorgdrager
834a5fa854 chore: Change grammar in high_availability.md (#5964)
Update summary statement for high availability to use proper grammar.

Signed-off-by: mgmtadmin <brandon.sorgdrager@gmail.com>
2021-04-06 23:59:03 -07:00
Marcus Noble
2a2b81f6b9 fix: Improvements to mobile UI (#5965)
Signed-off-by: Marcus Noble <github@marcusnoble.co.uk>
2021-04-06 23:05:37 -07:00
Chetan Banavikalmutt
f06fc0d982 feat: allow per-version kustomize options (#5967)
Allow adding build options that are specific to a kustomize version instead of using the same default options for each version.

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-04-06 09:24:57 -07:00
Alexander Matyushentsev
92c7ca04c7 chore: make argocd gitpod friendly (#5973)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-06 08:55:15 -07:00
Kshama Jain
1bc3348553 Upgrade gitops-engine (#5972)
* fix: upgrade gitops engine

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-04-05 15:51:59 -07:00
Shoubhik Bose
a686f12f4d fix: run dex as nonroot (#5815)
* fix: run dex as nonroot

Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-04-04 17:30:55 -07:00
Mitsuo Heijo
ed5c5b639a chore: Update go-git to v5 (#5520)
Signed-off-by: Mitsuo Heijo <mitsuo.heijo@gmail.com>
2021-04-04 17:18:54 -07:00
Alexander Matyushentsev
ac3d4cc761 fix: correct package name in Makefile (#5960)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-03 22:48:36 -07:00
Alexander Matyushentsev
24b2caca91 chore: fix incorrect image name in 'publish' CI job (#5956)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-04 00:17:55 +02:00
Alexander Matyushentsev
b37eee1054 chore: fix invalid IMAGE_NAMESPACE in image 'publish' CI job (#5953)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-02 18:19:55 -07:00
Shoubhik Bose
dc4eaff6b3 chore: Remove specification of user id for the Redis workload (#5863)
* fix: avoid specifying redis user

Signed-off-by: Shoubhik Bose <shbose@redhat.com>

* fix: generate manifests

Signed-off-by: Shoubhik Bose <shbose@redhat.com>

* chore: one less manifest

Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-04-02 11:18:08 +02:00
Shoubhik Bose
8eeb9a074a chore: use clusterrolebinding v1 (#5939)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-04-02 11:13:19 +02:00
Dax McDonald
7945286434 docs: clarify that the certificate must be in PEM format (#5946)
Signed-off-by: Dax McDonald <31839142+daxmc99@users.noreply.github.com>
2021-04-02 11:12:13 +02:00
Alexander Matyushentsev
de522bf43b chore: migrate argocd dev images to ghcr.io (#5948)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-01 14:36:20 -07:00
dependabot[bot]
0a53fb1f2f chore(deps): bump y18n from 4.0.0 to 4.0.1 in /ui (#5919)
Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-01 12:57:02 -07:00
jannfis
ae49b45249 chore: Upgrade Go module to v2 (#5931)
* chore: Upgrade Go module to v2

Signed-off-by: jannfis <jann@mistrust.net>

* Restore import order

Signed-off-by: jannfis <jann@mistrust.net>

* fix knowntypes_normalizer codegen error

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* fix codegen

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* fix Procfile

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-04-01 20:44:18 +02:00
Yutaro Nishi
a2ebe15895 add user (#5938)
* add user

Signed-off-by: yuta-ron <jan.joqr@gmail.com>
2021-04-01 11:03:38 -07:00
Hien Le
7f5a23d89d Update USERS.md (#5835)
Signed-off-by: Hien Le <Hien.LeThai@nttdata.com>
2021-04-01 11:00:46 -07:00
Shoubhik Bose
24218b4808 docs: Propose an enhancement proposal process (#5771)
* docs: propose an enhancement proposal process

Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-03-31 22:00:11 -07:00
Alexander Matyushentsev
d085636fd7 fix: support loading oci helm dependencies referenced by chart stored in non-oci repo (#5917)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-30 11:14:30 -07:00
Patric Stout
75a1ea0c61 fix: installing packr for arm is no longer working (#5904)
Since Go 1.11, "go get" uses the modules system. This changes
the location the package is downloaded.

Additionally, "go get -u" does more work than required; changing
this to "go get -d" speeds up the process.

Finally, since Go 1.13 "go get" can also check out tags directly,
avoiding an additional checkout.

Signed-off-by: Patric Stout <github@truebrain.nl>
2021-03-30 19:41:59 +02:00
Regina Scott
11c730c202 fix: improvements to keyboard navigation (#5825)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-30 10:20:02 -07:00
dependabot[bot]
7cab755d1a chore(deps): bump pygments from 2.4 to 2.7.4 in /docs (#5900)
Bumps [pygments](https://github.com/pygments/pygments) from 2.4 to 2.7.4.
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.4.0...2.7.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-30 10:19:30 -07:00
Viktor Farcic
12bec2f4f3 docs: Video (#5916)
* docs: PRs with Argo CD and Codefresh

Signed-off-by: Viktor Farcic <viktor@farcic.com>

* Video

Signed-off-by: Viktor Farcic <viktor@farcic.com>

* Yet another video

Signed-off-by: Viktor Farcic <viktor@farcic.com>

* Video

Signed-off-by: Viktor Farcic <vfarcic@farcic.com>

Co-authored-by: Viktor Farcic <vfarcic@farcic.com>
2021-03-30 19:15:02 +02:00
Shoubhik Bose
8bfe41b44b chore: add fix-missing (#5864)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-03-30 09:24:04 +02:00
HOA PHAN
a8c211e0b2 fix: replace retired google helm chart repo with new location (#5885)
Signed-off-by: Hoa Phan <s50600822@gmail.com>
2021-03-30 08:41:53 +02:00
Regina Scott
9590dc9740 docs: path error in docs for argo ui contributing (#5898)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-30 08:05:19 +02:00
Bostjan Skufca Jese
8808bb7b7f docs: Fix an instance of an awkwardly-worded sentence in docs (#5899)
Signed-off-by: Bostjan Skufca Jese <bostjan@skufca.si>
2021-03-30 08:03:07 +02:00
Austin Smart
6f5f87b730 fix: Use helm login for Oci helm repos. #5856 (#5887)
fix: Use helm login for Oci helm repos. #5856 (#5887)

Signed-off-by: Austin Smart <austin@austinsmart.com>
2021-03-29 10:27:15 -07:00
jannfis
3ce367462a chore: Some linter issues with golangci-lint 1.38 (#5894)
Signed-off-by: jannfis <jann@mistrust.net>
2021-03-29 09:26:01 -07:00
Byungjin Park (Claud)
2f785cde06 docs: Update USERS.md (#5892)
Signed-off-by: Byungjin Park <posquit0.bj@gmail.com>
2021-03-29 11:21:34 +02:00
Alexander Matyushentsev
719d6a9c25 fix: fix incorrect OCI Helm registiries assumptions (#5888)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-26 15:33:36 -07:00
May Zhang
1c318f3959 fix: documentation update for argocd-util settings rbac (#5879)
* fix: documentation update for argocd-util settings rbac

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: documentation update for argocd-util settings rbac

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-26 11:00:23 -07:00
yconio
4ee30a1cff doc:add handelsbanken to USERS.md (#5818)
* doc:add handelsbanken to USERS.md
2021-03-26 09:44:15 -07:00
Shoubhik Bose
8d066d3007 fix: avoid short names (#5865)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-03-26 09:38:49 -07:00
May Zhang
26af455a6c fix: global project info is missing in UI (#5861)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-26 09:36:55 -07:00
May Zhang
86494a2800 fix: add prefix sync for CLI argocd app flag --retry-limit, --retry-b… (#5876)
* fix: add prefix sync for CLI argocd app flag --retry-limit, --retry-backoff-duration, --retry-backoff-factor and --retry-backoff-max-duration

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-26 09:34:31 -07:00
Kshama Jain
a7ab7dd969 fix: update gitops-engine (#5874)
fix: update gitops-engine (#5874)

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-03-25 16:25:12 -07:00
Alexander Matyushentsev
d297bc3241 fix: non-cascading application delete is broken (#5875)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-25 15:17:26 -07:00
Remington Breeze
65b4b5887b fix(ui): Pod logs filter did not refresh on button click. Also add tooltip for clarification (#5858)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-03-25 15:15:02 -07:00
Alexander Matyushentsev
f3883944e5 chore: fix 'make codegen-local' on mac (#5847)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-25 10:28:34 -07:00
Chetan Banavikalmutt
2faa08e710 feat: add exit-code flag to app diff command (#5852)
Using exit-code flag we could control the exit status of the command when there's a diff.

Example:

argocd app diff sample --local /path --exit-code=false

The above command will return exit code 0 even if it finds a diff.

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-03-25 08:22:18 +01:00
Kshama Jain
6cc8ab025a fix: get correct username from jwt token subject (#5836) (#5848)
* fix: get correct username from jwt token subject

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-03-24 12:30:26 -07:00
jannfis
733587e78a chore: Fix manifest generation in release and make quay.io the lead (#5831)
* chore: Fix manifest generation in release and make quay.io the lead

Signed-off-by: jannfis <jann@mistrust.net>

* Fix docker push command

Signed-off-by: jannfis <jann@mistrust.net>
2021-03-24 14:39:10 +01:00
May Zhang
bde4ad4d82 fix: application specific parameter override is not reflected in application parameters tab (#5845)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-23 14:05:11 -07:00
William Tam
53fabec845 chore: Separate "online" mode from "production" mode in yarn build (#5830)
* Separate "online" mode from "production" mode in yarn build
Signed-off-by: William Tam <email.wtam@gmail.com>

* Signed-off-by: William Tam <email.wtam@gmail.com>
Fix typo
2021-03-22 13:24:18 +01:00
May Zhang
ccfa058cf7 fix: error when reset application parameters from UI (#5828)
* fix: error when reset kustomize parameters from UI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* Revert "fix: error when reset kustomize parameters from UI"

This reverts commit 126f210a

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: error when reset kustomize parameters from UI

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-20 11:05:22 -07:00
Alexander Matyushentsev
14a71f3f92 docs: add 2.0 change log and mention redis in upgrade instructions (#5812)
* docs: add 2.0 change log and mention redis in upgrade instructions

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* docs: apply reviewer notes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-19 11:12:36 -07:00
Chetan Banavikalmutt
aff71203e8 feat: Support unset plugin env variables (#5737)
This commit adds a flag --plugin-env to the app unset command, using which the plugin env varibles can be removed if present.

Example

argocd app unset example --plugin-env key1 --plugin-env key2

Fixes: #5681
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-03-19 09:16:56 +01:00
jannfis
84f0594568 chore: Use right protocol for argo-ui dependency (#5805)
* chore: Use right protocol for argocd-ui dependency

Signed-off-by: jannfis <jann@mistrust.net>

* Update docs

Signed-off-by: jannfis <jann@mistrust.net>
2021-03-18 15:03:28 -07:00
Alexander Matyushentsev
796a20ca9a feat: allow downloading logs as a txt file (#5803)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-18 14:12:48 -07:00
Alexander Matyushentsev
21b7679ba7 refactor: upgrade golang to v1.16.2 (#5809)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-18 13:35:14 -07:00
Alexander Matyushentsev
439963f4c9 feat: Support kubectl replace instead of apply (#2730) (#5802)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-17 22:02:43 -07:00
May Zhang
b2c54f8215 fix: app list with --repo returns invalid selector (#5801)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-17 21:59:30 -07:00
May Zhang
ecd865803e doc: update doc regarding PruneLast sync option. (#5796)
* doc: update doc regarding PruneLast sync option.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: semantic pr failed.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: also updated application.yaml

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-17 14:15:34 -07:00
Alexander Matyushentsev
ed0cbdd8fa fix: revert use streaming API for Application List UI view (#5797)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-17 10:35:26 -07:00
Svend Sorensen
9ba4019898 feat(helm): Do not fail when value files do not exist (#5751)
* feat(helm): Do not fail when value files do not exist

Skip Helm value files that do not exit. This will allow the values that do exit
to be displayed.
2021-03-17 09:58:21 -07:00
Florian Flock
3d05a20454 Wrong command for argocd-server (#5761)
Command in the Deployment of argocd-server needs to be `argocd-server`, otherwise it will fail on startup.
2021-03-16 15:28:50 -07:00
May Zhang
036346b604 fix: file exention comparisons are case sensitive (#5789)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-16 15:24:21 -07:00
Karan Thanvi
4417b95c80 fix broken link (#5619)
fixes broken link for webhooks description
2021-03-16 15:23:50 -07:00
Ed Lee
d82c770531 Update OWNERS (#5772) 2021-03-16 15:23:34 -07:00
Shoubhik Bose
14083aa631 docs: remove obsolete ci section (#5773)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-03-16 15:23:19 -07:00
Alexander Matyushentsev
6b065717c6 feat: support 'PrunePropagationPolicy' sync policy in the UI (#5755)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-16 14:27:08 -07:00
ryota-sakamoto
d1b2d57467 chore: update golangci-lint version (#5760)
Signed-off-by: Ryota Sakamoto <sakamo.ryota+github@gmail.com>
2021-03-16 14:19:34 -07:00
Shoubhik Bose
8eef06671a docs: Update Community section (#5770)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-03-16 14:18:14 -07:00
Regina Scott
416be6011e docs: add instructions for contributing to argo-ui (#5776)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-16 13:10:26 -07:00
kshamajain99
91c20b7ca5 fix: remove zjwt (#5774)
* fix: remove zjwt

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-03-16 11:53:12 -07:00
May Zhang
38864e0f1b fix: in securityContext set allowPrivilegeEscalation to false also drop all capabilities. (#5786)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-16 11:00:33 -07:00
Elliot Zhang
e8b0d34ea3 docs: add Gojek to USERS.md (#5782)
Signed-off-by: Elliot Zhang <z11imdk@gmail.com>
2021-03-16 09:38:54 -07:00
jannfis
7a68880e2e feat: Make TLS to repo-server configurable and optional (#5764)
feat:  Make TLS to repo-server configurable and optional (#5764)

Signed-off-by: jannfis <jann@mistrust.net>
2021-03-16 09:23:10 -07:00
Shoubhik Bose
9c849e63f7 chore: use kube libraries v0.20.4 (#5775)
* chore: use kube libraries v0.20.4

Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2021-03-15 20:48:25 -07:00
Chetan Banavikalmutt
b728505c9f feat: support background propagation policy while deleting applications (#5216) (#5524)
* feat: support background propagation policy

Currently, Argo CD only supports foreground propagation policy ie. delete all the resources in the foreground and then delete the application in the end. This PR introduces a new flag `propagation-policy` to decide the type of policy when cascading is enabled. It also adds an annotation `propagation-policy.argocd.argoproj.io`, which is used by the application controller to decide the order of deletion.

Fixes: #5216
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* fix lint and doc errors

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* update logs to display the application name

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* address review comments

* remove application name from logs since it's already present
* update the propagation policy annotation key

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* Add radio buttons in the UI to select propagation policy

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* inject finalizers instead of annotations for specifying propagation policy

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* rebase branch on master

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* update the controller to set the policy only for application's resources

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>

* fix the label of policy radio button

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-03-15 17:27:41 +01:00
dirien
d1fa6f8380 docs: Documentation only changes (#5759)
Signed-off-by: Engin Diri <engin.diri@mail.schwarz>
2021-03-14 12:23:40 +01:00
May Zhang
8cb2faf6a9 fix: app sync --dry-run stuck (#5753)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-03-12 13:52:57 -08:00
Josh Soref
96a23450ab chore: change version to 2.0.0 (#5750)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-03-12 20:32:44 +01:00
Samuel Suter
89f5a71e06 feat: filter applications by source repo URL (#5602) (#5603)
* feat: filter applications by source repo URL (#5602)

Signed-off-by: Samuel Suter <samuel.suter@sendgrid.com>

* Unit test for FilterByRepo
2021-03-12 09:07:22 -08:00
Onur Yartaşı
6757395b9c fix: Invalid semantic version MaxVersion (#5740) (#5747)
* fix: invalid semantic version (#5740)

Signed-off-by: Onur Yartaşı <onuryartasi@live.com>
2021-03-12 09:02:56 -08:00
Alexander Matyushentsev
d957ab467e feat: support resource prune propagation policy (#5743)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-12 09:01:36 -08:00
Regina Scott
f08a859822 fix: align status panel icons (#5746)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-11 15:43:27 -08:00
Alexander Matyushentsev
a532af7c74 fix: visually separate sync options and manual sync options (#5745)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-11 14:50:46 -08:00
Regina Scott
73af758724 Issue5408- Increase text contrast for improved web accessibility (#5700)
* fix: increase contrast for text color

Signed-off-by: Regina Scott <rescott@redhat.com>

* aligned spacing in application status panel

Signed-off-by: Regina Scott <rescott@redhat.com>

* boldened and darkened headers

Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-11 14:40:42 -08:00
Alexander Matyushentsev
1b7441d62b fix: add missing key property in Filter component (#5741)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-11 11:51:01 -08:00
Jay Li
1c15e1845b fix: Segmentation fault when no 'aud' inside a token (#5735)
Signed-off-by: Jay Li <xenium_lee@163.com>
2021-03-11 10:26:30 -08:00
Alexander Matyushentsev
b2fead6a84 feat: implement 'argocd-util cluster stats' command (#5733)
Signed-off-by: Alexander Matyushentsev <Alexander_Matyushentsev@intuit.com>
2021-03-11 08:53:17 -08:00
Alexander Matyushentsev
4112b55e06 fix: correctly load applications list page with no apps (#5732)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-10 11:07:33 -08:00
Jonathan West
50066eb1aa docs: move jgwest to approver (#5730)
Signed-off-by: Jonathan West <jonwest@redhat.com>
2021-03-10 18:40:51 +01:00
Alexander Matyushentsev
0da05bb13b refactor: applications-list page uses only watch API to quicker show application to the user (#5719)
Signed-off-by: Alexander Matyushentsev <Alexander_Matyushentsev@intuit.com>
2021-03-10 09:25:44 -08:00
dependabot[bot]
e49d3f7dca chore(deps): bump prismjs from 1.22.0 to 1.23.0 in /ui (#5648)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.22.0 to 1.23.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.22.0...v1.23.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-09 11:44:21 -08:00
dependabot[bot]
ec314207de chore(deps): bump elliptic from 6.5.3 to 6.5.4 in /ui (#5713)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-09 11:43:47 -08:00
Alexander Matyushentsev
1f140678e8 fix: improve 'argocd-util proj generate-spec' usability (#5717)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-09 11:42:16 -08:00
Mikhail Nacharov
33b570c652 fix(ui): out-of-sync button in apps with request hooks (#5625)
Fixes #5125

Signed-off-by: Mikhail Vladimirovich Nacharov <author@mnacharov.ru>
2021-03-09 11:21:33 -08:00
Jesse Suen
9c3df13672 fix: argocd-util import --prune must also remove finalizers if present (#5712)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2021-03-09 10:38:00 -08:00
Ishita Sequeira
445d091d49 feat: added cascade option to delete resources #5368 (#5538)
* feat: added cascade option to delete resources #5368

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* addressed PR comments related to cascade delete

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* feat: update gitops-engine version

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* Fix e2e tests

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* feat: update gitops-engine version

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* fix: Address PR comments

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-03-09 14:04:14 +01:00
Alexander Matyushentsev
27519b08e2 refactor: restructure 'argocd-util' commands (#5708)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-08 16:56:07 -08:00
anais-codefresh
a0a54555eb feat: adding noscript tag (#5650)
Signed-off-by: anais-codefresh <anais.urlichs@codefresh.io>
2021-03-08 18:24:45 +01:00
jannfis
90602a7ad9 feat: Upgrade Redis to v6.2.1 (#5701)
* feat: Upgrade Redis to v6

Signed-off-by: jannfis <jann@mistrust.net>

* Preload correct Redis image in CI

Signed-off-by: jannfis <jann@mistrust.net>

* Fix labels on StatefulSet and Deployment

Signed-off-by: jannfis <jann@mistrust.net>

* Update redis to 6.2.1 and haproxy to 2.0.20

Signed-off-by: jannfis <jann@mistrust.net>

* More 6.0.7 -> 6.2.1 updates

Signed-off-by: jannfis <jann@mistrust.net>

* Fix antiAffinity selectors

Signed-off-by: jannfis <jann@mistrust.net>
2021-03-07 09:35:24 +01:00
Alexander Matyushentsev
e3163e317a fix: logout link is broken (#5698)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-06 20:07:33 -08:00
kshamajain99
c0985fb0c9 fix: upgrade klog (#5697) (#5699)
fix: upgrade klog (#5697) (#5699)
2021-03-05 14:55:33 -08:00
Jonathan West
df29371ee9 docs: Add ApplicationSet page to Argo CD docs (#5685)
* docs: Add ApplicationSet page to Argo CD docs

Signed-off-by: Jonathan West <jonwest@redhat.com>

* docs: Add ApplicationSet page to Argo CD docs

Signed-off-by: Jonathan West <jonwest@redhat.com>

* docs: Add ApplicationSet page to Argo CD docs

Signed-off-by: Jonathan West <jonwest@redhat.com>
2021-03-05 22:15:37 +01:00
Regina Scott
022a130a3e fix: capitalization in headers (#5692)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-05 09:39:43 +01:00
Regina Scott
0259ed7f97 fix: increase contrast for badge colors (#5678)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-05 09:37:58 +01:00
Viktor Farcic
d8cb02bddb docs: Yet another ArgoCD-related video (#5686)
* docs: PRs with Argo CD and Codefresh

Signed-off-by: Viktor Farcic <viktor@farcic.com>

* Video

Signed-off-by: Viktor Farcic <viktor@farcic.com>

* Yet another video

Signed-off-by: Viktor Farcic <viktor@farcic.com>
2021-03-04 11:05:41 -08:00
jannfis
415034c493 docs: Bring upgrade instructions 1.8-2.0 up-to-date (#5689)
Signed-off-by: jannfis <jann@mistrust.net>
2021-03-04 19:58:51 +01:00
Alexander Matyushentsev
b268ef4db9 fix: minor 'argocd-util config' commands fixes (#5688)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-04 10:32:17 -08:00
Alexander Matyushentsev
8562a4ea47 refactor: upgrade golang to v1.16.0 (#5677)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-04 08:52:27 -08:00
Alexander Matyushentsev
8569105d81 feat: upgrade kustomize to v3.9.4 and support v3.8.5 breaking change (#5672)
* feat: upgrade kustomize to v3.9.4 and support v3.8.5 breaking change

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* fix flaky test

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-04 08:51:13 -08:00
Nick Groszewski
892712a7cb feat: Add additional strimzi custom resource health checks (#5642)
Add additional strimzi custom resource health checks, including:
* Kafka
* KafkaTopic
* KafkaUser

Contributes to argoproj/argo-cd#5577

Signed-off-by: Nick Groszewski <groszewn@gmail.com>
2021-03-04 14:59:18 +01:00
chgl
39d42ecfbf fix: updated CRD from apiextensions/v1beta1 to v1 (#5516)
Signed-off-by: chgl <chgl@users.noreply.github.com>
2021-03-04 14:55:30 +01:00
Gagan Hegde
ac1808b1be fix: Better handling of base64 encoded passwords/credentials (#5023)
* Removed the trailing argocd CRLF characterrs to values retrieved from the agro secrets
2021-03-03 14:44:50 -08:00
jannfis
28b0b193c5 fix: Handle GnuPG verification errors gracefully (#5560)
Signed-off-by: jannfis <jann@mistrust.net>
2021-03-03 14:39:47 -08:00
Ishita Sequeira
212a92cdfb feat: made Helm v3 the default and removed version auto-detection (#5646)
* feat: made Helm v3 the default and removed version auto-detection

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* feat: made Helm v3 the default and removed version auto-detection

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-03-03 14:36:35 -08:00
Alexander Matyushentsev
5889bbb330 feat: support caching helm repo index (#5661)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-03 14:07:59 -08:00
Richard Li
a3d2b1aa96 add ambassador labs (#5674)
Signed-off-by: Richard Li <richard@datawire.io>
2021-03-03 13:18:37 -08:00
Jesse Lumme
ced0e8c114 docs: Updated USERS.md - added Smilee.io (#5665)
* docs: Updated USERS.md

Signed-off-by: GitHub <noreply@github.com>

* docs: Updated USERS.md

Signed-off-by: GitHub <noreply@github.com>
2021-03-03 13:05:04 -08:00
Knut Götz
b0f952011a docs: Fix wrong link in troubleshooting.md for health assessment docs (#5666)
Signed-off-by: Knut Götz <knutgoetz@gmail.com>
2021-03-03 09:40:00 -08:00
kshamajain99
7abfbe8178 fix: don't log certain fields (#5662)
* fix: support longer cookie

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>

* merge conflicts

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>

* fix: don't log certain fields

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-03-02 18:38:16 -08:00
Alexander Matyushentsev
0ccd573229 feat: regenerate active users token if it is expiring soon (#5629)
* feat: regenerate active users token if it is expiring soon

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* Comment how 'renew-token' header is used

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-02 18:24:22 -08:00
Regina Scott
cdabf31119 fix: broken link to resetting admin password (#5660)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-02 15:13:24 -08:00
Remington Breeze
4d0d1435fe feat(ui): Filter sync results by status (#5499)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-03-02 14:05:22 -08:00
jannfis
5fa10a3526 fix: Ensure requested file from server is within a base path (#5564)
Signed-off-by: jannfis <jann@mistrust.net>
2021-03-02 13:32:12 -08:00
jannfis
e33330fce1 chore: Fix failing e2e tests due to GH actions change (#5658)
Signed-off-by: jannfis <jann@mistrust.net>
2021-03-02 21:36:49 +01:00
Andreas Fritzler
519ac0d291 Fixed dex connectors documentation link (#5573)
Signed-off-by: Andreas Fritzler <andreas.fritzler@sap.com>
2021-03-02 10:59:01 -08:00
jannfis
734f5c424b chore: Update inline docs for types.go (#5653)
* docs: Rework type descriptions

Signed-off-by: jannfis <jann@mistrust.net>

* More updates, and codegen

Signed-off-by: jannfis <jann@mistrust.net>
2021-03-02 19:24:51 +01:00
jannfis
d4a514c390 chore: Allow re-enable auth in local make start (#5639)
* chore: Allow re-enable auth in local make start

Signed-off-by: jannfis <jann@mistrust.net>

* Retrigger CI

Signed-off-by: jannfis <jann@mistrust.net>
2021-03-02 19:24:36 +01:00
Regina Scott
8595c2f0a9 fix: docs version selector not rendering (#5649)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-03-01 21:51:17 -08:00
Alexander Matyushentsev
d3f624c6d7 fix: pod logs viewer keep reloading completed container logs when logs following enabled (#5644)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-03-01 13:06:21 -08:00
Remington Breeze
8c97aded11 fix(ui): Toolbar wrap hides search. Refactor Page (#5593)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-03-01 13:04:37 -08:00
Shubham Agarwal
c6d37289c0 feat: exposed sync retry options via cli for app create (#5638)
Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>
2021-03-01 15:01:19 +01:00
Jan Gräfen
cbc04c7897 fix: Empty resource whitelist allowed all resources (#5540) (#5551)
* fix: Empty resource whitelist allowed all resources

This requires setting the default in quite a few
places around the code base as well as adapting
a couple of tests

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Improve default behavior and not require explicitly set whitelist

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>
2021-03-01 13:55:24 +01:00
Josh Soref
086683ab31 fix: reword Create SSH known host entries dialog (#5484)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-02-28 10:32:32 +01:00
jannfis
24b18a83a6 docs: Move security policy to SECURITY.md for integration with GitHub (#5627)
* docs: Move security policy to SECURITY.md for integration with GitHub

Signed-off-by: jannfis <jann@mistrust.net>

* Change wording a bit.

Signed-off-by: jannfis <jann@mistrust.net>

* Change order of e-mail addresses

Signed-off-by: jannfis <jann@mistrust.net>
2021-02-27 08:41:20 +01:00
Josh Soref
ba7054e808 fix: drop trailing ; (#5622) (#5623)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-02-26 18:03:08 +01:00
Josh Soref
5660dbab96 fix: Say Go Version/Go Compiler in About (#5329) (#5624)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-02-26 18:02:02 +01:00
May Zhang
0430725544 fixes: https://github.com/argoproj/argo-cd/issues/5611 (#5616)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-02-26 08:31:38 -08:00
jannfis
e896c0e4b4 fix: Properly escape HTML for error message from CLI SSO (#5563)
Signed-off-by: jannfis <jann@mistrust.net>
2021-02-26 09:50:27 +01:00
Sureshkumaar09
3c12f20dc0 Update USERS.md (#5375) 2021-02-25 22:50:53 -08:00
Alexander Matyushentsev
ce50a9de21 fix: API server should not print resource body when resource update fails (#5617)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-25 19:24:40 -08:00
Alexander Matyushentsev
7433a996e4 fix: upgrade argo-ui version (fixes stuck logs viewer); properly retry loading logs if network connection broke (#5615)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-25 15:48:58 -08:00
kshamajain99
7ad79e5e12 fix: fix memory leak in application controller (#5604)
fix: fix memory leak in application controller
2021-02-25 08:57:54 -08:00
Shubham Agarwal
2a1a03a919 fix: updated retry var type from string to duration for app sync (#5583)
* refactor: fixed retry var type from string to duration for app sync

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* fix codegen error

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>

* updated upgrade doc 1.8 - 1.9

Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>
2021-02-24 09:58:58 +01:00
Joseph Petersen
7ec8b266f8 chore: indent in kustomize deployment base (#5530)
Signed-off-by: Joseph Petersen <josephp90@gmail.com>
2021-02-22 18:33:11 +01:00
Mikhail Nacharov
f665a74e65 fix: return http400/405 to invalid webhook requests (#5565)
Fixes #5124

Signed-off-by: Mikhail Vladimirovich Nacharov <author@mnacharov.ru>

Co-authored-by: Mikhail Vladimirovich Nacharov <author@mnacharov.ru>
2021-02-20 19:51:12 +01:00
Alexander Matyushentsev
6e6cd1a1ef fix: show operation status if app is being deleted (#5561)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-19 14:36:12 -08:00
Alexander Matyushentsev
e1168fd1bf fix: 'argocd app wait --suspended' stuck if operation is in progress (#5511)
* fix: 'argocd app wait --suspended' stuck if operation is in progress

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-19 14:34:11 -08:00
Slava Markeyev
13b9b92c99 feat: GitHub organization app for git cloning (#4348) (#5355)
* Git GitHub App auth

Signed-off-by: Slava Markeyev <slavamarkeyev@gmail.com>
2021-02-19 14:24:32 -08:00
May Zhang
594c827b66 fix: Update gitops-engine to get the fix for sync should apply Namesp… (#5556)
* fix: Update gitops-engine to get the fix for sync should apply Namespaces and CRDs before resources

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: Update gitops-engine to get the fix for sync should apply Namespaces and CRDs before resources

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-02-18 17:02:14 -08:00
Remington Breeze
fbf0a780a0 fix(ui): Save current logs page to URL (#5541)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-18 16:10:07 -08:00
kshamajain99
6de3cf44a4 fix: support longer http cookie (#2917) (#5497)
* fix: support longer cookie

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-02-18 12:26:01 -08:00
Kai Reichart
47529ee246 docs: updated metrics docs to correct selector on servicemonitor for repo-server (#5545)
* updated metrics docs to correct selector

Signed-off-by: Kai Reichart <kai@reichart.dev>

* docs: updated metrics docs to correct selector on servicemonitor for repo-server

Signed-off-by: Kai Reichart <kai@reichart.dev>
2021-02-18 08:24:53 -08:00
Jan Gräfen
a4ee25b59d docs: Add FAQ entry about sealed secret health checks (#5539)
* docs: FAQ entry for SealedSecret health updates

Since certain version combinations of ArgoCD and
the sealed-secret controller might lead to
SealedSecrets being stuck in the Progressing
state, this commit adds an explanation and
possible work-arounds to the FAQ.

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Fix review findings

Signed-off-by: Jan Gräfen <223234+jangraefen@users.noreply.github.com>

* Add missing letter

Signed-off-by: Jan Gräfen <223234+jangraefen@users.noreply.github.com>
2021-02-18 11:00:39 +01:00
Abhishek Veeramalla
b2b5b50b09 chore: Add k8s 1.20.2 to test-e2e strategy matrix in CI (#5542)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2021-02-18 10:47:37 +01:00
Chetan Banavikalmutt
656bd51d55 feat: Clicking on filter bar should expand filter (#5488)
Fixes: #4790
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-02-17 10:52:39 -08:00
Abhishek Veeramalla
73edc0a652 fix: Exclude kube-root-ca.crt ConfigMap from Orphaned Resources monitoring by default (#5490) (#5523)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2021-02-17 11:25:21 +01:00
Abhishek Veeramalla
047d2e6c8e docs: correct the initialPasswordSecretName in docs (#5536)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2021-02-17 10:43:20 +01:00
Shubham Agarwal
e33b54decb fix: do not display empty tool version fields for server (#5531)
Signed-off-by: Shubham Agarwal <shubhamagarawal19@gmail.com>
2021-02-17 09:30:53 +01:00
Masaya Ozawa
2be1b8771a docs: fix link (#5534)
Signed-off-by: m3y <ma3ya.ozw+github@gmail.com>
2021-02-17 08:52:40 +01:00
Remington Breeze
ad923ba0c8 fix(ui): improve spacing of app status panel (#5528)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-16 13:47:14 -08:00
Alexander Matyushentsev
f54d372440 docs: add CII badge to README.md (#5527)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-16 10:58:20 -08:00
Alexander Matyushentsev
6e2ee623f8 feat: support token revocation (#5477)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-16 10:33:40 -08:00
Alexander Matyushentsev
ac5cfb9a60 docs: Updates docs for CII. (#5526)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-16 19:20:47 +01:00
Jan Gräfen
d342993c3f fix: Declarative helm repositories with missing secret causes all repositories in ArgoCD to lock (#3492) (#5363)
* Add test for get repository credentials

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Log error on missing repository credentials

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Fix import formatting

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Use connection state instead of logging

Just logging the error will be a bad user
experience, since it provides no direct feedback
as before.

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Fix test to check for connection state

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Do not expose technical message directly

Instead of displaying a technical error message
that might expose critical information about the
cluster, we only display a generic error message.
The actual error is then logged to the server
logged, so that an administrator can further
drill down into the problem

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Adapt tests to new error message

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Retrigger CI pipeline

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* See if I am actually the cause of this error

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Revert changes to evaluate CodeQL result

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Desperate attempt to find the cause of the CodeQL error

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Revert "Desperate attempt to find the cause of the CodeQL error"

This reverts commit a38ff650

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Fix first to review findings

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Propose a better function name and add docu

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Overwrite connection status for refresh as well

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>

* Fix goimports lint issue

Signed-off-by: Jan Graefen <223234+jangraefen@users.noreply.github.com>
2021-02-16 07:38:06 +01:00
Jacob Wernette
fd03eccfc8 docs: Add IBM to users (#5521)
Signed-off-by: Jacob Wernette <werne2j@gmail.com>
2021-02-15 16:45:00 +01:00
Remington Breeze
824ff732a2 fix(ui): Crash when syncing from applications sync panel (#5508)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-12 10:55:49 -08:00
Jared Clarke
65ecd87027 feat: Add health checks for kubernetes-external-secrets (#5435)
Signed-off-by: Jared Clarke <jared.clarke@eckoh.com>
2021-02-12 09:45:42 +01:00
Ajay Kemparaj
f53cbd5d0e fix: add the missing rbac resources to the documentation (#5476)
* Adds resources accounts and gpgkeys

Signed-off-by: ajayk <ajaykemparaj@gmail.com>
2021-02-12 09:44:28 +01:00
Chetan Banavikalmutt
6a19451d0b feat: Add health check for Sealed Secrets (#5503)
This commit adds a lua script, which updates the health status of an application based on sealed secret's status

Fixes: #4754

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-02-12 09:16:39 +01:00
Reed Palmer
11a42c3941 docs: Update USERS.md (#5498)
Add Recreation.gov to the list of users

Signed-off-by: Reed Palmer <reed.d.palmer@gmail.com>
2021-02-12 08:47:23 +01:00
Alexander Matyushentsev
3473005364 fix: remove duplicated code that sets 'container' query parameter (#5502)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-12 08:08:10 +01:00
Remington Breeze
aeeeac79fe fix(ui): Consolidate sync options (#5357)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-11 16:12:05 -08:00
jannfis
2d06b5077e chore: Make e2e tests work on K8s v1.20 (#5491)
* chore: Make e2e tests work on K8s v1.20

Signed-off-by: jannfis <jann@mistrust.net>

* Fix linter complaints

Signed-off-by: jannfis <jann@mistrust.net>
2021-02-11 12:00:36 -08:00
Viktor Farcic
29850811c7 docs: video (#5493)
* docs: PRs with Argo CD and Codefresh

Signed-off-by: Viktor Farcic <viktor@farcic.com>

* Video

Signed-off-by: Viktor Farcic <viktor@farcic.com>
2021-02-11 20:20:31 +01:00
Remington Breeze
4a06699a6a chore: Add reminder to PR template to link auto close issue (#5496) 2021-02-11 10:47:42 -08:00
Alexander Matyushentsev
e01703ba3a fix: refreshing label and orphaned resource filter are hidden by page header (#5495)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-11 10:25:32 -08:00
Remington Breeze
b7e6dcf085 fix(ui): Don't try to show helm metadata (#5494)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-11 09:22:04 -08:00
Alexander Matyushentsev
223335d96e feat: support viewing logs of multiple pods in UI (#5469)
* feat: support viewing logs of multiple pods in UI

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-10 17:58:13 -08:00
Remington Breeze
fb8096a1f7 feat(ui): Status panel labels (#5458)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-09 18:09:17 -08:00
Victor Boissiere
e0f7731fee feat(prom): Add prometheus metrics reset support #5287 (#5304)
* feat(prom): Add prometheus metrics reset support

Signed-off-by: Victor Boissiere <victor.boissiere@gmail.com>
2021-02-09 17:27:08 -08:00
J. Mark Pim
c540b719cf chore: Remove usages of k8s.io/kubernetes (#4055) (#5434)
* chore:Remove usages of k8s.io/kubernetes

Signed-off-by: Mark Pim <j.mark.pim@gmail.com>

* Linting fix

Signed-off-by: Mark Pim <j.mark.pim@gmail.com>
2021-02-09 17:12:43 -08:00
Yujun Zhang
137ff39293 fix(cli): format appURL from server settings (#5333) (#5449)
* fix(cli): format appURL from server settings (#5333)

Signed-off-by: Yujun Zhang <yujunz@nvidia.com>

* fix(cli): fallback to client options if URL is not set

Signed-off-by: Yujun Zhang <yujunz@nvidia.com>
2021-02-09 17:01:22 -08:00
kshamajain99
1d1fbf0fb1 fix invalid external url (#5396)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-02-09 13:06:42 -08:00
Ishita Sequeira
366b7ff364 chore: dockerized *-docs Makefile commands - #4662 (#5459)
* feat: Dockerized *-docs Makefile commands

Signed-off-by: ishitasequeira <isequeir@redhat.com>

* removed the deprecated target(publish-docs) and added a local build and serve target

Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-02-09 18:27:22 +01:00
Sho Okada
e22da4a941 fix: Log output fails when JSON logging is enabled (#4911) (#5446)
Signed-off-by: Sho Okada <shokada3@gmail.com>
2021-02-08 16:06:18 -08:00
Alexander Matyushentsev
685f15b695 chore: github actions should use versions from docs/requirements.txt while building docs (#5460)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-08 22:57:55 +01:00
Alexander Matyushentsev
b8adbf0818 docs: replace https://argoproj.github.io/argo-cd/ with https://argo-cd.readthedocs.io/ (#5457)
* docs: replace https://argoproj.github.io/argo-cd/ with https://argo-cd.readthedocs.io/

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-08 10:39:56 -08:00
Chetan Banavikalmutt
8eec7b360f fix: Update the UI link in e2e tests doc (#5447)
UI for the argocd e2e test server will be available on port 4000. This patch updates the link in e2e tests to use 4000 instead of 8080.

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2021-02-08 09:58:26 -08:00
May Zhang
ae3de246fd feat: get pod logs (#5311)
* feat: get pod logs sequential

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: check in the md file

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: get pod logs

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix conflicts

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: added timeout for test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: update doc

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: update test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: add unit test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: add unit test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix merge conflict

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: add e2e test

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: clone query

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: rename tail-lines to tail

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix when to send last message status

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: retry on the client side

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: fix lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: if --follow, keep retry

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: added two more flags for CLI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: added two more flags for CLI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: added two more flags for CLI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: added two more flags for CLI

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: error return when there are more than 10 pods to render.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: if podname is present, use the same flow as if query by resource kind

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-02-08 09:27:24 -08:00
Joao Paulo Bastos
e4165d01b8 docs: add Octadesk to USERS.md (#5455)
Signed-off-by: João Paulo Bastos <joao.bastos@octadesk.com>
Signed-off-by: joaopaulosr95 <joaopaulosr95@gmail.com>
2021-02-08 09:19:09 -08:00
Josh Soref
2d79d97b44 chore: Fix markdown (#5438)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2021-02-08 09:18:35 -08:00
Remington Breeze
bb15a4996e fix(ui): Only connect edges between resources in the same namespace (#5430)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-05 16:54:45 -08:00
matthewhembree
33bf9901ce fix: Remove empty fields from argocd-redis-ha. Fixes #5371 (#5399)
Signed-off-by: Matthew Hembree <matthew_hembree@yahoo.com>
2021-02-05 16:35:40 -08:00
Remington Breeze
3c3325f3e7 feat: add source repos to fields inherited from global projects (#5417)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-05 11:48:47 -08:00
Remington Breeze
c936355508 fix(ui): Add header and browser title to fullscreen logs viewer (#5419)
Signed-off-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
2021-02-05 08:22:44 -08:00
Alexander Matyushentsev
161d1d777d fix: version info should be avaialble if anonymous access is enabled (#5422)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-04 18:39:31 -08:00
Alexander Matyushentsev
f0d8129ea0 fix: fix issues discovered by sonarcloud (#5416)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-04 17:53:53 -08:00
kshamajain99
d9e9a9939d fix: disable jwt claim audience validation #5381 (#5413)
* fix: disable audience validation

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>

* update other places

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-02-04 16:38:12 -08:00
Alexander Matyushentsev
8f5379e1cc fix: /api/version should not return tools version for unauthenticated requests (#5415)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-04 16:03:56 -08:00
Alexander Matyushentsev
85ffe1c4bf fix: account tokens should be rejected if required capability is disabled (#5414)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-04 15:45:49 -08:00
Alexander Matyushentsev
8014cf3c03 feat: set X-XSS-Protection while serving static content (#5412)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-04 15:27:31 -08:00
Regina Scott
bef46390ea fix: overriding version logic in warning banner (#5410)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-02-04 12:53:16 -08:00
Regina Scott
c160a7140e feat: add versioning to argocd docs (#5099)
* feat: add versioning to argocd docs

Signed-off-by: Regina Scott <rescott@redhat.com>

* make default branch stable, provide warning for latest

Signed-off-by: Regina Scott <rescott@redhat.com>
2021-02-04 12:06:29 -08:00
Markus Hinz
7dfc439086 feat: Add Access-Control-Allow-Origin: * response header to badges (#5395)
Signed-off-by: Markus Hinz <markus.hinz@syncier.com>
2021-02-04 09:38:24 -08:00
Tianhe Zhang
564a1221b3 docs: add Orbital Insight to USERS.md (#5405)
Signed-off-by: Tianhe Zhang <tianhe.zhang@orbitalinsight.com>
2021-02-03 23:36:49 -08:00
Alexander Matyushentsev
20ed703e03 fix: tokens keep working after account is deactivated (#5402)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-03 16:24:36 -08:00
Ishita Sequeira
8da699f177 fix: autocomplete filter to make it case insensitive #5152 (#5400)
Signed-off-by: ishitasequeira <isequeir@redhat.com>
2021-02-03 15:06:42 -08:00
Alexander Matyushentsev
9bf7ae378f refactor: upgrade helm to 3.5.1 (#5385)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-02 16:07:13 -08:00
Alexander Matyushentsev
b29c56aaf1 fix: k8s client version is blank after removing client binary (#5386)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-02 16:07:02 -08:00
Alexander Matyushentsev
a85f8e89f5 fix: a request which was using a revoked project token, would still be allowed to perform requests allowed by default policy (#5378)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-02 15:26:20 -08:00
Keith Chong
bc4fba3f1b feat: Show number of pod restarts in the argo ui (5041) (#5384)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2021-02-02 15:18:35 -08:00
Alexander Matyushentsev
065e5b9306 fix: correctly sort events by lastTimestamp field (#5383)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-02 15:15:46 -08:00
Remington Breeze
d6d534a94e feat(ui): User defined information banner (#5299)
Signed-off-by: Remington Breeze <remington@breeze.software>
Co-authored-by: gaganeggday <gh1268@rit.edu>
2021-02-02 12:24:43 -08:00
kshamajain99
0cc4fc2b15 update external link doc (#5377)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-02-02 11:34:48 -08:00
Alexander Matyushentsev
82b74d274d chore: image Github actions workflow should override quay.io/argoproj/argocd image (#5379)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-02-02 11:32:49 -08:00
Remington Breeze
5d5cd742c0 fix(ui): Overlapping buttons at narrow screen widths (#5259)
* fix(ui): Prevent overlap of toolbar items with narrow browser windows. Other narrow window related fixes

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-02-02 09:53:11 -08:00
jannfis
f7c2b886db chore: Bring back kubectl to test-tools-image (#5369)
Signed-off-by: jannfis <jann@mistrust.net>
2021-02-01 17:58:15 -08:00
kshamajain99
baa0f2e39c feat: selective sync (#3877) (#5347)
* selective sync

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-01-29 12:26:47 -08:00
Alexander Matyushentsev
21670820a4 refactor: optimize argocd-application-controller redis usage (#5345)
* refactor: controller uses two level caching to reduce number of redis calls

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-29 11:42:40 -08:00
Amit Rout
5d1bbb13f8 fix: Update argocd login command example (#5352)
Signed-off-by: arout <arout@redhat.com>
2021-01-29 15:41:51 +01:00
Regina Scott
5f10461034 fix: minor cleanup for wording in cli and docs (#5321)
* fix: various docs grammar fixes

Signed-off-by: Regina Scott <rescott@redhat.com>
2021-01-28 14:46:57 -08:00
kshamajain99
420c1705ae docs: instructions on how to add external link (#5330)
* doc on external link instructions

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>

* add to mkdocs

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-01-28 14:03:16 -08:00
Thomas Decaux
0382763367 docs: Update next MS to 1.9 (#5332)
Signed-off-by: Thomas Decaux <ebuildy@gmail.com>
2021-01-28 13:10:03 -08:00
Dewan Ishtiaque Ahmed
5e7c68c8fc docs: Remove stale warning banner (#5346)
fixes https://github.com/argoproj/argo-cd/issues/5025

Signed-off-by: Dewan Ahmed <dewan.ishtiaque@hotmail.com>
2021-01-28 12:08:55 -08:00
Remington Breeze
076924dd77 fix(ui): Various minor UI fixes (#5337)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-27 17:47:05 -08:00
Remington Breeze
abf78a3c4c feat(ui): Open pod logs in an isolated new tab (#5323)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-27 17:18:53 -08:00
Remington Breeze
3967baf0c9 feat: Prevent unnecessary controller diffing with caching (#5255)
Signed-off-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-27 16:13:29 -08:00
Remington Breeze
32642dfb1b feat(ui): Filterable pod logs (#5319)
* feat(ui): Filterable pod logs

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-27 15:48:37 -08:00
Alexander Matyushentsev
00f53b510d feat: Logs should favor containers over init containers (#4345) (#5322)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-26 15:26:01 -08:00
Alexander Matyushentsev
7165b45aea fix: consistently display information about 'compared to' and 'synced to' revisions (#5313)
* fix: consistently display information about 'compared to' and 'synced to' revisions

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* apply review notes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-26 13:22:48 -08:00
Alexander Matyushentsev
d516f4754f fix: fix fetching commit SHAs (#5312) (#5320)
Signed-off-by: Alexander Matyushentsev <Alexander_Matyushentsev@intuit.com>
2021-01-26 12:59:51 -08:00
Alexander Matyushentsev
d8b545d107 fix: improve fetching commit SHAs (#5312)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-25 23:13:27 -08:00
Remington Breeze
dbadd74b42 feat(ui): New pod logs viewer (#5233)
feat(ui): New pod logs viewer (#5233)
2021-01-25 11:48:49 -08:00
nishant-d
e02b8646c9 docs: add user Devtron labs (#5300)
Signed-off-by: nishant <nishant@devtron.ai>
2021-01-23 20:52:05 -08:00
jannfis
b2a3918005 fix: Use correct API version when generating app and project manifests (#5301)
Signed-off-by: jannfis <jann@mistrust.net>
2021-01-23 20:50:54 -08:00
May Zhang
d95e35fcab feat: turn on grpc-web (#5288)
* turn on grpc-web

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: turn on grpc-web

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: turn on grpc-web

Signed-off-by: May Zhang <may_zhang@intuit.com>

* feat: add warning message.

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-01-21 18:17:54 -08:00
Snyk bot
bacddacbcf fix: ui/package.json & ui/yarn.lock to reduce vulnerabilities (#5239)
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-NODESASS-1059081
2021-01-21 17:06:11 -08:00
jannfis
166d0cc68b docs: Clarify RBAC requirements for GnuPG (#5294)
* docs: Clarify RBAC requirements for GnuPG

Signed-off-by: jannfis <jann@mistrust.net>

* Fix

Signed-off-by: jannfis <jann@mistrust.net>
2021-01-21 15:09:53 -08:00
Abhishek Veeramalla
eaf9887d17 fix: Remove kubectl binary from argo image(#5005) (#5101)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2021-01-21 09:49:51 -08:00
kshamajain99
1ee7997fb8 fix dev image and update doc (#5285)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-01-21 09:28:34 -08:00
kshamajain99
7af5837ffa build consolidated argocd binary (#5247)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-01-20 11:28:06 -08:00
Alexander Matyushentsev
9dd5dd2f83 fix: directory source include/exclude should match relative file path (#5277)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-20 09:12:49 -08:00
Matt Veitas
41fb0ac2de feat: Allow GetRevisionMetadata to use truncated sha revision (#5265)
Signed-off-by: Matt Veitas <matt.veitas@everbridge.com>
2021-01-19 20:14:18 -08:00
Tom Wieczorek
54716ac0ed fix: app create with -f ignored labels from file (#5268)
Since v1.7.5, argocd app create -f doesn't use any labels specified
inside the application file anymore. Refactor the SetLabels funcion to
merge labels specified in the file with those from the command line
arguments. Extend the existing e2e test to verify that behavior.

Signed-off-by: Tom Wieczorek <t.wieczorek@yieldlab.de>
2021-01-19 14:51:48 -08:00
Evan Lowry
67d15ce05c docs: update AWS auth information in security.md (#5274)
In PR #3010 the method of authentication w/ AWS changed. The previous method was still referenced in the docs.

Signed-off-by: Evan Lowry <elowry@beyondtrust.com>
2021-01-19 14:13:45 -08:00
Tom Wieczorek
a12f805bb2 fix: locale-independent gpg output parsing (#5269)
Explicitly specify the "C" language during the invocation of the gpg
binary. That way, parsing its output is more robust on non-english
systems.

Signed-off-by: Tom Wieczorek <t.wieczorek@yieldlab.de>
2021-01-18 21:04:06 +01:00
jannfis
ae6b8241d5 fix: Prevent possible nil pointer dereference in project API (#5263)
Signed-off-by: jannfis <jann@mistrust.net>
2021-01-17 22:38:14 -08:00
Regina Scott
e26ad305b4 fix: expand button spacing issue (#5258)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-01-15 14:42:45 -08:00
Regina Scott
534ec17b3c fix: commit message overflows box (#5043) (#5241)
Signed-off-by: Regina Scott <rescott@redhat.com>
Co-authored-by: Remington Breeze <remington@breeze.software>
2021-01-15 13:26:06 -08:00
Jorge López Zarza
ac7dbfe81f fix: remove unnecessary colons (#5254)
Signed-off-by: Jorge López <j.lopezarza@gmail.com>
2021-01-15 09:03:14 -08:00
Regina Scott
5037a652f6 fix: use red spinner for terminating animation (#5252)
Signed-off-by: Regina Scott <rescott@redhat.com>
2021-01-15 05:49:21 -08:00
Remington Breeze
81497bbcf1 fix(ui): Pod view tooltips positioned incorrectly (#5244)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-13 14:31:45 -08:00
Alexander Matyushentsev
c9c8befa45 refactor: upgrade gitops-engine version (closes #4627) (#5235)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-13 11:12:28 -08:00
Remington Breeze
2f080e14f9 fix(ui): Improve pod view with better space efficiency (#5238)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-12 20:54:00 -08:00
Alexander Matyushentsev
64e1c3825a fix: make sure JWT token time fields contain only integer values (#5228)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-11 13:59:34 -08:00
jannfis
ffb8ce22ee chore: Change installation manifests to pull images from quay.io (#5227)
* chore: Update manifests to point to quay.io

Signed-off-by: jannfis <jann@mistrust.net>

* Set image also in kustomize bases

Signed-off-by: jannfis <jann@mistrust.net>

* make manifests

Signed-off-by: jannfis <jann@mistrust.net>

* Also update for Dex init container

Signed-off-by: jannfis <jann@mistrust.net>

* Adapt upgrade docs to reflect new registry

Signed-off-by: jannfis <jann@mistrust.net>
2021-01-11 22:28:16 +01:00
Alexander Matyushentsev
27a609fb1a fix: controller should load application related nodes from target cluster (#5208)
* fix: controller should load application related nodes from target cluster

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* fix: make sure node capasity and pod requests are in same unit, improve unit formatting

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* fix: application hosts should include info about resources requested by app neighbors

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* apply reviewer notes

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-11 12:35:47 -08:00
jannfis
1771d9fd78 chore: Also push container images to quay.io (#5226)
Signed-off-by: jannfis <jann@mistrust.net>
2021-01-11 21:24:15 +01:00
Kostis (Codefresh)
da42028c8c docs: Two new blog posts (#5213)
Signed-off-by: Kostis Kapelonis <kostis@codefresh.io>
2021-01-09 11:37:54 -08:00
kshamajain99
0f233c072b updating cluster drops secret (#5220)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-01-09 11:36:38 -08:00
kshamajain99
98bec61d61 feat: Include argocd-util as part of release artifacts(#5174) (#5203)
* Publish argocd-util

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>

* Don't add util to argocd-image

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2021-01-08 08:05:38 +01:00
May Zhang
f5b9704267 feat: prune last (#5199)
* feat: prune last
fixes: #5080.
If sync option has PruneLast=true, or individual resource has annotation argocd.argoproj.io/sync-options: PruneLast=true, these prune tasks get assigned with a new sync wave.

the new sync wave is the last sync wave of non-prune tasks which is in sync phase + 1, so that these resources will be pruned after all sync phase resources are synced and healthy.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: go mod tidy

Signed-off-by: May Zhang <may_zhang@intuit.com>
2021-01-06 14:13:02 -08:00
jannfis
eb9216f8e1 chore: Upgrade gorilla/handlers and gorilla/websocket (#5186)
* chore: Upgrade gorilla/handlers and gorilla/websocket

Signed-off-by: jannfis <jann@mistrust.net>

* go mod tidy

Signed-off-by: jannfis <jann@mistrust.net>
2021-01-06 11:26:04 +01:00
jannfis
f4c9c3db59 fix: Generate initial admin password in a more secure manner (#5138)
* fix: Generate initial admin password in a more secure manner

Signed-off-by: jannfis <jann@mistrust.net>

* Make CreateOrUpdateSecret method public

Signed-off-by: jannfis <jann@mistrust.net>
2021-01-06 10:44:37 +01:00
Alexander Matyushentsev
dfcbddf605 refactor: upgrade gitops-engine and k8s deps to v0.20.1 (#5194)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-06 00:07:46 -08:00
Alexander Matyushentsev
da6bd1138d fix: remove invalid assumption about OCI helm chart path (#5179)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-06 00:07:24 -08:00
Remington Breeze
b0819691d3 fix(ui): Group by node in pod view not working due to using label rather than metadata.name (#5191)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-05 16:33:20 -08:00
Remington Breeze
9c597acaac fix(ui): Overflowing info items for pods belonging to nodes with long names (#5190)
Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-05 16:12:54 -08:00
jannfis
14b8e3da66 chore: Switch Docker base image to ubuntu:20.10 instead of debian:10-slim (#5185)
Signed-off-by: jannfis <jann@mistrust.net>
2021-01-05 14:16:54 -08:00
Remington Breeze
5d6b3216f5 feat(ui): Pod view (#5091)
* feat(server): Pod view server (#5089)

Signed-off-by: Remington Breeze <remington@breeze.software>
2021-01-05 12:28:14 -08:00
jannfis
b314824e31 chore: Upgrade jwt-go to 4.0.0-preview1 (#5184)
Signed-off-by: jannfis <jann@mistrust.net>
2021-01-05 19:12:50 +01:00
Alexander Matyushentsev
49b2e034cf docs: document ARGOCD_EXEC_TIMEOUT environment variable (#5180)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-05 14:48:37 +01:00
Arthur Koziel
cee02b7dac docs: add blog post about setting up Argo CD with Helm (#5177)
Signed-off-by: Arthur Koziel <arthur@arthurkoziel.com>
2021-01-04 22:57:17 -08:00
jovianx-dev
eac50fcb22 Add JovianX to USERS.md (#5171) 2021-01-04 14:30:41 -08:00
Yujun Zhang
ad1dd825c6 feat: support fetch refs (#4893)
Signed-off-by: Yujun Zhang <yujunz@nvidia.com>
2021-01-04 10:19:00 -08:00
Alexander Matyushentsev
3b87781003 fix: add liveness probe to restart repo server if it fails to server tls requests (#5110) (#5119)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2021-01-04 10:02:15 -08:00
Masaya Aoyama (@amsy810)
7d277dc042 feat: implement include filter for directory settings (#5166)
modified files are following (others are automatically generated)
* cmd/util/app.go
* pkg/apis/application/v1alpha1/types.go
* reposerver/repository/repository.go
* util/argo/argo.go
* test/e2e/app_management_test.go

Signed-off-by: MasayaAoyama <amsy810@gmail.com>
2021-01-03 19:17:42 -08:00
jannfis
ddecca412c chore: Remove stray debug Printf() from CLI (#5163)
Signed-off-by: jannfis <jann@mistrust.net>
2021-01-01 16:16:00 -08:00
Nadav Shatz
19ec893118 Add Tailor Brands to USERS.md (#5143)
Signed-off-by: Nadav Shatz <nadav@tailorbrands.com>
2020-12-31 09:18:35 -08:00
jannfis
36204efcc9 fix: Possible nil pointer dereference in repocreds API (#5130)
Signed-off-by: jannfis <jann@mistrust.net>
2020-12-30 10:32:29 -08:00
jannfis
94eba091ba fix: Possible nil pointer dereference in repository API (#5128)
Signed-off-by: jannfis <jann@mistrust.net>
2020-12-27 14:19:26 -08:00
kshamajain99
12ec99ad01 feat: declarative config for cluster and repo(#4734) (#5102)
* Declarative config for cluster and repo

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>

* Review comments

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2020-12-23 14:15:05 -08:00
Liviu Costea
30ffe8de71 refactor(jwt): use typed access to claims (#5075)
Signed-off-by: Liviu Costea <email.lcostea@gmail.com>
2020-12-22 10:30:12 -08:00
Noah Kantrowitz
5b464c996b feat: Add resource.Quantity as a known field type for diffing. (#5095)
Signed-off-by: Noah Kantrowitz <noah@coderanger.net>
2020-12-21 14:04:32 -08:00
Tamas Kozma
cfdf1db4a1 docs: fix Validate sync option description (#5093)
Signed-off-by: Tamas Kozma <tkozma@users.noreply.github.com>
2020-12-21 14:02:04 -08:00
jannfis
8bd59530e8 fix: Allow correct SSO redirect URL for CLI static client (#5098)
Signed-off-by: jannfis <jann@mistrust.net>
2020-12-21 13:43:17 -08:00
Josh Soref
45b3e48dfc fix: /!\ icon for overridden parameters should be gavel (#5085) (#5087)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-12-18 09:08:35 -08:00
Keith Chong
14cf261f48 feat: Add locator for delete app confirmation field for UI tests (#4393) (#5074)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-12-17 13:58:33 -08:00
William Tam
554c39dc34 fix: correct name for argocd-redis-ha-haproxy role/role binding (#5078)
* correct name for argocd-redis-ha-haproxy role/role binding
Signed-off-by: William Tam <email.wtam@gmail.com>

* Trim  trailing spaces
Signed-off-by: William Tam <email.wtam@gmail.com>
2020-12-16 14:21:50 -08:00
Cory Jacobsen
456f637196 docs: add 7shifts to users list (#5073)
Signed-off-by: Cory Jacobsen <cory@unrolled.ca>
2020-12-16 14:16:47 -08:00
Regina Scott
4bcdfbe1a9 fix: Various typing errors and general docs improvements (#5066)
Signed-off-by: Regina Scott <rescott@redhat.com>
2020-12-16 16:23:44 +01:00
kshamajain99
1734b46f71 feat: Generate declarative config for app and appproj (#4734) (#5014)
* Generate declarative config for app and appproj
2020-12-15 13:23:54 -08:00
May Zhang
d2295d45d0 fix: add grpc health check (#5060)
* fix: add grpc health check

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fixing lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: fixing lint error

Signed-off-by: May Zhang <may_zhang@intuit.com>
2020-12-15 10:35:53 -08:00
Arpan Balpande
e3e392c058 Update sync-waves.md (#5062)
Corrected the typo in line number 9 from "than" to "that".
2020-12-15 08:52:08 -08:00
jannfis
b2284379dd feat: Application specific parameter override files (#5038)
* feat: Support application specific parameter override files

Signed-off-by: jannfis <jann@mistrust.net>
2020-12-15 08:51:02 -08:00
Josh Soref
d4ef744454 chore: sort USERS.md (#5057)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-12-14 16:55:31 -08:00
Keith Chong
09a1bf4644 feat: App list filter counters and labels should dynamically update (#4822)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-12-14 16:54:33 -08:00
jannfis
e08e0d29bb chore: Update Dex to v2.27.0 (#5058)
Signed-off-by: jannfis <jann@mistrust.net>
2020-12-14 14:38:31 -08:00
Tadayuki Onishi
fba23d9e45 Support multibyte for truncate string functions (#5055)
Signed-off-by: kenchan0130 <tt.tanishi100@gmail.com>
2020-12-14 09:56:11 -08:00
Keith Chong
e1990faf67 fix: Prompt for name for managed resources only when deleting (#5033) (#5049)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-12-14 09:19:49 -08:00
Keith Chong
1f7ef07512 fix: Correct Revision History Limit tooltip (#3534) (#5050)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-12-14 07:48:31 +01:00
Josh Soref
e160afc225 chore: change version to 1.9.0 (#5045)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-12-13 12:30:35 -08:00
Alexander Matyushentsev
9e61354fa2 fix: setting 'revision history limit' errors in UI (#5035)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-11 08:50:32 -08:00
Jesse Suen
696bf8be7c chore: issue template config.yaml was improperly named (#5032)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-12-10 15:26:04 -08:00
Jesse Suen
68f316137b chore: direct users to ask questions on GitHub discussions (#5028)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-12-10 14:06:59 -08:00
Regina Scott
e472678815 fix: Capitalization in toc (#5024)
Signed-off-by: Regina Scott <rescott@redhat.com>
2020-12-10 22:33:01 +01:00
Grant Isdale
ca1235a21d docs(fix): note not rendering correctly on user-management/auth0 page (#5019)
* docs(fix): note not rendering correctly on user-management/auth0 page

Add newline under `note` to try fix rendering of note component from my previous commit on user-management/auth0 page of the docs

Signed-off-by: Grant Isdale <44140736+grantisdale@users.noreply.github.com>

* docs(fix): fix note section at the bottom of Auth0 SSO page

Signed-off-by: Grant Isdale <44140736+grantisdale@users.noreply.github.com>
2020-12-10 13:04:59 -08:00
dependabot[bot]
d7a5257094 chore(deps): bump ini from 1.3.5 to 1.3.7 in /ui (#5027)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-10 12:37:42 -08:00
Keith Chong
3d019a22c2 feat: Cascade delete option is ticked by default (#3205) (#4994)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-12-10 11:56:19 -08:00
Alexander Matyushentsev
85ea4c445e fix: add api-server liveness probe that catches bad data in informer (#5026)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-10 11:48:27 -08:00
k.bigwheel
13eefd8292 docs: Fix configmap name in doc (#5022)
Signed-off-by: bigwheel <k.bigwheel+eng@gmail.com>
2020-12-10 16:14:45 +01:00
Abhishek Veeramalla
89a8751216 fix: argocd-test-server does not get removed/deleted upon SIGINT(#4969) (#5018)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2020-12-10 08:04:32 +01:00
Alexander Matyushentsev
dcf2694285 fix: sync retry is broken for multi-phase syncs (#5017)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-09 18:05:34 -08:00
James Callahan
8b486b5e0f fix: typo in dashboard (#5015)
Signed-off-by: James Callahan <jamescallahan@bitgo.com>
2020-12-09 16:53:24 -08:00
Grant Isdale
1ef14dca83 docs: provide clearer docs on storing clientSecrets when using SSO (#5012)
Signed-off-by: Grant Isdale <44140736+grantisdale@users.noreply.github.com>
2020-12-09 14:21:01 -08:00
jannfis
b955c6a7a4 chore: Update grpc-gateway to v1.16.0 (#5011)
Signed-off-by: jannfis <jann@mistrust.net>
2020-12-09 20:33:54 +01:00
Isaac Gaskin
27912a08f1 feat: adding print statements to cli "rm" commands (#5009)
also standardizing on capitalization of add/remove command print statements

Signed-off-by: Isaac Gaskin <igaskin@tesla.com>
2020-12-09 09:34:35 +01:00
May Zhang
fdb5ada06d fix: Revert "feat: Add health check for HPA (#4915)" (#5006)
* Revert "feat: Add health check for HPA (#4915)"

This reverts commit f6a32a9e

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: revert health check

Signed-off-by: May Zhang <may_zhang@intuit.com>

* fix: remove extra line

Signed-off-by: May Zhang <may_zhang@intuit.com>
2020-12-08 16:32:20 -08:00
Lionel Houssou
9b53f8f93a docs: add user Energisme (#5001)
Signed-off-by: lhoussou <lionel.houssou@energisme.com>
2020-12-08 10:14:46 -08:00
Alexander Matyushentsev
bb7bdbab9b fix: infer app destination server in indexer to prevent concurrent app object modification (#4993)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-08 08:45:37 -08:00
Alexander Matyushentsev
3114fdde80 chore: fix flaky TestCRDStatusSubresourceAction e2e test (#4996)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-08 07:29:06 -08:00
Jeremy Mouton
73f75df173 docs: Add Spendesk user (#5000)
Signed-off-by: Labbs <moutonjeremy@labbs.fr>
2020-12-08 07:25:09 -08:00
Abhishek Veeramalla
6b8867a582 fix: sync repository certificates UI with other pages(#4609) (#4971)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2020-12-07 23:30:29 -08:00
Regina Scott
9ea1163411 fix: Change icons so that there will be no two identical icons together (#4977)
Signed-off-by: Regina Scott <rescott@redhat.com>
2020-12-07 19:54:44 -08:00
Alexander Matyushentsev
3b67e91d55 fix: prevent short-circuit during env variable substitution (#4984)
* fix: prevent short-circuit during env variable substitution

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

* improve expansion logic

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-07 11:22:14 -08:00
Abhishek Veeramalla
b7b74582cb fix: make start fails to start webpack-dev-server(#4968) (#4990)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2020-12-07 16:24:08 +01:00
Lapi
ea73f093e8 docs: Add url parameter in example of Auth0 setting (#4989)
* Add url parameter in example of Auth0 setting

Signed-off-by: Ayato Tachibana <tyoutugai.7@gmail.com>

* docs: Add url parameter in example of Auth0 setting

Signed-off-by: Ayato Tachibana <tyoutugai.7@gmail.com>
2020-12-07 10:47:48 +01:00
htgeis
75eed3961c docs: Fix wrong commands in user guide (#4982)
Signed-off-by: jingwei.su <6914259+htgeis@users.noreply.github.com>

Co-authored-by: jingwei.su <jingwei.su@hulu.com>
2020-12-06 14:37:48 +01:00
Josh Soref
9fb51f7af6 Grammar (#4986)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-12-05 18:57:07 -08:00
Josh Soref
869af3e2fe feat(ui): replicaset children of deployment should sort by revision (#4249) (#4252)
* feat(ui): replicaset children of deployment should sort by revision #4249

* fix: export and test compareNodes

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* feat: use info["name"="Revision"].value

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-12-05 18:55:51 -08:00
Alexander Matyushentsev
991894e305 fix: update helm version help text (#4976)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-04 11:21:17 -08:00
Jonah Back
0ebde72d6a docs: Add example for using ALB with GRPC (#4974)
* docs: add example for using ALB with GRPC

Signed-off-by: Jonah Back <jonah@jonahback.com>

* docs: address review comments

Signed-off-by: Jonah Back <jonah@jonahback.com>
2020-12-04 18:52:34 +01:00
kshamajain99
f05ac0cb3a list applications filter by name (#4959)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2020-12-04 09:48:48 -08:00
IliaGe
6863838917 Update okta.md (#4943) 2020-12-03 16:30:16 -08:00
Kenneth Tan Xin You
75601a7177 Update getting_started.md (#4870) 2020-12-03 15:49:30 -08:00
Osama Nabil
5c268b9af9 use correct command to list kubeconfig contexts (#4804)
Signed-off-by: hacktron95 <hacktron95@gmail.com>
2020-12-03 15:26:34 -08:00
Denis Jajčević
a516ffedba Update USERS.md (#4916)
Add https://croz.net/
2020-12-03 15:23:47 -08:00
Keith Chong
c36b7ce4bd fix: Design Flaw leading to errant delete (#4844) (#4909)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-12-03 15:18:51 -08:00
Mya Pitzeruse
d804e81e1f added blog post on argo-cd and renovate (#4970)
Signed-off-by: Mya Pitzeruse <j.mya.pitz@gmail.com>
2020-12-03 13:26:54 -08:00
jannfis
230bafd3c3 chore: Update PR template to include notes on DCO (#4966)
* chore: Update PR template with DCO instructions

Signed-off-by: jannfis <jann@mistrust.net>

* Move note to top

Signed-off-by: jannfis <jann@mistrust.net>
2020-12-03 20:03:15 +01:00
Shoubhik Bose
da929c2796 docs: fix typo in user management doc (#4962)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2020-12-03 19:26:10 +01:00
Alexander Matyushentsev
4417cc8180 fix: use json serialization to store cache instead of github.com/vmihailenco/msgpack (#4965)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-03 10:24:47 -08:00
Shoubhik Bose
5f46815469 docs: The default realm is master (#4963)
Signed-off-by: Shoubhik Bose <shbose@redhat.com>
2020-12-03 19:16:57 +01:00
Michael Goodness
d82f6b425a fix(repository.go): rename .argocd-source.yaml in error message (#4964)
Signed-off-by: Michael Goodness <michael.goodness@mlb.com>
2020-12-03 08:37:40 -08:00
Alexander Matyushentsev
7b0fe7bffb increase cache version (#4957)
Signed-off-by: Alexander Matyushentsev <Alexander_Matyushentsev@intuit.com>
2020-12-02 17:04:55 -08:00
Maxime Brunet
d766a82185 chore: Upgrade go-jsonnet to v0.17.0 (#4891)
* chore: Upgrade go-jsonnet to v0.17.0

Signed-off-by: Maxime Brunet <max@brnt.mx>

* Fix vm.EvaluateSnippet is deprecated

Use EvaluateFile or EvaluateAnonymousSnippet instead.

Signed-off-by: Maxime Brunet <max@brnt.mx>

* Do not read Jsonnet files

Signed-off-by: Maxime Brunet <max@brnt.mx>
2020-12-02 17:04:05 -08:00
Alexander Matyushentsev
cfbd535904 fix: reset cached manifest generation errors after 1hr instead of 12 requests (#4953)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-02 13:36:26 -08:00
Alexander Matyushentsev
2b50698987 fix: cache missing app path and commit verification errors (#4947)
* fix: cache missing app path and commit verification errors

Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-02 12:12:53 -08:00
Alexander Matyushentsev
3bf3ac7e21 fix: upgrades github.com/vmihailenco/msgpack/v5 to fix #4933 (#4952)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-02 12:05:32 -08:00
Jesse Suen
708adaff60 docs: add Argo CD demo video (#4948)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-12-02 08:40:54 -08:00
Abhishek Veeramalla
dc13884f4b fix: Include Headers in login clientopts (#4918) (#4941)
Signed-off-by: iam-veeramalla <abhishek.veeramalla@gmail.com>
2020-12-02 08:08:08 -08:00
Jesse Suen
854c8a6f98 fix: rollout health could incorrectly report v0.9 rollouts as Progressing (#4949)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-12-02 08:07:00 -08:00
Chetan Banavikalmutt
ee28288d50 feat: Display creation time in application node and summary (#4920)
This PR adds the creation time as a bubble to the root node in network view. It also adds CREATED_AT field to the application summary page

Fixes: #4903

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2020-12-01 14:14:55 -08:00
Chetan Banavikalmutt
f6a32a9ebc feat: Add health check for HPA (#4915)
HorizontalPodAutoscaler uses annotations to store conditions. This commit adds a custom heath check that parses the conditions from annotation and creates health status.

Fixes: #4413

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2020-12-01 09:44:10 -08:00
Alexander Matyushentsev
c108e2f061 fix: correctly compare application destinations with inferred cluster URL (#4937)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-01 09:35:32 -08:00
Chetan Banavikalmutt
6095fc564f feat: Add a keyboard shortcut to move focus to search (#4796)
Fixes: #4700
Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2020-12-01 09:34:52 -08:00
Alexander Matyushentsev
6e1649b1e2 refactor: upgrade helm to v3.4.1 (#4938)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-12-01 09:34:21 -08:00
jannfis
b89639e921 feat: argocd-util can now validate RBAC configuration (#4876)
* feat: argocd-util can now validate RBAC configuration

Signed-off-by: jannfis <jann@mistrust.net>

* feat: argocd-util can now validate RBAC configuration

Signed-off-by: jannfis <jann@mistrust.net>

* Validate user policy before loading it

Signed-off-by: jannfis <jann@mistrust.net>

* Add rbac validate command

Signed-off-by: jannfis <jann@mistrust.net>

* Add documentation

Signed-off-by: jannfis <jann@mistrust.net>

* Make parameters mandatory

Signed-off-by: jannfis <jann@mistrust.net>

* Fix linter issue

Signed-off-by: jannfis <jann@mistrust.net>

* codegen

Signed-off-by: jannfis <jann@mistrust.net>

* missing new files from codegen

Signed-off-by: jannfis <jann@mistrust.net>

* More linter issues

Signed-off-by: jannfis <jann@mistrust.net>
2020-12-01 08:44:02 +01:00
Josh Soref
3ca1b02725 fix: Use pause icon for Suspended (#4838) (#4905)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-11-30 13:46:03 -08:00
Yujun Zhang
48291d8701 feat: support add plugin env entry from CLI (#4923)
Signed-off-by: Yujun Zhang <zhangyujun@gmail.com>
2020-11-30 18:41:30 +01:00
lowkey
345c77a8c7 docs: Add documentation for Okta SAML with private ingress (#4904)
* Describe presenting okta CA as a secret

Signed-off-by: lowkeyliesmyth <lowkey@kaffeinlabs.com>

* Describe private argo UI with public Okta SSO callback

Signed-off-by: lowkeyliesmyth <lowkey@kaffeinlabs.com>

* Describe using Contour with split public and private Ingresses

Signed-off-by: lowkeyliesmyth <lowkey@kaffeinlabs.com>

* Okta group to Argo CD role mapping

Signed-off-by: lowkeyliesmyth <lowkey@kaffeinlabs.com>

* Include required scopes for RBAC

Signed-off-by: lowkeyliesmyth <lowkey@kaffeinlabs.com>
2020-11-25 21:17:36 +01:00
jannfis
371de922d8 chore: Fix erroneous path expansion in release action (#4907)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-25 20:50:45 +01:00
Viktor Farcic
a8a451f811 docs: PRs with Argo CD and Codefresh (#4898)
Signed-off-by: Viktor Farcic <viktor@farcic.com>
2020-11-24 19:25:34 +01:00
Alexander Matyushentsev
c214fe0d95 refactor: disable gRPC metrics by default (#4892)
Signed-off-by: Alexander Matyushentsev <Alexander_Matyushentsev@intuit.com>
2020-11-23 16:44:09 -08:00
Alexander Matyushentsev
eb0d8b48bb fix: upgrade gitops-engine version. (fixes #4877) (#4890)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-23 13:02:19 -08:00
Alexander Matyushentsev
cb59fc72ef docs: add v1.8 changelog and upgrading instructions (#4888)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-23 12:45:35 -08:00
Chetan Banavikalmutt
ae12145f2d feat: Click on search icon must focus on search area (#4801)
Fixes: #4791

Signed-off-by: Chetan Banavikalmutt <chetanrns1997@gmail.com>
2020-11-23 09:46:58 -08:00
Payungsak Klinchampa
79509003fa docs : Add Google SAML Attribute Mapping for User management. (#4881)
* Update high_availability.md (#4878)

Remove double "don't have" in "Enable Concurrent Processing" section.

Signed-off-by: Peter Malmgren <peter.malmgren@zapier.com>
Signed-off-by: PayungsakCNR <payungsakpk@payungsakpk.xyz>

* Update google.md

Add SAML Attribute Mapping Details.

Signed-off-by: PayungsakCNR <payungsakpk@payungsakpk.xyz>

* Add Google SAML Mapping Photo.

Add screenshot of Google SAML Attribute Mapping.

Signed-off-by: PayungsakCNR <payungsakpk@payungsakpk.xyz>

Co-authored-by: Peter Malmgren <peter.malmgren@zapier.com>
2020-11-22 19:57:10 +01:00
Peter Malmgren
5aa1e47f8e Update high_availability.md (#4878)
Remove double "don't have" in "Enable Concurrent Processing" section.

Signed-off-by: Peter Malmgren <peter.malmgren@zapier.com>
2020-11-21 13:01:25 +01:00
kshamajain99
9ed140deaa fix: validate empty server address for destination cluster (#4852) (#4860)
* Always set inferred destination server

Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2020-11-20 16:45:22 -08:00
Jaideep Raghunath Rao
c147320687 feat: Allow configuration of OIDC logout URL to invalidate SSO session after logout (#4452) (#4826)
feat: Allow configuration of OIDC logout URL to invalidate SSO session after logout (#4452) (#4826)

Signed-off-by: jaideepr97 <jaideep.r97@gmail.com>
2020-11-20 11:19:17 -08:00
Sho Okada
3ddf50b787 fix: argocd app patch remove does not work (#4585)
Signed-off-by: Sho Okada <shokada3@gmail.com>
2020-11-20 10:19:59 -08:00
Alexander Matyushentsev
97c8b561ea fix: increase max grpc message size (#4869)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-20 09:40:44 -08:00
Jürgen Etzlstorfer
0c47b008ff docs: adding Keptn (#4874)
Signed-off-by: jetzlstorfer <juergen.etzlstorfer@dynatrace.com>
2020-11-20 09:40:31 -08:00
Alexander Matyushentsev
9bfa1e706b chore: use release tag to reference gitops engine dependency (#4866)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-19 14:10:04 -08:00
Mikhail Nacharov
59443ad185 fix: Adds podAntiAffinity in base manifests (#4549) (#4599)
Signed-off-by: Mikhail Vladimirovich Nacharov <author@webnach.ru>
2020-11-19 10:14:17 -08:00
Alex Gervais
6e6f4f50a0 docs: Improved documentation for Ambassador host-based routing configuration (#4857)
Signed-off-by: alex <alex@datawire.io>
2020-11-18 14:06:03 -08:00
Alexander Matyushentsev
ed547aa545 docs: add missing v1.7 patches description to changelog (#4859)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-18 10:09:01 -08:00
mitchharpur
ca7fa55a2b docs: Correct default docker desktop context name (#4830)
Signed-off-by: mitchharpur <mitchharpur@me.com>

Improved out of the box docker desktop instructions.
2020-11-18 08:52:33 -08:00
Alexander Matyushentsev
7ee951b5b8 fix: argocd diff --local should not print data of local secrets (#4850)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-17 09:30:35 -08:00
Alexander Matyushentsev
be8308199c docs: add automated sync policy allowEmpty to sample application (#4855)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-17 08:59:25 -08:00
Keith Chong
d8c08bfe7d test: Allow individual application tiles to be selectable (#4841) (#4851)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-11-17 08:03:14 -08:00
Alexander Matyushentsev
231509bb3c feat: add project badge panel to project details page (#4846)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-17 08:02:07 -08:00
Alexander Matyushentsev
a2d6582e54 fix: fix rendering external links on application details page (#4847)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-16 23:48:31 -08:00
Alexander Matyushentsev
4b23918802 chore: add git operation metrics to sample dashboard (#4849)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-16 20:22:23 -08:00
Alexander Matyushentsev
51f2949883 feat: add jsonnet version to version panel (#4845)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-16 20:20:03 -08:00
Alexander Matyushentsev
ffa824bbba fix: use correct operation type to track ls-remote performance (#4848)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-16 20:19:46 -08:00
Keith Chong
e4e503aad7 feat: Add option to show branches or tags for GIT revision (#4751) (#4788)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-11-16 13:04:17 -08:00
Alexander Matyushentsev
e8e810934d docs: document .argocd-source.yaml file usage (#4843)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-16 12:34:44 -08:00
jannfis
762b33c819 fix: Don't allow arbitrary redirects at login (#4780)
* fix: Don't allow arbitrary redirects at login

Signed-off-by: jannfis <jann@mistrust.net>

* Also check for CRLF in path

Signed-off-by: jannfis <jann@mistrust.net>

* Explicit unit test for empty redirect_url

Signed-off-by: jannfis <jann@mistrust.net>

* Cosmetics and remove redundancy

Signed-off-by: jannfis <jann@mistrust.net>
2020-11-16 20:30:36 +01:00
kshamajain99
69d8831b38 docs: improve description for API endpoint (#4821)
Signed-off-by: kshamajain99 <kshamajain99@gmail.com>
2020-11-16 09:03:15 -08:00
Jesse Suen
ad8715cbad feat: support argo-rollouts v0.10 (#4823)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-11-15 14:59:34 -08:00
jannfis
6cadaa2a5d chore: Update golang to v1.14.12 (#4832)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-15 09:33:46 -08:00
Oleg Sucharevich
8b1a118cdb docs: add codefresh (#4833)
Signed-off-by: Oleg Sucharevich <oleg2807@gmail.com>
2020-11-15 09:10:01 -08:00
Sven Walter
ccb7371047 fix: improve commit verification tolerance (#4825)
The `git verify-commit` output might have additional fields like
`issuer`. This change will make the parser skip the additional fields
instead of returning an error.

    gpg: Signature made Mon Aug 26 20:59:48 2019 CEST
    gpg:                using RSA key 4AEE18F83AFDEB23
    gpg:                issuer "j.doe@example.com"
    gpg: Can't check signature: No public key

This change is designed so it is easy to specify additional fields that
need to get skipped, by adjusting the regex.

Signed-off-by: Sven Walter <s.walter@rebuy.com>
2020-11-13 16:43:44 +01:00
Jesse Suen
2f72f3adad fix: sync hooks using generateName was using fixed timestamp suffix (#4787)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-11-13 01:18:15 -08:00
sethp-verica
ae17c70b00 docs: add Google SAML integration example (#4816)
Signed-off-by: Seth Pellegrino <seth@verica.io>
2020-11-12 14:18:48 -08:00
jannfis
5921feda5f chore: Cleanup Helm testdata after test (#4815)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-11 10:49:01 -08:00
Alexander Matyushentsev
71bd3fdd24 fix: add FIRST OCCURRED, LAST OCCURRED to events table (#4812)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-11 17:57:08 +01:00
Relk Li
30816bc549 docs: add WeMo Scooter to USERS.md (#4813)
Signed-off-by: Relk Li <YiJiun.Li.C@gmail.com>
2020-11-11 08:38:50 -08:00
Simon Rüegg
0681c2754a feat: Add health checks for Crossplane providers (#4778)
Signed-off-by: Simon Rüegg <simon@rueggs.ch>
2020-11-10 13:57:21 -08:00
William Tam
5040d6f080 fix: add roles to redis-ha service accounts to enable run-as non-root users in OpenShift (#4800)
Signed-off-by: William Tam <email.wtam@gmail.com>
2020-11-10 13:53:33 -08:00
William Tam
e3b733627f docs: Generate server command reference (#4795)
* Generate  server command reference docs
Signed-off-by: William Tam <email.wtam@gmail.com>

* Insert newline
Signed-off-by: William Tam <email.wtam@gmail.com>

* undo iinsert newline
Signed-off-by: William Tam <email.wtam@gmail.com>

Signed-off-by: William Tam <email.wtam@gmail.com>

* * Renane tab to `Server Configuration Parameters`
* Generate argocd-util command docs

Signed-off-by: William Tam <email.wtam@gmail.com>

* Tweak erver command  descriptions

Signed-off-by: William Tam <email.wtam@gmail.com>

* Minor tweaks to argocd-util command descriptions

Signed-off-by: William Tam <email.wtam@gmail.com>

* Move main_test.go to secrets_redactor_test.go into commands package
Signed-off-by: William Tam <email.wtam@gmail.com>

* Disable auto generation tag.

Signed-off-by: William Tam <email.wtam@gmail.com>
2020-11-10 20:01:11 +01:00
Jonathan West
be513e431a chore: Fix bulleted list in Global Projects section of projects (#4803)
Signed-off-by: Jonathan West <jonwest@redhat.com>
2020-11-10 19:34:26 +01:00
Xavier Krantz
5e24d21ae8 docs: Add Virtuo to USERS.md (#4805)
Virtuo (govirtuo.com) is officially using ArgoCD along with the other Argo projects to deploy to Kubernetes.

Signed-off-by: Xavier Krantz <xakraz@gmail.com>
2020-11-10 19:33:52 +01:00
Josh Soref
eec8f79923 fix: Clarify in multiple applications (#4769) (#4771)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-11-09 10:21:24 -08:00
Ashley Manraj
d1ba640bff docs: add 3rein to users (#4797)
Signed-off-by: Ashley Manraj <ashley@3rein.com>
2020-11-09 10:11:40 -08:00
jannfis
7947b59eeb chore: Fix helm2 dependency tests (#4789)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-07 10:07:51 -08:00
Jonathan West
4c3f97f78a chore: Add a GitHub action that runs unit tests with -race to CI build (#4774) (#4775)
* chore: Add a GitHub action that runs unit tests with -race to CI build (#4774)

Signed-off-by: Jonathan West <jonwest@redhat.com>

* chore: Add a GitHub action that runs unit tests with -race to CI build (#4774)

Signed-off-by: Jonathan West <jonwest@redhat.com>
2020-11-07 12:57:18 +01:00
Alexander Matyushentsev
c4dcae3442 fix: improve project details page summary tab (#4782)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-06 16:00:45 -08:00
Jesse Suen
d1a36e5b6d feat: add new rollout actions (abort, retry, promote-full, terminate). improve health check (#4777)
Signed-off-by: Jesse Suen <jesse_suen@intuit.com>
2020-11-06 15:16:32 -08:00
kshamajain99
9c51838ccc Chore: Update broken link in conrtibution guide (#4785) 2020-11-06 14:44:45 -08:00
Hu Sheng
700a4104c6 docs: add openEuler, openGauss, openLooKeng, MindSpore to users (#4779) 2020-11-06 14:09:25 -08:00
William Tam
dcb5f07c23 docs: Add documentation to run redis-ha in OpenShift (#4759)
Signed-off-by: William Tam <email.wtam@gmail.com>
2020-11-06 14:00:10 -08:00
Josh Soref
9625e50ccd fix: Use ghost icon for unknown/missing permissions (#4730) (#4783)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-11-06 12:29:10 -08:00
jannfis
3e19b2fdf1 chore: Update redis to 5.0.10 (#4767)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-05 13:58:26 -08:00
Amit Rout
96e0f0d3be docs: Add github reference to k3d in developer-guide (#4761)
Signed-off-by: arout <arout@redhat.com>
2020-11-05 13:57:59 -08:00
May Zhang
620e31e52d fix: From UI create or delete JWTToken, error "'metadata' of undefined" (#4766)
Signed-off-by: May Zhang <may_zhang@intuit.com>
2020-11-05 13:57:19 -08:00
Paweł Hajduk
ab7e1773f0 docs: Updated OneLogin documentation of clientSecret property (#4763) 2020-11-05 21:31:41 +01:00
Tim Etchells
e67d934827 docs: Add myself as reviewer (#4762)
Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-11-05 16:35:58 +01:00
Jonathan West
9ee0d2c6c0 docs: proposal to add jgwest as a reviewer (#4757)
Signed-off-by: Jonathan West <jonwest@redhat.com>
2020-11-04 20:40:44 -08:00
William Tam
9c684ddc08 Proposal to add wtam2018 as a reviewer (#4756)
* Add wtam2018 as a reviewer

* remove "P"  that  gets prepended
2020-11-04 18:06:21 -08:00
jannfis
c9f3c64a58 chore: Fail-fast in Makefile when not within $GOPATH (#4744)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-04 14:01:01 -08:00
jannfis
8c3a8e3655 docs: Remove deprecated warnig for local users (#4750)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-04 20:36:02 +01:00
May Zhang
449b50cf6c fix: failUnmarshal only checks for file resembles a resource (#4729)
* fix: failUnmarshal only checked for file contains information which has apiVersion, kind and metadata.

Signed-off-by: May Zhang <may_zhang@intuit.com>

* add negative test case

Signed-off-by: May Zhang <may_zhang@intuit.com>

* modified negative test data

Signed-off-by: May Zhang <may_zhang@intuit.com>

* modified negative test data

Signed-off-by: May Zhang <may_zhang@intuit.com>
2020-11-03 15:46:51 -08:00
Alexander Matyushentsev
da3ab59be0 refactor: upgrade helm to v3.4.0 (#4745)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-03 11:48:00 -08:00
Alexander Matyushentsev
e8f63d4583 feat: remove unnecessary fields from project creation panel (#4742)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-03 11:43:14 -08:00
Alexander Matyushentsev
cdb3df1077 fix: Argo CD should present the live object in the resource version in git (#4740)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-03 11:24:14 -08:00
Isaac Gaskin
858676c4f8 chore: helm2 verison bump (#4724)
* chore: helm2 verison bump
2020-11-03 11:22:14 -08:00
Josh Soref
44c31e278c Allow deny (#4293) (#4294)
* chore(ui): switch to using allow/deny (#4293)

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-11-03 10:54:13 -08:00
jannfis
a759601264 fix: Only verify GPG signatures on metadata requests when verification is enforced (#4741)
Signed-off-by: jannfis <jann@mistrust.net>
2020-11-03 18:43:02 +01:00
Alexander Matyushentsev
9bbbda55a4 fix: use fmt.Sprintf to format complex logging fields (#4739)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-03 08:41:08 -08:00
Alexander Matyushentsev
b97f4f7f8e fix: RevisionFormField component crashes in 'refs' API returns no tags (#4735)
Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-11-02 22:56:00 -08:00
phillip-ops
422a26e8d8 docs: add Opensurvey to USERS.md (#4727) 2020-11-02 14:16:44 -08:00
nahidupa
245e1ee636 docs: correct parameters usage in CLI (#4725)
Adding guestbook= before the value does not require. Removed that.
2020-11-02 14:16:09 -08:00
Jonathan West
2166fea351 fix: Repo-server has silent unmarshalling errors leading to empty applications (#4423) (#4708)
* fix: Repo-server has silent unmarshalling errors leading to empty applications (#4423)
2020-11-02 14:15:31 -08:00
Jesse Suen
dea75eb481 fix: inject artificial delay between sync waves to better support health assessments (#4715)
Signed-off-by: Jesse Suen <jesse_suen@intuit.com>
2020-11-02 12:17:43 -08:00
May Zhang
6ef89e3c09 fix: exclude files listed under exclusions (#4686)
* fix: exclude files listed under exclustions

* fix: add it to cli

* fix: update doc

* fix: added e2e test

* fix: fix merge conflicts

* fix: fix merge conflicts

* fix: fix merge conflicts

* use glob

* fix merge conflict

* fix rename the flag

* This is my commit message

Signed-off-by: May Zhang <may_zhang@intuit.com>

* -s
2020-11-02 08:46:02 -08:00
Jesse Suen
b9954e55ac feat: support resource actions on CRDs that use status subresources (#4690)
Signed-off-by: Jesse Suen <Jesse_Suen@intuit.com>
2020-11-02 02:09:05 -08:00
Tim Etchells
86031504af feat: Add autocomplete for repo Revisions (#4645) (#4713)
* feat: Add autocomplete for repo Revisions

- Introduces api/v1/repositories/{repo}/refs which returns branches and tags
- Add new RevisionFormField component to Create and Edit Application pages

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-11-01 19:25:37 -08:00
Alexander Matyushentsev
97003caebc fix: webhook don't refresh apps pointing to HEAD (#4717) 2020-10-30 11:13:03 -07:00
J. Mark Pim
42ebb227e1 feat: Add support for ExecProvider cluster auth (#4600) (#4710) 2020-10-30 09:58:45 -07:00
John Pitman
c7f7631f2e fix: adding helm values file in New App (#4635)
Signed-off-by: John Pitman <jpitman@redhat.com>
2020-10-30 09:47:14 -07:00
Dewan Ahmed
9cdfe40faf docs: Instructions on make verify-kube-connect step when using k3d (#4687) 2020-10-30 09:07:13 -07:00
Alexander Matyushentsev
21304ee2c5 feat: Annotation based app paths detection in webhooks (#4699)
* feat: Annnotation based app prefix detection in webhooks

* webhook should copy previously generated manifests cache if new commit does not introduce any changes

* use 'argocd.argoproj.io/manifest-generate-paths' annotation to specify paths

Co-authored-by: Carson Anderson <ca@carsonoid.net>
2020-10-29 13:17:54 -07:00
Isaac Gaskin
7f0ffb4cd2 fix: adding commonAnnotations for Kustomize (#4613)
* fix: adding commonAnnotations

optional k/v map to add annotations via kustomize

* fix: adding kustomize common annotations

also correcting kustomize cli flags to respect multiple options

#4613
2020-10-29 19:12:55 +01:00
Darshan Chaudhary
22e0b4ff55 fix: add flag to indicate end of logs (#4696)
Signed-off-by: darshanime <deathbullet@gmail.com>
2020-10-29 09:37:59 -07:00
Tim Etchells
0767dff025 feat(ui): Improve UX when filtering applications (#4403) (#4622)
* feat: Improve UX when filtering applications

- When application filters are active, show a badge with # filters and a button to clear them
- When no matching applications are found, provide a button to clear filters
- Styling updates to application filters UI

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-29 09:08:45 -07:00
Keith Chong
5ba8710ff1 docs: Describe Argo UI dependency changes in dependencies.md (#4698) (#4702)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-10-29 08:56:00 -07:00
jannfis
dde5f143fc chore: Fix failing unit test for TestGetIstioVirtualServiceInfo (#4711) 2020-10-29 08:38:06 -07:00
William Tam
f02115af15 fix: add argocd-redis SA to nonroot security context constraint (#4660) 2020-10-28 16:30:09 -07:00
Omer Kahani
cd302fd055 feat: add Istio virtual service to the network view - part of #4675 (#4677) 2020-10-28 16:24:06 -07:00
Remington Breeze
cfd59aded2 fix(ui): stack overflow crash of resource tree view for large applications (#4685) 2020-10-28 15:57:16 -07:00
May Zhang
dd856e1c2b feat: Util for generate global project from ClusterRole (#4653)
* feat: Util for generate global project from ClusterRole

* feat: fix lint error

* feat: fix test failure

* fix lint

* fix lint error

* moved into sub command and removed not needed fields.

* updated error package

* rename files
2020-10-27 16:54:47 -07:00
Shuwei Hao
387f775f4a feat: Support oci-based helm repository (#4018)
* feat: Support oci-based helm repository

Signed-off-by: haoshuwei <haoshuwei24@gmail.com>
2020-10-27 15:37:42 -07:00
Jason
837ed45361 docs: Clarify where hook manifests go (#4659) 2020-10-27 14:59:32 -07:00
Keith Chong
46ee2f21a2 fix: Automated smoke test that mimics user behavior UI (#4393) (#4683)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-10-27 14:55:10 -07:00
Josh Soref
3bf9deb15e chore: Remove newline from new issue template (#4681)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-10-27 14:14:44 -07:00
Alexander Matyushentsev
a96b476f16 refactor: upgrade gitops-engine version ( breaking API changes related to logr mirgation ) (#4652) 2020-10-27 14:10:24 -07:00
Tim Etchells
764ea07fc0 feat: Add 'proj role list-tokens' command (#4674)
Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-27 12:56:37 -07:00
Marco Londero
6ddd98c4f8 docs: add tru.ID to USERS (#4672) 2020-10-27 09:20:29 -07:00
Tim Etchells
be60425a47 feat(cli): Add ID option to 'proj role create-token' (#4632) (#4636)
* feat: Add ID option to 'proj role create-token'

Also add some more informative output to the same command

Signed-off-by: Tim Etchells <tetchell@redhat.com>

* Parse token on client side, add --token-only flag

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-27 08:25:07 +01:00
Alexander Matyushentsev
0850bcc184 fix: application list page crash if app referencing not configured cluster URL (#4671) 2020-10-26 17:43:46 -07:00
Alexander Matyushentsev
aaae4003a0 fix: fix nil pointer error in Argo CD repo server (#4668) 2020-10-26 15:29:30 -07:00
jannfis
6535d1ac34 chore: Change log level in updateClusters() from info to debug (#4667) 2020-10-26 14:07:34 -07:00
Adrian Ludwin
81b84e66c1 docs: Remove obsolete instructions for GKE (#4658) 2020-10-26 14:03:47 -07:00
Alexander Matyushentsev
5fdbe2057a feat: support generating manifests for the same commit in parallel (#4625) 2020-10-26 13:32:18 -07:00
Tim Etchells
ac8d18d39d chore: Update developer guide docs (#4664)
- Remove references to CircleCI
- Move info for troubleshooting CI builds into ci.md
- Add 'gofmt' note to Lint CI check failing
- Add note about generated code to FAQ

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-26 19:48:43 +01:00
May Zhang
3d39accdb2 feat: Global Project UI (#4587)
* feat: Global Project UI

* feat: fixing compile error

* feat: rename import

* feat: Fixing TypeError: Cannot read property 'spec' of undefined when editing existing fields of project.

* feat: Fixing lint error.

* feat: Fixed issue when editing project fields, virtual project had stale info

* feat: fixing lint

* feat: add GetGlobalProjects

* feat: fixing swagger conflict.

* feat: fixing undefined.

* feat: update swagger.json

* feat: update doc

* feat: update doc

* feat: update doc with version number

* Load project and global projects in parallel

* feat: hide global project info.

* feat: lint

* feat: fixed edit issue

* feat: dedup

* feat: fix lint error

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-10-26 10:39:39 -07:00
Chetan Banavikalmutt
4d643a151d feat: Include cluster name in application filter (#4529) 2020-10-23 18:54:10 -07:00
Marcel Hoyer
41ab92fbdd docs: Fix broken 'Dex Connectors' link (#4647)
The documentation of Dex was materialized to https://dexidp.io/docs/ in the meantime.
2020-10-23 12:08:01 -07:00
Jonathan West
2e06118792 fix: Data race between processAppRefreshQueueItem and processAppOperationQueueItem, in appcontroller.go (#4643) (#4644) 2020-10-23 12:05:41 -07:00
Tim Etchells
bbfbf6834f fix: Add tooltips to Role JWTs view (#4642)
- Improve error message for invalid 'Expires In'
- Remove extra space next to 'Create' button

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-23 19:43:34 +02:00
Mike Bryant
c7dbe4883b feat: Add additional printer columns for Health and Sync status (#4641) 2020-10-22 14:07:05 -07:00
Jaideep Rao
bdee71d4c7 fix: Pick up correct commit SHA when using annotated git tags (#4231) (#4538) 2020-10-22 13:06:36 -07:00
lonfme
9af729c738 fix: ssh repo url match failed when webhook github http custom port (#4532) 2020-10-22 13:05:05 -07:00
Josh Soref
c0f9c9ae93 chore(ui): Login page link should be "Log in" (the verb phrase) (#4611) (#4612)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-10-22 09:57:48 -07:00
yutachaos
dfc75df7a0 docs: Update USERS.md (#4638)
add Quipper
2020-10-22 09:38:23 -07:00
Jean-Luc Geering
cf03c1dcc5 docs: Update USERS.md (#4630)
add UFirstGroup
2020-10-21 20:47:06 +02:00
jannfis
7824a1fc2b chore: Upload e2e server component logfiles to GH action on failures (#4565) 2020-10-21 07:59:24 -07:00
Josh Soref
5db8d97bf0 chore: Update swagger docs (#4610) (#4616)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-10-20 20:28:57 +02:00
Josh Soref
05c493b3a6 Spelling (#4596) 2020-10-19 18:21:06 -07:00
William Tam
894f95dce5 docs: Add generated argocd command docs (#4606) 2020-10-19 17:30:32 -07:00
Vincent Gilles
90227f226d docs: describe application creation from helm repository in declarative setup documentation (#4463) (#4597) 2020-10-19 11:21:50 -07:00
jannfis
fd482316d0 fix: Serve ReDoc JS from Argo CD server instead of from CDN (#4594)
* fix: Serve ReDoc JS from Argo CD server instead of from CDN

* refactor: dynamically copy redoc.standalone.js from npm module

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-10-19 20:01:45 +02:00
Tim Etchells
c620fa7aaa fix: only bundle the yaml language for Monaco (#4582)
Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-19 10:59:21 -07:00
jannfis
a0f6e033c0 chore: Replace deprecated commands for release action (#4593) 2020-10-19 10:40:39 -07:00
jannfis
15b0a6e793 chore: Replace deprecated GH actions directives for integration tests (#4589)
* chore: Replace deprecated set-env directives

* revert lint version change

* Revert go.mod and go.sum changes

* Fix typo

* Update golangci-lint-action to v2

* Fix golangci-lint version

* Skip new lint complaints in test

* Skip more new lint complaints in test

* Exclude new SA5011 check in lint
2020-10-17 09:03:57 +02:00
Jason DeWitt
3408e2d72d docs: Add clarification on the initial password to Getting Started guide 2020-10-16 14:10:48 -07:00
Victor Boissiere
e09cacba65 docs: Add new company to user list (#4588) 2020-10-16 15:35:56 +02:00
Ricardo Contreras
66d86fe56f docs: update upgrading overview doc to include missed versions (#4592)
add missing links to 1.5->1.6 and 1.6->1.7 upgrades notes.
2020-10-16 15:35:02 +02:00
Tim Etchells
67c91564c4 fix: don't re-pull fonts on each webpack build (#4584)
Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-15 19:32:00 -07:00
jannfis
698712f396 fix: Make gpg watcher re-creation more robust (#4580) 2020-10-15 15:20:37 -07:00
Alex Gervais
001d990d0c docs: Add documentation for Ambassador ingress options (#4575) 2020-10-15 13:56:55 -07:00
Remington Breeze
1cbada9d86 fix(ui): UI crash when ksonnet app has no environments (#4566) 2020-10-15 11:20:54 -07:00
Chetan Banavikalmutt
dff7da7271 fix: Infer destination server when latest version of app is fetched (#4574) 2020-10-15 08:57:18 -07:00
Alexander Matyushentsev
12957a494c chore: fix flaky TestFinalizeAppDeletion/ErrorOnBothDestNameAndServer test (#4571) 2020-10-15 13:22:06 +02:00
Jonathan West
4f1e371830 fix: Data race in SettingsManager.GetRepositoryCredentials() (#4561) (#4562) 2020-10-15 13:18:38 +02:00
Alexander Matyushentsev
8e11facb94 refactor: upgrade gitops-engine version ( #4354, #1787 ) (#4563) 2020-10-14 14:05:09 -07:00
Kevin McDermott
61c8f73e21 Don't parse empty strings as maps in settings. (#4556)
There's a bug in the resource inclusions parsing, if the string is "" then it's
parsed as a map, which returns nil, and so it fails when adding elements later.
2020-10-14 12:15:58 -07:00
May Zhang
23ac24bdea fix: login with apiKey capability (#4557)
* fix: login with apiKey capability

* fix: update based on code review.

* fix: update based on code review.

* fix: check pws first.
2020-10-14 11:31:35 -07:00
Alexander Matyushentsev
e6f116319b fix: editing Clusers in the UI drops credentials from the secret (#4553) 2020-10-14 10:45:58 -07:00
Chetan Banavikalmutt
5fa808a788 fix: Infer cluster URL while deleting app resource (#4559)
An application can be created by specifying only cluster name. Since cluster URL is used for queries, it should inferred. ValidateDestination() method will infer the cluster URL if cluster name is present.

Fixes: #4534
2020-10-14 10:32:41 -07:00
Jonathan West
6d64280fba fix: Data race in SettingsManager.GetRepositories(), via util/db unit tests (#4550) (#4551) 2020-10-14 15:16:22 +02:00
William Tam
3ae1d13dfd refactor: update gitops engine version (issue #1816) (#4552) 2020-10-13 21:22:36 -07:00
May Zhang
f512d213cf feat: global project (#4506)
* feat: global project

* feat: revert back argocd-cm.yaml

* feat: remove commented code.

* feat: check err

* feat: corrected comments.

* feat: merge sync windows

* feat: getProject

* feat: fix lint error

* feat: update existing test case

* feat: minor comments

* feat: Fixed for sync window which is also called from API server.

* feat: fix application tests

* feat: block by sync window

* feat: test using sync window

* feat: updated based on code review

* feat: fixed comment
2020-10-13 15:12:05 -07:00
Viktor Farcic
35914ff7ab docs: YouTube video on how to create PR (preview) environments with Argo CD (#4544) 2020-10-13 14:13:22 -07:00
William Tam
48891e2536 chore: rename cli-docker -> cli-argocd (#4527) 2020-10-13 14:05:23 -07:00
Jonathan West
a88c729148 fix: Data races detected while running 'server/application' unit tests (#4546) (#4547) 2020-10-13 13:49:45 -07:00
jannfis
c8ca3e7c45 chore: Run e2e tests against different K8s versions (#4444) 2020-10-13 13:37:05 -07:00
Alexander Matyushentsev
2a0012d5f1 refactor: upgrade k8s client to v0.19.2 (#4545) 2020-10-13 13:01:26 -07:00
William Tam
fd483babb7 docs: replace deployment with statefulset (#4531) 2020-10-13 11:30:21 -07:00
Tim Etchells
52f4ed203f fix: Revert "fix: webpack-dev-server proxy hostname (#4515)" (#4530)
This reverts commit 8eb3306064.
2020-10-11 08:16:20 -07:00
Alexander Matyushentsev
497cd603ca docs: clarify project RBAC management documentation (#4526) 2020-10-09 16:51:14 -07:00
Adam Blackwell
97f094756d Add edX to USERS (#4524) 2020-10-09 16:17:03 -07:00
Alexander Matyushentsev
5cdcca4544 fix: bump cache version to avoid nil pointer error (#4525) 2020-10-09 16:16:38 -07:00
Jonathan West
d479d22de7 feat: Failed manifest generation protection (#4238) (#4430) 2020-10-09 13:47:31 -07:00
Alexander Matyushentsev
303925f4a0 feat: Support controller horizontal scaling (#4285) 2020-10-09 13:16:54 -07:00
Tim Etchells
8eb3306064 fix: webpack-dev-server proxy hostname (#4515)
Switching the hostname from 'localhost' to the ipv6 '[::1]' fixes the dev server proxy

https://github.com/webpack/webpack-dev-server/issues/793#issuecomment-316650146

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-10-09 12:55:28 -07:00
Keith Chong
9f2eab665b fix: Summary legend overflow view (#4523)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-10-09 12:08:33 -07:00
Alexander Matyushentsev
3ac0bc36d4 fix: api-server should not try creating default project it is exists already (#4517) 2020-10-09 10:17:00 -07:00
Timothy OBrien
2b84672641 docs: minor spelling fix to azure sso docs (#4518) 2020-10-09 09:45:48 -07:00
Timothy OBrien
701dda9a28 docs: Add documentation for Microsoft Azure AD SAML SSO (#4509) 2020-10-08 14:15:15 -07:00
Alexander Matyushentsev
8995d0405a fix: JS error on application list page if app has no namespace (#4499) 2020-10-07 11:41:21 -07:00
May Zhang
286f98ba82 feat: autosync protection (#4475)
* feat: autosync protection

* feat: autosync protection - update doc

* feat: autosync protection - update doc with version
2020-10-06 21:10:50 -07:00
Masaya Ozawa
10f68dde2d use resources (#4495)
https://kubernetes-sigs.github.io/kustomize/api-reference/kustomization/bases/
2020-10-06 16:25:01 -07:00
Tim Etchells
5592150f18 feat: Add version information panel (#4312) (#4376) 2020-10-06 12:03:25 -07:00
Keith Chong
7af7f30715 docs: Format issue in documentation site for dependencies.md (#4491) (#4496)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-10-06 20:33:53 +02:00
Keith Chong
4534bd2725 docs: Add developer docs for gitops-engine changes (#4492)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-10-06 19:31:57 +02:00
Chetan Banavikalmutt
95d19cdcca feat: Add labels to list view icons(#4396) (#4493)
The icons present in the list view should have labels similar to the icons in tree view

Fixes: #4396
2020-10-06 12:59:17 +02:00
Alexander
05b70f1e97 docs: add TableCheck to users (#4494)
Signed-off-by: Alexander Nicholson <4584443+DragonStuff@users.noreply.github.com>
2020-10-06 12:28:32 +02:00
Jean-François Roche
da57c9f1c8 docs: declare where to add the annotation (#4490)
We got bitten by thinking that this annotation could possibly added to the application to exclude all extraneous resources (see #4487).
The annotation must be added to the resource we wish to exclude.
2020-10-06 08:12:35 +02:00
Keith Chong
287e8cffdb refactor: fix: update gitops engine version (issue #3781) (#4489)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-10-05 15:22:37 -07:00
Satoshi Inoue (butter)
f93da5346c docs: add VISITS Technologies to users (#4485) 2020-10-05 10:40:11 +02:00
Maxime Brunet
aefa739169 feat: Upgrade Dex to v2.25.0 (#4470) 2020-10-05 09:02:49 +02:00
k.bigwheel
3123c00a85 docs: Added Speee to USERS list (#4484) 2020-10-05 08:57:34 +02:00
Liviu Costea
efb7028d84 docs: Add instructions for cli installation on Windows #4481 (#4482)
* docs: Add instructions for cli installation on Windows

* docs: Remove chocolatey until it is part of the release
2020-10-05 08:53:33 +02:00
Isaac Gaskin
3848f64807 fix(info.go): omitting wildcard paths from controller cache (#4479)
edge case where /* should not be appended to path
2020-10-05 08:36:26 +02:00
Chance Zibolski
5af0c5ad3a fix: reposerver: Set GRPC max message size (#4472) 2020-10-02 13:53:29 -07:00
jannfis
24927c4d4f docs: Fix broken link to user guide (#4477) 2020-10-02 09:33:08 -07:00
John Pitman
91e62bfc3b fix: fix broken docker build of argocd-test-tools image (#4471)
Signed-off-by: John Pitman <jpitman@redhat.com>
2020-10-01 13:56:32 -07:00
Dewan Ahmed
b08f895d9a chore: removing circleci since we're moved to GitHub Actions (#4469) 2020-10-01 13:54:41 -07:00
dependabot[bot]
3409e0728f chore(deps): bump node-sass from 4.12.0 to 4.13.1 in /ui (#4267)
Bumps [node-sass](https://github.com/sass/node-sass) from 4.12.0 to 4.13.1.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v4.12.0...v4.13.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-01 01:08:44 -07:00
dependabot[bot]
dd63715017 chore(deps): bump http-proxy from 1.17.0 to 1.18.1 in /ui (#4286)
Bumps [http-proxy](https://github.com/http-party/node-http-proxy) from 1.17.0 to 1.18.1.
- [Release notes](https://github.com/http-party/node-http-proxy/releases)
- [Changelog](https://github.com/http-party/node-http-proxy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/http-party/node-http-proxy/compare/1.17.0...1.18.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-01 00:51:39 -07:00
dependabot[bot]
0d2fc86330 chore(deps): bump handlebars from 4.1.2 to 4.7.6 in /ui (#4271)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.7.6.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.7.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-01 00:49:34 -07:00
Alexander Matyushentsev
8299e99049 refactor: upgrade dependencies and node version (#4461) 2020-09-30 23:02:48 -07:00
John Pitman
7b60548e8a fix: switch monkeypatching implementation (#4462)
Signed-off-by: John Pitman <jpitman@redhat.com>
2020-09-30 14:02:18 -07:00
Jacek Wysocki
0226190ef4 docs: Add kinguin to USERS.md (#4458) 2020-09-30 13:54:57 -07:00
Carson A
25823a4625 feat: Add external link annotation support (#4380)
Example implementation of https://github.com/argoproj/argo-cd/issues/3487
2020-09-30 07:39:10 +02:00
May Zhang
712df19fac feat: add labels for projects (#4446)
* add labels for projects

* feat: add labels for projects

* feat: add labels for projects
2020-09-29 21:35:31 -07:00
jmpcyc
bccaefdac9 delete duplicate code (#4449) 2020-09-29 21:29:33 -07:00
Tim Etchells
53d50df001 fix: prevent sync error overflowing (#4453)
Also make the 'sync status' help icon clickable to view sync status

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-09-29 17:33:37 -07:00
Alexander Matyushentsev
8b2e05c20d fix: remove redundant check from EditablePanel control (#4436) 2020-09-28 08:51:07 -07:00
Alexander Matyushentsev
9bb9c19e67 fix: show error message if unable to terminate operation (#4437) 2020-09-28 08:50:50 -07:00
Alexander Matyushentsev
6b106768a5 refactor: update gitops engine version (issues #4329, #4298) (#4434) 2020-09-25 16:09:09 -07:00
Josh Soref
4810874348 feat(ui): widgets don't have tooltips (#4257) (#4422)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-09-25 09:50:19 -07:00
Alexander Matyushentsev
d96083c293 fix: bump cache version due to redis compression feature (#4421) 2020-09-25 09:44:34 -07:00
Alexander Matyushentsev
f815c96605 docs: add 'helm.parameters.forceString' example to application.yaml (#4431) 2020-09-25 09:42:34 -07:00
Remington Breeze
4347a3c0ad feat(ui): Migrate project summary settings to EditablePanel for parity with rest of UI (#4400) 2020-09-24 13:40:03 -07:00
Josh Soref
3f7d60018f feat(ui): widgets don't have tooltips (#4257) (#4261) 2020-09-24 13:29:57 -07:00
Keith Chong
b7c2002a11 feat: Progress indicators in Argo CD UI (#4227) (#4411)
Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-09-24 09:16:32 -07:00
Sayak Mukhopadhyay
c1ee89b502 docs: Changed docs for Helm to clarify the location of values files. (#4417)
Also did a grammar pass.
2020-09-24 10:36:44 +02:00
Viktor Farcic
74f5043e87 docs: 20 min video (#4390) 2020-09-23 17:22:52 -07:00
May Zhang
fbfa89d358 fix: Support transition from a git managed namespace to auto create (#4401)
* fix: Support transition from a git managed namespace to auto create

* fix: Support transition from a git managed namespace to auto create
2020-09-22 17:38:55 -07:00
Josh Soref
1c95c90a2d fix(ui): center icon tiles in list view (#4262) (#4266) 2020-09-22 13:04:42 -07:00
bukbuk1231
9f47a11621 feat: display k8s object CREATED_AT time in local time instead of UTC (#4347) (#4383)
* feat: display k8s object CREATED_AT time in local time instead of UTC

* fix linting issues
2020-09-21 16:28:05 -07:00
Chetan Banavikalmutt
e28a3e5ed0 fix: Cluster remove should return an error for unknown cluster name (#4366) 2020-09-21 13:56:21 -07:00
Johan Sandström
52cae98705 fix: add no log init flag to useradd (#4379)
This commit fixes an error where the underlaying disk would get
filled up when running make test-tools-image and the user running
it are running with a big UID.

Adding --no-log-init or -l will prevent useradd from trying to make
sure that there are is room for the user in lastlog and faillog.
2020-09-21 10:58:24 +02:00
Alexander Matyushentsev
3850e80040 fix: swagger UI stuck loading (#4377) 2020-09-18 15:39:56 -07:00
Jonathan West
989f5c80c6 fix: Sync Window status in argocd CLI is not matched with argocd UI for same sync window (#3831) (#4372) 2020-09-18 23:08:25 +02:00
Sayak Mukhopadhyay
82340a0740 Fixed padding issues with application list in cards and row view (#4364) 2020-09-18 10:38:03 -07:00
Alexander Matyushentsev
28e60406a8 fix: prevent 'argocd app sync' hangs if sync is completed too quickly (#4373) 2020-09-17 16:21:25 -07:00
Alex Collins
eb0d018c31 chore: Upgrade to pkg v0.2.0 (#4356) 2020-09-17 14:05:27 -07:00
William Tam
850de2021a Add documentation checkboxes in PR template (#4371) 2020-09-17 12:58:31 -07:00
Josh Soref
b8d1b9bbc0 fix: Reword application is healthy (#4336) (#4357)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-09-17 21:33:30 +02:00
John Pitman
7caa2106ef fix: 'prettier' error from tslint (#4368)
Signed-off-by: John Pitman <jpitman@redhat.com>
2020-09-17 21:32:26 +02:00
Herrmann Hinz
24b5c1e34d Update app_deletion.md (#4365)
kubectl command typo
2020-09-17 09:01:29 -07:00
Keith Chong
3aa0748c70 fix: Add tooltip for application tile detail labels (#4341) (#4343)
* [4341] Add tooltip for application tile labels

* fix: Add tooltip for application tile detail labels (#4341)

Signed-off-by: Keith Chong <kykchong@redhat.com>
2020-09-16 19:28:05 -07:00
Josh Soref
1462ab3c06 Improve release docs (#4346)
Mention bumping `VERSION` on master

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-09-16 19:09:55 -07:00
Alexander Matyushentsev
5de3a302fb fix: argocd app wait/sync might stuck (#4350) 2020-09-16 19:03:48 -07:00
jheyduk
14fa7f954c fix: application external url falsely uses backend servicePort (#4339)
* fix: application external url falsely uses backend servicePort #2318

Use https if spec.tls is specified for the related host. Otherwise use http

* refactor / add new test
2020-09-16 16:18:28 -07:00
Alexander Matyushentsev
1b3d7a02e1 fix: failed syncs are not retried soon enough (#4353) 2020-09-16 13:39:18 -07:00
Jonathan West
eb13305984 fix: Log output stops if message is too long (#3258) (#4334) 2020-09-15 14:10:52 -07:00
Josh Soref
3a30a4fc74 chore: change version to 1.8.0 (#4340)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-09-15 13:57:35 -07:00
John Pitman
d4ddd51602 fix: create valid spec for project policy (#4332)
Signed-off-by: John Pitman <jpitman@redhat.com>
2020-09-15 11:07:38 -07:00
Isaac Gaskin
95eda65759 fix(applications-table.tsx): adding "name" to Cluster (#4317)
this corrects the "destination" of the table view of applications if they use
app.spec.destination.name instead of app.spec.destination.server
2020-09-15 11:03:07 -07:00
Gagan Hegde
c26573369d Add status badge for project #4001 (#4301)
* The status badge for the project has been added : //Sample url: http://localhost:8080/api/badge?project=default, creates a badge with the health and sync status
2020-09-15 09:55:32 -07:00
Josh Soref
c91acc0673 chore: spelling: will (#4292)
Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2020-09-15 09:54:23 -07:00
Joost VdC
51a5795b44 Update understand_the_basics.md (#4299)
link to kubernetes course is outdated
2020-09-15 09:54:12 -07:00
William Tam
9aae99cf7f fix: Only processes need root uid will run as root inside test container (#4210)
* Add  "chown" to gpg/keys  in "start-local" target that so that repo-server can access gpg keys.

* * Set -u uid:gid in the docker run commands  so that test images are run under the current user.
* test Procfile processes will not need to perform "su"  to  default user (which has the current user's uid/gid)

* Remove chown in start-e2e-local

* clean up, remove  "bash -c"

* Test containers are run as uid 0 which allows uid_entrypoint.sh  to perform some user setup.  uid_entrypoint.sh creates a non-root user (default) and enables passwordless sudo for that user.    The container entry point command is run as the non-root user.   "goreman start"  does "sudo" to to the processes that need root permission including sshd, fcgiwrap, and nginix.   The other processes are running as the non-root user.

* use /bin/bash

* change back to sh

* Docker image to create  unpriveleged testuser and enable passwordless sudo for that user
2020-09-15 11:32:16 +02:00
Chetan Banavikalmutt
5f680d6cec fix: Log an error when invalid token exists (#4318)
Instead of returning an error for invalid token and thereby breaking API requests for all users, print the error to the logs.

Fixes: #4156
2020-09-14 23:18:51 -07:00
Tim Etchells
28a76352c5 fix: Add tooltips to sync result table (#4310)
Bug #4234

Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-09-14 17:45:14 -07:00
May Zhang
cfb925c0d4 fix: app create with -f should not ignore other options (#4322) 2020-09-14 15:29:45 -07:00
Isaac Gaskin
4e6d8cc1d2 fix(logging.go): changing marshaler for JSON logging to use gogo (#4319)
* fix(logging.go): changing marshaler for JSON logging to use gogo

grpc-gateway json marshaler breaks with gogo protos

#4117

* Retrigger CI pipeline
2020-09-14 15:15:31 -07:00
Alexander Matyushentsev
f215233af4 fix: limit concurrent list requests accross all clusters (#4328) 2020-09-14 14:45:02 -07:00
Chance Zibolski
b1e3036bc2 chore: Update helm3 to 3.3.1 (#4323) 2020-09-14 14:28:33 -07:00
Alexander Matyushentsev
df4002a987 fix: fix flaky TestTrackAppStateAndSyncApp e2e test (#4325) 2020-09-14 11:45:59 -07:00
Tim Etchells
96035d3b51 fix: Bundle google font into webpack build (#4324)
Signed-off-by: Tim Etchells <tetchell@redhat.com>
2020-09-14 10:35:17 -07:00
Alexander Matyushentsev
89ee234634 fix: fix possible deadlock in /v1/api/stream/applications and /v1/api/application APIs (#4315) 2020-09-11 20:39:58 -07:00
Alexander Matyushentsev
ff2aa41539 fix: WatchResourceTree does not enforce RBAC (#4311) 2020-09-11 11:14:08 -07:00
Alexander Matyushentsev
85b27e6deb fix: app refresh API should use app resource version (#4303) 2020-09-11 10:26:45 -07:00
Alexander Matyushentsev
d60486fb47 fix: use redis pub-sub with correct context (#4300) 2020-09-10 09:57:32 -07:00
jannfis
41ca6b2ada chore: Upgrade installation manifests & codegen to Kustomize 3 (#3347)
* Use kustomize v3 to build ArgoCD manifests

* Update to test-tools-image v0.3.0

* Reorder patches so Kustomize v3 will properly find targets

* adding back these changes

* Use the generated files.

* changed the namespace

* changed kustomize version to 3.8.1 to be in sync with the one in tool-version.sh

* revert changes in makefile

* Re-run codegen

Co-authored-by: Zhang <may_zhang@intuit.com>
Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-09-09 15:31:33 -07:00
Alexander Matyushentsev
d9f4e224a0 fix: use informer instead of k8s watch to ensure app is refreshed (#4290) 2020-09-09 13:08:18 -07:00
Naoto Enokawa
29c1095a2d docs: Fix typo (#4287) 2020-09-09 08:40:59 -07:00
William Tam
0473ed8104 doc: fix typo "make lint-ui" (#4283)
There is no target "ui" in the Makefile.   The documentation should read "lint-ui".
2020-09-08 13:28:06 -07:00
Joseph Petersen
706205958c fix containers syntax (#4277) 2020-09-08 13:06:25 -07:00
Hyungrok Kim
e5dde6eefc docs: Add Toss to USERS.md (#4282) 2020-09-08 12:19:17 -07:00
Sayak Mukhopadhyay
aa2762a9b7 fix: Added cluster authentication to AKS clusters (#4265) 2020-09-07 19:53:33 -07:00
Niketh Sabbineni
6959f032f0 Update USERS.md (#4274)
Added sumologic to the list of companies
2020-09-05 10:33:07 -07:00
Alexander Matyushentsev
1dfe670d1c fix: revert accidental changes from PR #4250 (#4263) 2020-09-04 16:02:36 -07:00
Alexander Matyushentsev
76782a0270 fix: automatically stop watch API requests when page is hidden (#4269) 2020-09-04 14:36:47 -07:00
dherman
b3be910465 perf: upgrade redis deps to enable compression (#4259)
Newer versions of the redis go libraries include built-in support for
compression of values going to and from redis.  Since the controller
is extremely chatty and makes heavy use of redis for caching, this
reduces the amount of bandwidth requires significantly.

This change should be backwards compatible since the redis libraries
detect whether or not compression was used and does not error in the
no compression case.

Fixes #4256
2020-09-04 13:59:59 -07:00
Alexander Matyushentsev
34c4aa42d6 fix: upgrade gitops-engine dependency (issues #4242, #1881) (#4268) 2020-09-04 13:58:56 -07:00
Alexander Matyushentsev
89ebf5a906 fix: application stream API should not return 'ADDED' events if resource version is provided (#4260) 2020-09-03 22:13:49 -07:00
Alexander Zigelski
bae5f93590 Migrate to Homebrew Core (#3978) (#3979)
* Update Homebrew formula instructions and CI

* docs: Migrate homebrew formula to homebrew-core
2020-09-03 14:44:55 -07:00
Tianxin Dong
8f7eabefd4 docs: Fix typo in documentation (#4254) 2020-09-03 14:03:48 -07:00
Takahiro Tsuruda
8fa2c7f43f docs: add Nikkei to user list (#4253)
Signed-off-by: TakahiroTsuruda <isrgnoe@gmail.com>
2020-09-03 14:02:41 -07:00
Rael Garcia
d3eb8e9590 docs: add list format to the cluster namespaces field (#4237) 2020-09-03 14:01:57 -07:00
Mikhail Mazurskiy
ad38421b76 fix: return parsing error (#3942)
Don't assume that a file is not a Kubernetes
resource if there was no previous objects parsed
2020-09-03 10:14:18 -07:00
Alexander Matyushentsev
92bbcf15e8 fix: JS error when using cluster filter in the /application view (#4247) 2020-09-03 10:13:52 -07:00
Josh Soref
10dc3ac12a fix: Pending deletion tooltip includes trailing semicolon ; (#4250) (#4251) 2020-09-02 21:43:50 -07:00
Alexander Matyushentsev
2f5e45490c fix: improve applications list page client side performance (#4244) 2020-09-02 15:37:37 -07:00
James Callahan
e10c20f683 chore: update to kustomize 3.8.1 (#4130) 2020-09-02 14:01:35 -07:00
Shoubhik Bose
bc537c1e87 docs: improve serviceability terminology (#4240) 2020-09-02 11:18:24 -07:00
Dan Garfield
a482546112 Add CNCF talk to list of resources (#4241)
This is a talk Codefresh did with the CNCF in July, it's been one of the most popular talks on their platform (top 10 for august). Huzzah!
2020-09-02 11:17:31 -07:00
Alexander Matyushentsev
7ead93458e fix: application details page crash when app is deleted (#4229) 2020-09-01 15:25:13 -07:00
May Zhang
dc6d88950c Doc: updated doc for namespace-install (#4199) 2020-09-01 15:08:36 -07:00
Darshan Chaudhary
c44074d4d6 fix: allow clusters to include resources independently (#4027)
Signed-off-by: darshanime <deathbullet@gmail.com>
2020-09-01 14:06:06 -07:00
Alexander Matyushentsev
016c8b333a fix: api-server unnecessary normalize projects on every start (#4219) 2020-09-01 13:06:11 -07:00
Alexander Matyushentsev
cc1592eb0c refactor: load only project names in UI (#4217) 2020-09-01 12:50:03 -07:00
jannfis
ea9b0b35d0 fix: Re-create already initialized ARGOCD_GNUPGHOME on startup (#4214) (#4223) 2020-09-01 21:01:56 +02:00
Josh Soref
44623d6be2 fix: vertically center 3+ letter abbreviations (#4179) (#4180) 2020-09-01 10:39:01 -07:00
Darshan Chaudhary
f625ddc6b9 feat: allow diff against a revision (#4205)
Signed-off-by: darshanime <deathbullet@gmail.com>
2020-09-01 10:30:37 -07:00
chrisob
324a336a52 fix: Add openshift as a dex connector type which requires a redirectURI (#4222) 2020-09-01 10:27:38 -07:00
Alexander Matyushentsev
d09bd23cf8 feat: support gzip compression in api server (#4218) 2020-09-01 10:08:08 -07:00
Johan Sandström
90eb262f64 docs: document how to set helm version (#4216) 2020-09-01 10:02:35 -07:00
Mickaël Canévet
c14f87d565 Update USERS.md (#4213) 2020-08-31 11:24:09 -07:00
Alexander Matyushentsev
fca0f69b5e refactor: Replace status.observedAt with redis pub/sub channels for resource tree updates (#1340) (#4208) 2020-08-31 10:18:12 -07:00
Maxime Brunet
edf2904004 feat: Add Jsonnet version to version endpoint (#4207) 2020-08-31 10:29:32 +02:00
Maxime Brunet
d7a70bfc6f fix(cli): Fix local diff/sync of apps using cluster name (#4201)
This fixes the cluster query when the application uses cluster name as destination:

```shell
$ argocd app diff guestbook --local=guestbook/
FATA[0010] rpc error: code = Internal desc = runtime error: invalid memory address or nil pointer dereference
```
2020-08-29 09:56:49 +02:00
faruryo
a4ea2624a8 docs: Add documentation for Namespace Auto-Creation in application.yaml (#4203)
* update docs/application.yaml for Namespace Auto-Creation

* remove trailing spaces in application.yaml
2020-08-29 09:50:55 +02:00
Alexander Matyushentsev
dec73c77e6 fix: cache inconsistency of child resources (#4053) (#4202) 2020-08-28 22:41:28 -07:00
Alexander Matyushentsev
761ad0bdcf docs: add 1.7.1 and 1.7.2 to CHANGELOG (#4197) 2020-08-28 13:26:15 -07:00
Chetan Banavikalmutt
d1e272e192 feat: Flag to add kustomize common labels (#4131) 2020-08-28 12:07:19 -07:00
Shea Stewart
9fb7aa4f20 Update USERS.md (#4193)
I am a partner at Arctiq and we use the argo suite extensively for internal tooling, and am also the technical lead for the DevOps Platform at BCGov in which we are using ArgoCD (and the suite) for cluster configuration management.
2020-08-28 09:07:50 -07:00
Josh Soref
8fa0f04e43 fix: remove stray period (#4183) (#4184) 2020-08-27 16:58:42 -07:00
Byungjin Park (BJ)
c00e84700c Update USERS.md (#4185) 2020-08-27 16:52:28 -07:00
Alexander Matyushentsev
2d2335f95a fix: upgrade github.com/evanphx/json-patch to v4.9.0 (#4189) 2020-08-27 15:21:57 -07:00
Daisuke Taniwaki
10d05cdb60 fix: Allow no config cluster (#4164)
* Update USERS.md

* Allow no config cluster

* Add tests

* Fix lint issues
2020-08-26 19:50:02 -07:00
Michael Barrientos
9f79340505 fix: support for PKCE for cli login (#2932) (#4067) 2020-08-26 16:02:39 -07:00
Alexander Matyushentsev
290712d4b3 docs: document YAML handling change in v1.7 upgrade instructions (#4168) 2020-08-26 14:41:08 -07:00
Alexander Matyushentsev
c49dd8d383 feat: support storing app parameters in .argocd-app.yaml file (#4084)
* feat: support storing app parameters in .argocd-app.yaml file

* rename .argocd-app.yaml to .argocd-source.yaml
2020-08-26 14:27:34 -07:00
Oleg Sucharevich
3a50f8df81 feat: do not include kube-api check in application liveness flow (#4163)
* feat: do not include kube-api liveness check in application liveness flow
2020-08-26 10:33:36 -07:00
Alexander Matyushentsev
569a2a6bc6 fix: Unable to create project JWT token on K8S v1.15 (#4165) 2020-08-26 10:31:52 -07:00
Alex Gervais
2e8a8f09b1 docs: Update README.md with a new community tutorial (#4161) 2020-08-26 16:04:34 +02:00
Alexander Matyushentsev
d04b6e2d35 refactor: upgrade gitops-engine version (#4160) 2020-08-26 00:00:28 -07:00
Johan
f208700f78 feat: Add configurable Helm version (#4111)
This commit adds support for configurable Helm version either via
declarative syntax or via argocd cli.

New helm option 'Version' added to the ApplicationSourceHelm
struct which can be either 'v2' or 'v3'.

Argocd app create accepts '--helm-version' that also looks for the
same Helm versions as above.
2020-08-25 12:36:27 -07:00
Chetan Banavikalmutt
7a3d05cb7c docs: Switch to argocd namespace before starting local services (#4153) 2020-08-25 19:20:06 +02:00
May Zhang
8df8bfff18 fix: Badge links are not generating properly when using --rootpath (#4140)
* fix: Badge links are not generating properly when using --rootpath

* fix: fix lint error

* fix: use context.baseHref
2020-08-25 09:54:30 -07:00
Josh Soref
9ac6bb3248 fix: clear filters to show (#4142) (#4143) 2020-08-25 09:20:36 -07:00
Alexander Matyushentsev
ee57ded16f refactor: upgrade K8S client to v0.18.8 (#4149) 2020-08-24 16:46:38 -07:00
Shoubhik Bose
f508dec107 chore: add nodemodules to gitignore (#4151) 2020-08-24 14:00:22 -07:00
S.H
0b387a454b doc: fix the ci_automation's kustomize source code. (#4144) 2020-08-24 13:57:54 -07:00
May Zhang
bc565d384d fix: UI setting auto sync causes erroneous config (#4118)
* fix: UI setting auto sync causes erroneous config

* fix: remove log
2020-08-24 12:13:06 -07:00
jannfis
372eae0f21 fix: Make GnuPG keyring independent of user ID within container (#4136)
* fix: Make GnuPG keyring independent of user ID within container

* Update unit test
2020-08-24 12:01:41 -07:00
Marc Boorshtein
474301c5ab docs: fixed link for OpenUnison (#4150)
* added docs for openunison integration

* fixed formatting

* added link to makedocs, fix last header

* fix link
2020-08-24 11:58:39 -07:00
Marc Boorshtein
beb2817d6f docs: added docs for openunison integration (#4146)
* added docs for openunison integration

* fixed formatting

* added link to makedocs, fix last header
2020-08-24 19:28:51 +02:00
Remington Breeze
0ee983fc31 chore(docs): add note about base64 encoding to SSO documentation (#4139) 2020-08-24 16:43:57 +02:00
Oleg Sucharevich
c32d5fd5ee docs: Add remote debugging example to contribution docs
docs: fix grammar

Minor editing

empty
2020-08-24 16:39:51 +02:00
Yankee
0d193cfd57 docs: Update broken link for Branch Tracking (#4147)
Updated broken internal link for the Branch Tracking section.
2020-08-24 16:35:33 +02:00
Povilas Versockas
263e7a8497 feat: add grpc metrics in repo server (#3827) 2020-08-18 21:48:42 -07:00
Povilas Versockas
7f86e6b38c feat: add git histogram metrics (#3828) 2020-08-18 21:48:00 -07:00
Povilas Versockas
194d471db4 fix: rename redis histogram metric name (#3829) 2020-08-18 21:45:47 -07:00
Jared Welch
84e8af7976 chore: Add New Relic to USERS.md (#4119)
New Relic (https://newrelic.com/) is officially using ArgoCD along with the other Argo projects to deploy to Kubernetes.
2020-08-18 15:08:17 -07:00
Nicholas St. Germain
f2dca0315c docs: Update traefik gRPC docs (#4112) (#4113) 2020-08-18 13:35:04 -07:00
Suraj Biyani
01d9b94f62 docs: Add Beat to USERS (#4109) 2020-08-17 13:56:27 -07:00
Oleg Sucharevich
ebb216ff11 fix: log warn when external url is not fully qualified (#4108) 2020-08-17 14:54:10 +02:00
Chetan Banavikalmutt
e56997f504 docs: Fix spelling in contributing guide and FAQ (#4107) 2020-08-17 09:06:52 +02:00
Oleg Sucharevich
f66dd977e7 fix: support ** wildcard in repo sources permitted sources (#3759) (#4085)
* chore: add more tests to permitted sources (#3759)

* fix: support ** wildcard  in repo sources

* keep backward compitability

* fix: typo

* use separator only in source
2020-08-14 12:49:35 -07:00
Alexander Matyushentsev
0a19fbc6e3 docs: add 1.7 changelog and update instructions (#4095)
* docs: add 1.7 changelog and update instructions

* apply reviewer notes
2020-08-14 12:47:50 -07:00
Daniel Barclay
88159ed84c docs: Fixed some resource_hooks.md grammatical problems. (#4005) 2020-08-14 11:11:30 -07:00
Johnathan Falk
7eee090507 docs: Added some grammar and readability fixes to roadmap (#4100)
* Added some grammer fixes.

Signed-off-by: Johnathan Falk <johnathan.falk@gmail.com>

* docs: updated docs/raodmap.md.

Signed-off-by: Johnathan Falk <johnathan.falk@gmail.com>
2020-08-14 10:26:57 -07:00
Alexander Matyushentsev
c387a27f73 docs: add roadmap document (#3906)
* docs: add first roadmap draft

* Update docs/roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>

* Update docs/roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>

* Update docs/roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>

* Update docs/roadmap.md

Co-authored-by: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com>

* Update docs/roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>

* Update docs/roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>

* Update docs/roadmap.md

Co-authored-by: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com>

* Update docs/roadmap.md

Co-authored-by: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com>

* update table on content; add argocd-image-updater-link

* Update docs/roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>

* add more information about ApplicationSet project

* Update roadmap.md

Co-authored-by: Remington Breeze <remington@breeze.software>
Co-authored-by: Ishita Sequeira <46771830+ishitasequeira@users.noreply.github.com>
Co-authored-by: Ed Lee <edlee2121@users.noreply.github.com>
2020-08-13 12:32:44 -07:00
Alexander Matyushentsev
959dd4ee99 Update gpg-verification.md (#4080) 2020-08-13 12:32:11 -07:00
Alex Stein
e2cdfddc8d docs: adds initial documentation for user-defined-styles feature (#3642) (#4089) 2020-08-13 11:36:28 -07:00
Alexander Matyushentsev
b4f80133d0 docs: document 'ignoreResourceStatusField' option (#4093) 2020-08-13 11:14:45 -07:00
Alexander Matyushentsev
523bc50eb7 fix: remove unnecessary liveness probe from argocd components (#4082) 2020-08-13 08:01:00 -07:00
descrepes
3d4d64e1b7 docs: Add InsideBoard to USERS (#4088) 2020-08-12 15:07:19 +02:00
Alexander Matyushentsev
f6dbe5ad8a fix: removes unnecessary scroll on apps filter panel (#4073) 2020-08-11 13:29:11 -07:00
Alexander Matyushentsev
cea3c19d62 feat: support disabling grpc histogram (#4075) 2020-08-11 13:28:57 -07:00
Josh Soref
c99ddc46bb fix: add line break between committer and date (#4078)
Fixes #4077
2020-08-11 13:28:40 -07:00
Josh Soref
176faa57b0 chore: Use https (#4076)
* Use https

* Use https

* Use https

* Use https
2020-08-11 20:55:47 +02:00
Alexander Matyushentsev
2854497644 fix: add partial sync with namespace example to 'argcocd app sync' command (#4074) 2020-08-11 10:21:11 -07:00
Shoubhik Bose
f1212736c0 docs: Add adoption section (#4063)
* docs: Add adoption section

Should we list adoption separately ? Would be nice if we could add more known adopters to the list.

* Link to users.md

* Add a whitespace between Argo and CD :)
2020-08-11 09:34:17 -07:00
Alexander Matyushentsev
997f38d640 fix: cluster settings change is not applied correctly (#4070) 2020-08-10 16:13:06 -07:00
Alexander Matyushentsev
c3a05e8cf5 fix: 'argocd app sync' should not wait for app refresh if '--dry-run' flag is set (#4069) 2020-08-10 15:02:16 -07:00
Alex Stein
978d10f2f3 feat: add user-defined css overlay (#3642) (#4065) 2020-08-10 19:13:40 +02:00
Alexander Matyushentsev
6cbcbe7003 fix: make sure allow-cluster-resource/deny-cluster-resource are consistent with allow-namespace-resource/deny-namespace-resource commands (#4064) 2020-08-06 15:28:43 -07:00
Alexander Matyushentsev
aaab777d27 fix: optional 'name' flag of add-orphaned-ignore/remove-orphaned-ignore command should be named, not positional (#4062) 2020-08-06 15:28:22 -07:00
rachelwang20
011415f5bd feat: Switch to use weighted semaphore (#4049)
* Switch to use weighted semaphore

* Add replica count env

* fixed codegen
2020-08-06 13:29:30 -07:00
jannfis
cc8dd94d27 docs: Clarify that retry in application spec is available from 1.7 (#4061) 2020-08-06 10:34:55 -07:00
Alexander Matyushentsev
68597718bf fix: terminated sync operation should not auto-retry (#4056) 2020-08-05 17:58:59 -07:00
Alexander Matyushentsev
c82451ca9a fix: infer app destination server URL prior app deletion and during lightweight reconciliation (#4039)
* fix: infer app destination server URL prior app deletion and during lightweight reconciliation

* apply reviewer notes
2020-08-05 17:58:20 -07:00
Alexander Matyushentsev
ba71ad934c refactor: upgrade k8s client to 1.18 (#4046)
* refactor: upgrade k8s client to 1.18

* remove unnecessary go mod replacements
2020-08-05 11:36:40 -07:00
May Zhang
2f92cdd2eb fix: not hide resource when resource is owned by other resource (#4022)
* fix: show resource when this resource owned by other resource

* fix: fix lint error

* fix: using map to reduce loops
2020-08-05 09:35:26 -07:00
Darshan Chaudhary
cb7fa39144 feat: add cluster resource blacklist to projects (#3960)
feat: add cluster resource blacklist to projects (#3960)

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-08-04 08:06:28 -07:00
Imre Nagi
5908963cca fix: trim right backslash in cluster server URL (#4037)
Signed-off-by: Imre Nagi <imre.nagi@go-jek.com>
2020-08-04 07:50:26 -07:00
UlyssesCB
38584bff25 docs: Add QuintoAndar to USERS (#4043) 2020-08-04 07:36:49 -07:00
Alexander Matyushentsev
aecf149159 fix: kustomize-version flag is not working on 'argocd app set' command (#4040) 2020-08-03 21:46:03 -07:00
rachelwang20
18de22744e feat: Adding text box and dropdown allows user to switch cluster url & name (#4019)
* Include sub and and iat in PermissionDenied message

* Run test-local

* Fix typo

* Fix lint error

* iat fromat changing

* Adding MapClaims convertion

* Fix lint issue

* Fix golang lint

* Fix blank space

* Fix missing field

* Adding Orphaned exception list

* Fixed lint error

* Rebased on master

* Adding group kind label

* golangci-lint run

* Addressed comments

* Fixed lint errors

* Method rename

* orphaned ignore list cli support

* Add switch for cluster name & URL

* Added also in application update

* address review comment
2020-08-03 13:31:16 -07:00
Darshan Chaudhary
c4834492b9 feat: add client side keepalive pings (#4026) 2020-07-31 13:48:51 -07:00
Rael Garcia
e80e5fcbe4 docs: Add namespace field to cluster secret documentation (#3992)
* docs: add `namespace` field to cluster secret documentation

This feature for connecting with clusters where you only are (or can) watch a set of namespaces. Also useful when connecting argo with several clusters to avoid having the controller watching every single kind from every single api group from every single cluster.

https://github.com/argoproj/argo-cd/pull/2839

* fix: typo in the cluster namespaces description
2020-07-31 09:13:13 +02:00
May Zhang
613af547c3 feat: adding validate for app create and app set (#4016)
* feat: adding disable-validation for app create and app set

* feat: adding disable-validation for app create and app set

* feat: change test func name

* feat: added support of app unset and app edit in addition to app create and app set.

* feat: remove extra space.
2020-07-30 13:28:36 -07:00
Darshan Chaudhary
9b99276d59 fix: skipped resources should not impact sync status (#3986)
* fix: skipped resources should not impact sync status

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-07-30 10:09:12 -07:00
Alexander Matyushentsev
e0d0968b89 feat: support overriding default cluster re-sync duration (#4014) 2020-07-30 10:00:19 -07:00
Nick Stogner
b96910cddc fix: Microsoft SSO docs RBAC ConfigMap ref (#4012) 2020-07-29 13:48:20 -07:00
May Zhang
382bbdf031 feat: autosync protection (#3996) 2020-07-28 19:52:30 -07:00
Alexander Matyushentsev
50d9914e8d fix: handle encoded URL parameter in cluster details page (#4011) 2020-07-28 14:16:49 -07:00
Alexander Matyushentsev
5a4ded4f3f fix: minor UI fixes in applications create/edit panels (#4009) 2020-07-28 12:38:21 -07:00
Alexander Matyushentsev
a6399e59e1 feat: support retrying failed sync attempts (#3997)
* feat: support retrying failed sync attempts

* fix: sync results should be cleared in retry sync attempt
2020-07-28 10:14:17 -07:00
XIAO TANG
09c1656a22 docs: Add LINE to list of users (#4007) 2020-07-28 08:00:21 -07:00
May Zhang
067dcce88d feat: auto create namespace (#3976)
* feat: auto create namespace

* feat: fixing yarn lint error.

* feat: fixing yarn lint error.

* update to the latest gitops-engine

* fix tidiness of go.sum
2020-07-27 13:33:08 -07:00
Arthur Outhenin-Chalandre
3b8ee7840b fix: normalize libs jsonnet and broken command in docs (#4003)
* fix: jsonnet Libs normalize

Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr>

* fix: jsonnet libs broken command in docs

Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr>
2020-07-27 20:16:22 +02:00
Frederik Weber
34b7ad7000 fix: #3933 - Use a non root Redis Image (#3934)
* fix: #3933 - Set Security Context for Redis Image

* Also set Group in Redis Security Context

* Regenerate with Kustomize 2.0.3
2020-07-27 19:46:08 +02:00
jannfis
506fceae32 fix: Normalize Helm chart path when chart name contains a slash (#3987)
* fix: Normalize Helm chart path when chart name contains a slash

* handle special cases and add unit tests
2020-07-25 09:14:46 +02:00
Liviu Costea
275daa7976 feat: Support applications with cluster name in the ui #1548 (#3944)
* feat: Support applications with cluster name in the ui

* Retrigger CI pipeline
2020-07-24 15:37:58 -07:00
rachelwang20
7a348f786b feat: Allow custom cluster names (#3985)
* Include sub and and iat in PermissionDenied message

* Run test-local

* Fix typo

* Fix lint error

* iat fromat changing

* Adding MapClaims convertion

* Fix lint issue

* Fix golang lint

* Fix blank space

* Fix missing field

* Adding Orphaned exception list

* Fixed lint error

* Rebased on master

* Adding group kind label

* golangci-lint run

* Addressed comments

* Fixed lint errors

* Method rename

* orphaned ignore list cli support

* Orphaned resources cli support

* Display orphaned resource cli

* Added tests

* Create argocd app resources command

* Addressed comments

* fix a lint error
2020-07-24 13:23:26 -07:00
Alexander Matyushentsev
1a36fd178a chore: stop using pre-built docker images for testing/code generation (#3955) 2020-07-23 08:05:06 +02:00
Alexander Matyushentsev
6ebd156198 fix: support project finalizer to ensure proper deletion (#3967)
* fix: support project finalizer to ensure proper deletion

* apply reviewer notes
2020-07-21 17:25:41 -07:00
Alexander Matyushentsev
1b956f133b fix: application resources info should be stored in persistent order (#3974) 2020-07-21 16:59:00 -07:00
Alexander Matyushentsev
4ceb403632 fix: reduce number of v1/applications/<appName>/syncwindows requests from app details page (#3973) 2020-07-21 13:14:04 -07:00
Alexander Matyushentsev
141018acc0 fix: argocd-util diff-reconcile-results should print app reconcile results sorted by app name (#3972) 2020-07-21 12:00:49 -07:00
Simon Clifford
ececbed999 fix: allow duplicates when using generateName (#3878)
* Generate Name field generates names when created so should not cause a duplication warning
* Updating existing test case to check no additional conditions are added
2020-07-21 10:15:41 -07:00
Darshan Chaudhary
53a9222ad7 feat: delete in reverse order of sync waves (#3959)
* feat: delete in reverse order of sync waves

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: add tests for deletion in order

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: fix lint for appcontroller.go

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: add comment to explain early return

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-07-21 09:52:59 +02:00
Alexander Matyushentsev
dfd7457c21 fix: use glob matcher in casbin built-in model (#3966) 2020-07-20 13:55:19 -07:00
rachelwang20
52926b7cb0 feat: Create argocd app resources CLI with various filters. (#3946)
* Include sub and and iat in PermissionDenied message

* Run test-local

* Fix typo

* Fix lint error

* iat fromat changing

* Adding MapClaims convertion

* Fix lint issue

* Fix golang lint

* Fix blank space

* Fix missing field

* Adding Orphaned exception list

* Fixed lint error

* Rebased on master

* Adding group kind label

* golangci-lint run

* Addressed comments

* Fixed lint errors

* Method rename

* orphaned ignore list cli support

* Orphaned resources cli support

* Display orphaned resource cli

* Added tests

* Create argocd app resources command

* Addressed comments
2020-07-20 13:29:25 -07:00
Alexander Matyushentsev
c8def406b0 refactor: upgrade gitops engine (#3962) 2020-07-20 10:11:17 -07:00
Alexander Matyushentsev
e92e0fa409 fix: bump gitops engine version (#3954) 2020-07-17 12:46:58 -07:00
Omer Kahani
9805996975 docs: Add GitOps Deployment and Kubernetes blog post (#3935)
* Add GitOps Deployment and Kubernetes blog post

* Update README.md

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-07-17 12:27:20 -07:00
Soheil Eizadi
664609af91 Update README.md (#3851) 2020-07-17 09:57:23 -07:00
Daniel Iziourov
9ef40f457a docs: expanding the description of repo credendials (#3938)
Signed-off-by: danmx <daniel@iziourov.info>
2020-07-17 18:54:07 +02:00
jannfis
fec4dc78c3 chore: Fix intermittently failing CLI build in e2e-tests (#3952)
* fix: Do not use -i flag when building CLI

* Debug output

* re-disable CGO

* increase timeout

* correctly create dist directory before e2e server

* Revert
2020-07-17 18:35:02 +02:00
Alexander Matyushentsev
f9889e3c0b fix: wait/sync command should send app resource version to avoid app stale data (#3951) 2020-07-17 08:34:48 +02:00
rachelwang20
561f30815c feat: Orphaned ignore list cli support (#3922)
* Include sub and and iat in PermissionDenied message

* Run test-local

* Fix typo

* Fix lint error

* iat fromat changing

* Adding MapClaims convertion

* Fix lint issue

* Fix golang lint

* Fix blank space

* Fix missing field

* Adding Orphaned exception list

* Fixed lint error

* Rebased on master

* Adding group kind label

* golangci-lint run

* Addressed comments

* Fixed lint errors

* Method rename

* orphaned ignore list cli support
2020-07-14 14:53:56 -07:00
Hiroki Sakamoto
1a94538568 docs: add installation step for running locally (#3923)
* docs: add installation step for running locally

* docs: fix to add apply command
2020-07-14 16:56:32 +02:00
Hiroki Sakamoto
0d571fce14 feat: add resource's age & creation time (#3931)
* feat: add resource creation time to api response

* feat: add creation time to model

* feat: add resource's age to app detail page

* feat: add created_at to resource summary page
2020-07-14 16:54:00 +02:00
Hiroki Sakamoto
4336c46c8a chore: pass image namespace env to manifests (#3926) 2020-07-14 16:52:30 +02:00
Hiroki Sakamoto
6f77d9b7bb chore: pass required envs to repo server (#3929) 2020-07-14 09:38:30 +02:00
Matthias Riegler
e930de1228 Feat: (Jsonnet) Add support to include library paths (#3825)
* feat: added Libs field to ApplicationSourceJsonnet

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* feat: codegen

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* feat: implemented jsonnet jpath arguments

- Implement the `-J` command line flag for jsonnet
- adapt test to include a nested library for testing the VM
  functionality

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* feat: jsonnet import path relative to the repoRoot

- adapted testCase to make use of a jpath
- join repoRoot and provided jpath attributes

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* fix: added checking for out-of-repoRoot references

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* feat: Added CLI option for passing jsonnet libs

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* feat: Updated jsonnet docs

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* fix: renamed function

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* feat: Expose --local-repo-root flag

Allows passing a "virtal" git repository root when using the local sync
mode with --local.
Provides backwardscompatible with the previous default value ("/")

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* fix: added missing command

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>

* Remove obsolete line out of docs

Signed-off-by: Matthias Riegler <matthias.riegler@taotesting.com>
2020-07-13 23:18:21 +02:00
gambuzzi
2a7aabe5a5 feat: add flagger.app/Canary health check lua script and tests (#3902)
* add flagger.app/Canary health check lua script and tests

* add flagger.app/Canary health check lua script and tests, fix type

* add handle for flagger Initialized phase

* add handle for flagger Initialized phase and test
2020-07-13 13:14:22 -07:00
Alexander Matyushentsev
60637e6df2 fix: remove TestSyncOptionDryRun test (#3939) 2020-07-13 11:59:30 -07:00
Alexander Matyushentsev
817f68aeec feat: display sync operation status message on app details page (#3918) 2020-07-13 11:22:08 -07:00
rachelwang20
95820cf64f feat: User can define Orphaned exception avoiding unnecessary warnings (#3900)
* Include sub and and iat in PermissionDenied message

* iat fromat changing

* Adding MapClaims convertion

* Adding Orphaned exception list

* Adding group kind label

* Fixed lint errors

* Method rename
2020-07-09 16:19:47 -07:00
Darshan Chaudhary
921606169a chore: bump up k8s.io dependencies to 1.17 (#3899)
chore: bump up k8s.io dependencies to 1.17 (#3899)

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-07-09 13:38:32 -07:00
Alin Balutoiu
a4815e0f8a fix: Update dependencies built from source for ARM (#3909)
Signed-off-by: Alin Balutoiu <alinbalutoiu@gmail.com>
2020-07-09 09:55:49 -07:00
Vlad
e18438cf7b Add Garner (#3903) 2020-07-08 09:53:55 -07:00
jannfis
48d942087d chore: Integrate Docker build into CI for PRs (#3898) 2020-07-08 09:44:04 -07:00
Darshan Chaudhary
63acc26211 fix: don't refresh if dry run (#3891)
* fix: don't refresh if dry run

Signed-off-by: darshanime <deathbullet@gmail.com>

* fix: add e2e test for sync with dry-run

Signed-off-by: darshanime <deathbullet@gmail.com>

* fix: refresh only if not dryRun for sync command

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-07-08 09:43:39 -07:00
Darshan Chaudhary
508e2c5f78 chore: make make cli use virtualized toolchain (#3884)
* chore: make make cli use virtualized toolchain

Signed-off-by: darshanime <deathbullet@gmail.com>

* chore: use cli-local in Dockerfile

Signed-off-by: darshanime <deathbullet@gmail.com>

* chore: use cli-local in Dockerfile

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-07-04 12:58:57 +02:00
Darshan Chaudhary
b3c118d4c0 feat: ignore status globally (#3754)
feat: ignore status globally (#3754)
2020-07-02 23:28:36 -07:00
May Zhang
021b13c660 fix: permission denied due to NormalizeProjs failed to get list of pr… (#3883)
* fix: permission denied due to NormalizeProjs failed to get list of projects

* fix: permission denied due to NormalizeProjs failed to get list of projects

* fix: return error if normalization failed.

* fix: return error if normalization failed.

* fix: return error if normalization failed.

* fix: in GetJWTToken, remove normalize. It causes issue with delete token.

* Moved get project to only when apierr.IsConflict(err)
2020-07-02 15:31:35 -07:00
Alexander Matyushentsev
34a51b4772 fix: refactor: upgrade gitops engine version to pull in diffing fix (#3886) 2020-07-02 15:30:21 -07:00
Alexander Matyushentsev
d09d25cc2a feat: implement 'argocd-util apps get-reconcile-results command' (#3888)
* feat: implement 'argocd-util apps get-reconcile-results' command

* implement missing unit tests
2020-07-02 13:47:56 -07:00
Josh Soref
21c93d95f4 fix: Correct filters disclosure widget direction (#3885)
Fixes #3879
2020-07-02 09:18:54 +02:00
Jacob Smullin
0dd00580c2 Add in clientID function call. (#3853) 2020-07-01 16:49:38 -07:00
Alexander Matyushentsev
12cec86e43 fix: more space for application title (#3880) 2020-06-30 10:49:14 -07:00
rachelwang20
66dbc7ec73 feat: Include sub and and iat in PermissionDenied message (#3850)
* Include sub and and iat in PermissionDenied message

* Run test-local

* Adding MapClaims convertion

* Fix lint issue

* Fix golang lint
2020-06-29 20:19:04 -07:00
May Zhang
c6d8beed3e fix: UI for App Creation Requires Namespace Even When Repo Contains Only Global Custom Resource (#3875) 2020-06-29 17:33:29 -07:00
May Zhang
d676209daa fix: App Creation Requires Namespace Even When Repo Contains Only Global Custom Resource (#3874)
* fix: App Creation Requires Namespace Even When Repo Contains Only Global Custom Resource

* fix a typo

* fix a failed test
2020-06-29 16:33:13 -07:00
Alexander Matyushentsev
20eb8bbc4d fix: application list page consumes too much CPU (#3849)
* fix: application list page consumes too much CPU

* add broadcasterHandler tests
2020-06-29 15:32:18 -07:00
Seth Mason
9466071561 Added D2iQ (#3873) 2020-06-29 10:08:52 -07:00
Artem Yarmoliuk
099811c200 feat(dex): allow dex custom static clients (#3834) (#3835)
* feat(dex): allow dex custom static clients

* feat(dex): update dex doc
2020-06-26 19:01:45 +02:00
Junya Ogasawara
b697f56b4c docs: Add Money Forward to USERS.md (#3857) 2020-06-26 18:13:32 +02:00
Ryota
ba31d2001c docs: Correct bullet format (#3832) 2020-06-26 12:09:07 +02:00
May Zhang
7fbf51c346 fix: jwtTokens are reset when applying AppProjects (#3791)
* jwtTokens are reset when applying AppProjects

* fix unit tests in server_test.go
checking in generated.pb.go

* fix unit tests in rbackpolicy_test.go

* fix yarnl lint errors

* fix delete token in both spec and status

* add tests

* fixing failed test

* fixing failed test

* retry 3 times during update

* renamed CRD fields.
Updated nomalize method.

* fixed UI

* fixing merge conflicts

* fixing merge conflicts

* removed unused variables in UI
renamed a CRD field
updated combineToken logic using map

* Only update project which needs normalize token.

* Changed logging.

* check for nil

* Fix UI

* added project role get tests

* rename variables

* clean up

* fixing failed tests

* fixing failed tests

* fixing error handling for remove token

* log err when we have retried 3 times

* sort tokens

* sort tokens
2020-06-25 15:11:24 -07:00
Alexander Matyushentsev
aee6003d6e fix: sort application summary images and urls to avoid unnecessary updates (#3848) 2020-06-25 09:53:12 -07:00
Alexander Matyushentsev
ce4ac1f88e fix: avoid lock contention in GetClustersInfo method (#3844) 2020-06-24 17:19:39 -07:00
Alexander Matyushentsev
83f9bbf8c4 refactor: upgrade to 1.3 pre-release gitops engine verison (#3842) 2020-06-24 12:30:25 -07:00
jannfis
c76d7b9c7c refactor: There were some more places needed for JSON marshaler migration (#3840) 2020-06-24 20:34:29 +02:00
jannfis
28eb286f85 refactor: Migrate JSON marshaler from gitops-engine to argo-cd (#3839)
* fix: Migrate JSON marshaler from gitops-engine to argo-cd

* Lint
2020-06-24 18:07:49 +02:00
Isaac Gaskin
24acaefce3 fix(revision.tsx): correcting regex for matching SHAs (#3820)
caused some targetRevisions to be treated like commits instead of branches, also fixed URLs for github repos

3801
2020-06-23 09:14:29 -07:00
Alexander Matyushentsev
5751404c58 chore: change version to 1.7.0 (#3826) 2020-06-23 14:29:34 +02:00
Alexander Matyushentsev
5d5d6a4ad6 feat: Display cluster info on cluster details page (#3793)
* feat: Display cluster info on cluster details page

* Store cluster info in cache instead of secret
2020-06-22 17:51:20 -07:00
Povilas Versockas
7d4f8558fe feat: add grpc histogram metric in server (#3776) 2020-06-22 16:02:31 -07:00
Alexander Matyushentsev
42e24e6e2a fix: controller should not re-trigger auto-sync if sync failed due to comparison error (#3824) 2020-06-22 14:09:22 -07:00
Alexander Matyushentsev
fc2e3f82a2 fix: application controller should not modify cached applications (#3821) 2020-06-22 11:04:25 -07:00
jannfis
be718e2b61 feat: GPG commit signature verification (#2492) (#3242)
* Add initial primitives and tests for GPG related operations

* More tests and test documentation

* Move gpg primitives to own module

* Add initial primitives for running git verify-commit and tests

* Improve and better comment test

* Implement VerifyCommitSignature() primitive for metrics wrapper

* More commentary

* Make reposerver verify gpg signatures when generating manifests

* Make signature validation optional

* Forbid use of local manifests when signature verification is enabled

* Introduce new signatureKeys field in project CRD

* Initial support for only syncing against signed revisions

* Updates to GnuPG primitives and more test cases

* Move signature verification to correct place and add tests

* Add signature verification result to revision metadata and display it in UI

* Add more primitives and move out some stuff to common module

* Add more testdata

* Add key management primitives to ArgoDB

* Move type GnuPGPublicKey to appsv1 package

* Add const ArgoCDGPGKeysConfigMapName

* Handle key operations with appsv1.GnuPGPublicKey

* Add initial API for managing GPG keys

* Remove deprecated code

* Add primitives for adding public keys to configuration

* Change semantics of ValidateGPGKeys to return more key information

* Add key import functionality to public key API

* Fix code quirks reported by linter

* More code quirks fixes

* Fix test

* Add primitives for deleting keys from configuration

* Add delete key operation to API and CLI

* Cosmetics

* Implement logic to sync configuration to keyring in repo-server

* Add IsGPGEnabled() primitive and also update trustdb on ownertrust changes

* Use gpg.IsGPGEnabled() instead of custom test

* Remove all keyring manipulating methods from DB

* Cosmetics/comments

* Require grpc methods from argoproj pkg

* Enable setting config path via ARGOCD_GPG_DATA_PATH

* Allow "no" and any cases in ARGOCD_GPG_ENABLED

* Enable GPG feature on start and start-e2e and set required environment

* Cosmetics/comments

* Cosmetics and commentary

* Update API documentation

* Fix comment

* Only run GPG related operations if GPG is enabled

* Allow setting ARGOCD_GPG_ENABLE from the environment

* Create GPG ConfigMap resource during installation

* Use function instead of constant to get the watcher path

* Re-watch source path in case it gets recreated. Also, error on finish

* Add End-to-End tests for GPG commit verification

* Introduce SignatureKey type for AppProject CRD

* Fix merge error from previous commit

* Adapt test for additional manifest (argocd-gpg-keys-cm.yaml)

* Fix linter issues

* Adapt CircleCI configuration to enable running tests

* Add wrapper scripts for git and gpg

* Sigh.

* Display gpg version in CircleCI

* Install gnupg2 and link it to gpg in CI

* Try to install gnupg2 in CircleCI image

* More CircleCI tweaks

* # This is a combination of 10 commits.
# This is the 1st commit message:

Containerize tests - test cycle

# This is the commit message #2:

adapt working directory

# This is the commit message #3:

Build before running tests (so we might have a cache)

# This is the commit message #4:

Test limiting parallelism

# This is the commit message #5:

Remove unbound variable

# This is the commit message #6:

Decrease parallelism to find out limit

# This is the commit message #7:

Use correct flag

# This is the commit message #8:

Update Docker image

# This is the commit message #9:

Remove build phase and increase parallelism

# This is the commit message #10:

Further increase parallelism

* Dockerize toolchain

* Add new targets to Makefile

* Codegen

* Properly handle permissions for E2E tests

* Remove gnupg2 installation from CircleCI configuration

* Limit parallelism of build

* Fix Yarn lint

* Retrigger CI for possible flaky test

* Codegen

* Remove duplicate target in Makefile

* Pull in pager from dep ensure -v

* Adapt to gitops-engine changes and codegen

* Use new health package for health status constants

* Add GPG methods to ArgoDB mock module

* Fix possible nil pointer dereference

* Fix linter issue in imports

* Introduce RBAC resource type 'gpgkeys' and adapt policies

* Use ARGOCD_GNUPGHOME instead of GNUPGHOME for subsystem configuration

Also remove some deprecated unit tests.

* Also register GPG keys API with gRPC-GW

* Update from codegen

* Update GPG key API

* Add web UI to manage GPG keys

* Lint updates

* Change wording

* Add some plausibility checks for supplied data on key creation

* Update from codegen

* Re-allow binary keys and move check for ASCII armoured to UI

* Make yarn lint happy

* Add editing signature keys for projects in UI

* Add ability to configure signature keys for project in CLI

* Change default value to use for GNUPGHOME

* Do not include data section in default gpg keys CM

* Adapt Docker image for GnuPG feature

* Add required configuration to installation manifests

* Add add-signature-key and remove-signature-key commands to project CLI

* Fix typo

* Add initial user documentation for GnuPG verification

* Fix role name - oops

* Mention required RBAC roles in docs

* Support GPG verification of git annotated tags as well

* Ensure CLI can build succesfully

* Better support verification on tags

* Print key type in upper case

* Update user documentation

* Correctly disable GnuPG verification if ARGOCD_GPG_ENABLE=false

* Clarify that this feature is only available with Git repositories

* codegen

* Move verification code to own function

* Remove deprecated check

* Make things more developer friendly when running locally

* Enable GPG feature by default, and don't require ARGOCD_GNUPGHOME to be set

* Revert changes to manifests to reflect default enable state

* Codegen
2020-06-22 18:21:53 +02:00
Roman
a886241ef2 Specify ingress namespace in docs (#3809) 2020-06-20 16:23:15 -07:00
Liviu Costea
7ccb16bf7a feat: Support cluster name on Application destination. Closes #1548 (#2808)
feat: Support cluster name on Application destination. Closes #1548 (#2808)
2020-06-20 16:12:46 -07:00
Liviu Costea
fab28f7f64 Remove outdated references to dep targets (#3817) 2020-06-20 16:01:50 -07:00
Alexander Matyushentsev
49b6157308 chore: implement development helpers that mount config maps to local folder (#3796) 2020-06-19 12:27:39 -07:00
Alexander Matyushentsev
c7c554674e docs: fix invalid link in declarative-setup.md (#3813) 2020-06-19 09:33:42 -07:00
David Laban
37f5a8bfc0 docs: use kubectl apply in Declarative Setup (#3812)
The declarative setup approach is very powerful, and potentially reduces the
number of tools that you need to learn.

When coming in fresh to help out a colleague (without my head
in ops mode) my brain failed to make the mental leap from
"kubernetes manifests" to "Oh! I can use `kubectl apply` for those!".
I was worried that I would need to get kustomize out to combine things
together or something.

This patch points out that `kubectl apply` really is good enough for this job,
and also points out that it lets you skip a bunch of steps when setting up your
cluster.
2020-06-19 09:07:01 -07:00
rumstead
62bb719f88 docs: Update api-docs.md (#3810)
moving around some words
2020-06-19 17:06:56 +02:00
Isaac Gaskin
3126f4f4ae fix(application-tiles.tsx): moving helm/git icon to the left of app name (#3808)
was obtrustive in its current possition and truncating text

#3794
2020-06-19 17:04:08 +02:00
Alexander Matyushentsev
0486c72b95 docs: add v1.6.1 changelog (#3807) 2020-06-18 13:38:50 -07:00
Alexander Matyushentsev
6143f6d9be fix: return default scopes if custom scopes are not configured (#3805) 2020-06-18 11:00:44 -07:00
Alexander Matyushentsev
332617099d docs: add 'resource.compareoptions' to sample argocd-cm.yaml (#3803) 2020-06-18 11:00:19 -07:00
David Maciel
04ea9e77f5 Add clarification when working with Github webhook (#3802)
When creating the webhook in Github (enterprise, not sure if it happens in Github.com), The default "Content type" is "application/x-www-form-urlencoded". After some time debugging it I found the library used to handle the hooks (https://github.com/go-playground/webhooks) only supports 'application/json'.

I just noticed that the screenshot has the 'application/json' selected, but since the default is "application/x-www-form-urlencoded" it  can be easily overlooked and create some frustration when the hooks doesn't work as expected. 

Someone else from my team tried to activate the hooks a while ago an assumed they weren't working, and probably this was the reason :S
2020-06-18 08:59:48 -07:00
Thomas Santerre
b37134c3c1 Add PayPay to the list of users (#3797)
https://paypay.ne.jp/
2020-06-18 08:51:21 -07:00
Alexander Matyushentsev
963341727e docs: add 1.5 - 1.6 upgrade instructions (#3790) 2020-06-17 20:28:41 +02:00
Przemek
2e84b643be docs: Add docs how to use ArgoCD with helm plugins (#3766)
docs: Add docs how to use ArgoCD with helm plugins (#3766)
2020-06-17 10:11:54 -07:00
Darshan Chaudhary
cddeabe976 feat: add alias for sync policy automated (#3788)
Signed-off-by: darshanime <deathbullet@gmail.com>
2020-06-17 13:58:21 +02:00
Alexander Matyushentsev
6036ff8afd chore: fix tag matching in trigger-release.sh script (#3785) 2020-06-17 08:59:08 +02:00
Alexander Matyushentsev
a969f5e681 docs: add 1.5.6 ~ 1.6.0 changelog (#3786) 2020-06-17 08:57:56 +02:00
Alexander Matyushentsev
c6d1179307 feat: upgrade redis to 5.0.8-alpine (#3783) 2020-06-16 14:04:06 -07:00
Erik DeLamarter
6d44c4de41 docs: Add documentation for Keycloak SSO integration (#3767)
docs: Add documentation for Keycloak SSO integration (#3767)
2020-06-16 12:35:58 -07:00
Darshan Chaudhary
56b3a89157 fix: use *metav1.Time for deployStartedAt (#3782)
Signed-off-by: darshanime <deathbullet@gmail.com>
2020-06-16 10:10:31 -07:00
wdullaer
f2c7c3f230 feat: Add support for TLS client authentication in the CLI (#3779)
This commit adds support for TLS client authentication in the CLI.
It adds the necessary fields to the config and CLI parameters, modeled
on the existing server-crt functionality.

It also fixes 2 bugs in the grpcproxy:
1. The grpcproxy would ignore the server-crt when making a call to the
upstream server.
2. The grpcproxy would falsely assume that the HTTP status code returned
by the upstream server is always 200. It would then try to parse the
body as if it was a grpc response. At best this led to weird errors
being shown, at worst I have seen it cause the runtime to run out of
memory.
2020-06-16 17:03:03 +02:00
Alexander Matyushentsev
9019ae101e fix: upgrade awscli version (#3774) 2020-06-16 07:12:20 +02:00
Alexander Matyushentsev
7e877b0698 fix: html encode login error/description before rendering it (#3773) 2020-06-15 16:32:56 -07:00
Isaac Gaskin
e54d039998 feat(applications-tiles.tsx): adding helm icon to app tiles (#3765)
* feat(applications-tiles.tsx): adding helm icon to app tiles

conditionally add the helm icon if the application uses a "chart" otherwise default to git
2020-06-15 16:09:14 -07:00
Alexander Matyushentsev
1380af6af5 fix: cluster update method panic (#3772) 2020-06-15 13:51:04 -07:00
Alexander Matyushentsev
1aeba18d81 fix: cluster state cache should be initialized before using (#3752) (#3763) 2020-06-12 15:05:01 -07:00
Alan Tang
a9866a7013 Fix upgrading overview links (#3757) 2020-06-12 10:56:15 -07:00
Björn Häuser
a0b67fb607 Sort URLS (#3746)
If an ingress has several URLS, the list changes on every reload. This
should "guarantee" stable sorting.
2020-06-12 09:56:05 -07:00
whitleykeith
b79db51340 feat: Added healthchecks for more custom resources (#3726) (#3728)
* Adding LexisNexis to USERS.md

* Adding Istio healthcheck

* Adding Jaeger healthcheck

* Adding Kafka healthcheck

* Adding Kiali healthcheck

* Adding Knative healthchecks

* Adding Spark Application healthcheck

* Adding Zookeeper  healthcheck
2020-06-12 09:51:13 -07:00
Daichi Sakaue
9192cd94c9 chore: Update Redis to 5.0.8 (#3734)
Signed-off-by: Daichi Sakaue <daichi-sakaue@cybozu.co.jp>
2020-06-11 14:41:18 -07:00
Alexander Matyushentsev
ef0a63d45d fix: ensure cache settings read/writes are protected by mutex (#3753) 2020-06-11 12:54:10 -07:00
May Zhang
d040d9bf04 feat: Support additional metadata in Application sync operation (#3747)
* feat: Support additional metadata in Application sync operation

* regenerated generated.pb.go
2020-06-10 15:28:07 -07:00
Justin Hutchings
108a580a3f Add CodeQL security scanning (#3743) 2020-06-10 12:27:03 -07:00
Darshan Chaudhary
d63ced413e feat: add time taken to complete deployment (#3715)
* feat: add time taken to complete deployment

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: add test for adding deploy started at time

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: use hourglass for time to deploy

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: add comments to RevisionHistory fields

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-06-10 14:28:40 +02:00
Darshan Chaudhary
e102ec11ac feat: Allow --local with automatic sync for --dry-run (#3675)
* feat: Allow --local with automatic sync for --dry-run

Signed-off-by: darshanime <deathbullet@gmail.com>

* feat: add e2e test for local sync with dry run

Signed-off-by: darshanime <deathbullet@gmail.com>
2020-06-10 14:05:37 +02:00
Alexander Matyushentsev
460f6653dc fix: avoid panic in badge handler (#3741) 2020-06-09 19:01:25 -07:00
Alexander Matyushentsev
e143fb4cb2 fix: SyncOperationResult namespace field should be optional (#3742) 2020-06-09 18:52:56 -07:00
Alexander Matyushentsev
3117a2c3b5 chore: trigger-release should not fail if commentChar not configured (#3740) 2020-06-09 23:59:39 +02:00
May Zhang
10dc082404 fix: Support argocd app diff --local and argocd app sync --local with custom plugins (#3733)
* settingsMgr returns plugins list When login successful or When API server DisableAuth
2020-06-09 14:06:49 -07:00
jannfis
4032e8efd7 fix: Reap orphaned ("zombie") processes in argocd-repo-server pod (#3611) (#3721)
* fix: Reap orphaned ("zombie") processes in argocd-repo-server pod
2020-06-09 13:58:37 -07:00
jannfis
b6e2d5a430 chore: Introduce release automation (#3711)
* chore: Introduce release automation
2020-06-09 12:05:52 -07:00
Alexander Matyushentsev
94e6efc0fc fix: delete api should return 404 error if app does not exist (#3739) 2020-06-09 11:06:34 -07:00
May Zhang
0a815be07a fix: support partial sync with namespace. (#3705)
* support partial sync with namespace.

* corrected test folder name

* Trying to fix lint error

* 1. in test, delete ns after test
2. in test, created new methods for ResourceSyncStatusWithNamespaceIs and ResourceHealthWithNamespaceIs.

* reformat imports

* simplify code

* remove timeout
2020-06-08 15:59:59 -07:00
jannfis
1add08bb20 fix: Fix possible nil pointer deref on resource deduplication (#3725) 2020-06-08 15:35:20 -07:00
Alexander Matyushentsev
d60bb6804c fix: upgrade gitops-engine dependency to v0.1.2 (#3729) 2020-06-08 15:12:35 -07:00
Darshan Chaudhary
86bfb6b380 refactor: change favicon.png on docs to argo-cd logo (#3723)
Signed-off-by: darshanime <deathbullet@gmail.com>
2020-06-08 10:28:39 +02:00
Chris Vest
7ca04b5897 feat: Add Strimzi KafkaConnect CRD custom health checks (#3684)
* Add Strimzi KafkaConnect custom health checks

* Update degraded test case & manifest
2020-06-06 16:44:24 +02:00
Timothy Vandenbrande
9bee00f942 fix: use uid instead of named user in Dockerfile (#3108) 2020-06-06 14:04:19 +02:00
Starslider
11b4614d60 Adding Swisscom to USERS list (#3706) 2020-06-04 12:18:18 -07:00
Alexander Matyushentsev
132e667a7b fix: revert incorrectly update go.mod/go.sum files (#3712) 2020-06-04 12:14:08 -07:00
May Zhang
d60e1b2876 feat: get cluster connection status from cluster synced time (#3604)
feat: get cluster connection status from cluster synced time (#3604)
2020-06-04 11:36:26 -07:00
Anna M. Kosek
60dbf545b6 docs: updated import command in the Disaster Recovery (#3710) 2020-06-04 14:57:44 +02:00
ragarcia26
4bf6e88189 docs: Add EA to USERS.md (#3704)
* docs: Add EA to USERS.md
2020-06-03 21:26:55 -07:00
Eder Nucci
53e5c65e11 Adding Greenpass to USERS list (#3699) 2020-06-03 21:25:53 -07:00
Alexander Matyushentsev
e775b8fce8 chore: run intergation tests in release branches (#3697) 2020-06-02 11:07:06 -07:00
David Maciel
84bece53a3 docs: Use official curl image instead of appropriate/curl (#3695)
The appropriate/curl last update is from two years ago:

```
$ docker run -it --entrypoint /bin/ash appropriate/curl:latest
$ curl --version
curl 7.59.0 (x86_64-alpine-linux-musl) libcurl/7.59.0 LibreSSL/2.6.3 zlib/1.2.11 libssh2/1.8.0
Release-Date: 2018-03-14
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets HTTPS-proxy
```

There is already an official curl image at https://hub.docker.com/r/curlimages/curl (The link to the docker hub can be found in the official curl download page: https://curl.haxx.se/download.html)
$ docker run -it --entrypoint /bin/ash curlimages/curl:latest
$ curl --version
curl 7.70.0-DEV (x86_64-pc-linux-musl) libcurl/7.70.0-DEV OpenSSL/1.1.1d zlib/1.2.11 libssh2/1.9.0 nghttp2/1.40.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM NTLM_WB SSL TLS-SRP UnixSockets
2020-06-02 18:45:15 +02:00
Alexander Matyushentsev
4a6fe4cd31 feat: upgrade kustomize to v3.6.1 version (#3696) 2020-06-02 09:37:10 -07:00
Isaac Gaskin
45cb1d5967 fix: correcting arg positions for Sprintf example message (#3692) 2020-06-02 09:29:36 +02:00
jannfis
415d5e569f chore: Add GH actions status badge to README (#3690) 2020-06-01 21:52:23 +02:00
Alexander Matyushentsev
03a0a192ec refactor: upgrade gitops engine (#3687) 2020-06-01 20:23:07 +02:00
jannfis
a40f3689b3 chore: Add missing asset to Dockerfile (#3678)
* chore: Fix complaints of golang-ci lint v1.26.0

* chore: Fix Dockerfile
2020-05-31 19:28:16 -07:00
jannfis
80515a3b57 chore: Migrate CI toolchain to GitHub actions (#3677)
* chore: Migrate CI to GitHub actions

* Do not install golangci-lint, we use the action

* Integrate codecov.io upload

* Use some better names for analyze job & steps

* go mod tidy

* Update tools

* Disable CircleCI completely

* Satisfy CircleCI with a dummy step until it's disabled
2020-05-31 23:11:28 +02:00
Alin Balutoiu
00f99edf1a feat: Add build support for ARM images (#3554)
Signed-off-by: Alin Balutoiu <alinbalutoiu@gmail.com>
2020-05-31 19:31:29 +02:00
jannfis
bc83719037 chore: Fix complaints of golang-ci lint v1.26.0 (#3673) 2020-05-30 18:54:14 -07:00
Alexander Matyushentsev
2926f2bd60 fix: settings manager should invalidate cache after updating repositories/repository credentials (#3672) 2020-05-30 10:00:11 +02:00
Henno Schooljan
7b2a95e83c fix: Allow unsetting the last remaining values file (#3644) (#3645)
* fix: Allow unsetting the last values file (#3644)

Because the `setHelmOpt()` function does not act on empty inputs, it 
would do nothing when removing the last values file using `argocd app 
unset`.
The parameter overrides are actually being unset correctly, so this has 
been changed to work the same way by manipulating `app.Spec.Source.Helm` 
directly.

This fixes #3644.

* fix: Allow unsetting the last values file, add tests

* Retrigger CI pipeline
2020-05-29 22:27:40 -07:00
AGloberman
d89b7d8a41 fix: Read cert data from kubeconfig during cluster addition and use if present (#3655) (#3667)
* Read cert data from kubeconfig and use if present

* gofmt test updates
2020-05-29 11:33:56 -07:00
Henno Schooljan
36da074344 feat: CLI: Allow setting Helm values literal (#3601) (#3646)
* feat: CLI: Allow setting Helm values literal (#3601)

While you could already set values files using the `--values` flag with external data using the CLI with `argocd app create` and `argocd app set`, this was not yet possible for managing the literal `.spec.source.helm.values` value in an Application without resorting to a complicated `argocd app patch` escaped parameter or by generating the entire application YAML manifest by yourself.

Therefore, this PR adds a `--values-literal-file` flag to the `argocd app create` and `argocd app set` commands, which accepts a local file name or URL to a values file, which will be read and included as a multiline string in the application manifest. This is different from the `--helm-set-file` flag which expects the file in the chart itself.

The `argocd app unset` command is expanded with a `--values-literal` flag, so we can also unset this field again.

I hope I chose nice enough names for the flags, I wanted to make clear it expects a file name, but also distinguish it enough from the existing `--values` flag which actually points to values files.

Because the current `setHelmOpt()` functionality would not work for unsetting things to an empty value and it was difficult to do these changes independently, this PR also contains the fix for issue #3644. A separate PR has still been created for that one because I think it should end up as a separate issue in the release notes.

* feat: CLI: Allow setting Helm values literal, add tests
2020-05-29 09:00:28 -07:00
Hyungrok Kim
2277af2f32 docs: Add PUBG to USERS.md (#3669) 2020-05-29 08:14:32 -07:00
Alexander Matyushentsev
ee64a4d9ca fix: upgrade gitops engine dependency (#3668) 2020-05-28 18:42:01 -07:00
Fred Dubois
d9bae2f83f Add AppDirect to USERS.md (#3666) 2020-05-28 11:43:57 -07:00
Josh Soref
a724574ede chore: Spelling (#3647)
chore: Spelling (#3647)
2020-05-27 10:22:13 -07:00
Buvanesh Kumar
1c5fc0076e Dynamically get the account details from gcloud (#3662) 2020-05-27 10:10:56 -07:00
Alexander Matyushentsev
f826b0e397 chore: fix image dev build command (#3659) 2020-05-27 08:04:09 +02:00
jannfis
196eb16244 chore: Migrate GH image build action to go modules (#3654) 2020-05-26 14:10:39 -07:00
Josh Soref
09f3b45e39 chore: Spelling - md files (#3651)
chore: Spelling - md files (#3651)
2020-05-26 13:58:29 -07:00
jannfis
c914ea0218 chore: Update Dockerfile to reflect switch to go modules (#3652)
* chore: Update Dockerfile to reflect switch to go modules
2020-05-26 12:42:58 -07:00
jannfis
5ad46b025a docs: Adapt contribution guide for Go modules (#3653) 2020-05-26 21:30:40 +02:00
Alexander Matyushentsev
22dcc1e87d fix: prevent possible null pointer dereference error in TestAddHelmRepoInsecureSkipVerify test (#3650) 2020-05-26 10:52:12 -07:00
Alexander Matyushentsev
91d5d7e37b fix: sort output of 'argocd-util resource-overrides action list' command (#3649) 2020-05-26 10:49:28 -07:00
jannfis
23bf07d206 chore: Migrate to Go modules (#3639)
* chore: Migrate to Go modules

* Update CircleCI config

* Fix path

* Attach vendor for test step correctly

* restore_vendor -> attach_vendor

* Update cache path

* Checkout code before attaching vendor

* Move checkout to even earlier in job

* Don't restore cache for e2e step

* .

* Explicitly set GOPATH

* Restore Build cache

* Fix permissions

* Set correct environment for docker env

* Uncache everything

* Fix permissions

* Use workspace for caching Go code

* .

* go mod tidy

* Try to speed up builds

* Make mod target implicit dependencies

* Do not call make mod-download or mod-vendor

* Fix permissions

* Don't have modules dependendencies on test-e2e-local

* Fix confgi

* Bye bye

* Remove test parallelism

* Get max test parallelism back in, but with lower value
2020-05-26 18:15:38 +02:00
Im, Juno
6637ee5c24 fix: oidc should set samesite cookie (#3632)
* fix: oidc should set samesite cookie

* edit: adapt the path value for cookies from root path
2020-05-26 09:13:50 +02:00
jannfis
867282f726 fix: Allow underscores in hostnames in certificate module (#3596) 2020-05-25 21:34:06 +02:00
Phil Gore
8aadc310c9 fix: apply scopes from argocd-rbac-cm to project jwt group searches (#3508)
* merging changes

* apply scopes from argocd-rbac-cm to projects

* fixing server merge conflict

* passing tests
2020-05-25 09:05:56 +02:00
May Zhang
ac097f143c Fixing how to compare two objects. (#3636) 2020-05-22 15:10:25 -07:00
Alexander Matyushentsev
4a12cbb231 fix: fix nil pointer dereference error after cluster deletion (#3634) 2020-05-22 09:35:04 -07:00
Chance Zibolski
40eb8c79ab feat: Upgrade kustomize to 3.5.5 (#3619)
* feat: Upgrade kustomize to 3.5.5
2020-05-20 19:24:25 -07:00
Florian
710d06c800 docs: minor typo fix (#3625)
Just a quick typo fix
2020-05-20 20:46:07 +02:00
Alexander Matyushentsev
2f2f39c8a6 feat: upgrade gitops engine version (#3624) 2020-05-20 11:15:23 -07:00
Andy Feller
7c831ad781 docs: Fix minor typos in code examples (#3622) 2020-05-20 18:37:27 +02:00
Alexander Matyushentsev
51998e0846 feat: argocd-util settings resource-overrides list-actions (#3616) 2020-05-19 14:46:46 -07:00
jannfis
313de86941 fix: Prevent possible nil pointer dereference when getting Helm client (#3613) 2020-05-19 18:40:50 +02:00
dthomson25
0a4ce77bce Add Rollout Restart to Discovery.lua script (#3607)
* Add Rollout Restart to Discovery.lua script

* Fix tests
2020-05-19 08:16:08 -07:00
Shuhei Kitagawa
f95004c428 fix: Allow CLI version command to succeed without server connection (#3049) (#3550) 2020-05-19 14:21:34 +02:00
Drew Boswell
f59391161e docs: Update USERS.md with Swissquote (#3605)
* Update USERS.md

* Update USERS.md
2020-05-19 14:19:38 +02:00
Alexander Matyushentsev
27e95df536 feat: update gitops engine version to get access to sync error (#3609) 2020-05-18 12:26:34 -07:00
May Zhang
ec23d917eb feat: adding failure retry (#3548)
* Initial Try of failure retry

* Get failureRetryCount and failureRetryPeriodSecond from command line args.

* Get failureRetryCount and failureRetryPeriodSecond from command line args.

* Get failureRetryCount and failureRetryPeriodSecond from command line args.

* Get failureRetryCount and failureRetryPeriodSecond from command line args.

* Update logic to find out if we should retry.

* 1. add retry wrapper to only argo client.
2. change to env variables instead of command line arguments.

* keep imports grouped

* resolve merge conflict
2020-05-18 09:51:03 -07:00
Micke Lisinge
991ee9b771 feat: Implement GKE ManagedCertificate CRD health checks (#3600)
* Implement GKE ManagedCertificate CRD health checks

* Retrigger CI pipeline

* Match against FailedNotVisible instead of Failed
2020-05-17 17:23:54 +02:00
Alexander Matyushentsev
c21a6eae7d docs: update 1.5.4 changelog (#3585)
* docs: update 1.5.4 changelog

* Update CHANGELOG.md
2020-05-16 17:26:02 +02:00
jannfis
173a0f011d chore: Fix Docker mounts for good (#3597) 2020-05-15 14:43:12 -07:00
Alexander Matyushentsev
fe8d47e0ea feat: move engine code to argoproj/gitops-engine repo (#3599) 2020-05-15 14:39:29 -07:00
Alexander Matyushentsev
192ee93fc4 feat: Gitops engine (#3066)
* Move utils packages that are required for gitops engine under engine/pkg/utils package.
Following changes were implemented:
* util/health package is split into two parts: resource health assessement & resource health assessement and moved into engine/pkg/utils
* utils packages moved: Closer and Close method of util package moved into engine/pkg/utils/io package
* packages diff, errors, exec, json, kube and tracing moved into engine/pkg/utils

* Move single cluster caching into engine/kube/cache package

* move sync functionality to engine/kube/sync package

* remove dependency on metrics package from engine/pkg/utils/kube/cache

* move annotation label definitions into engine/pkg/utils/kube/sync

* make sure engine/pkg has no dependencies on other argo-cd packages

* allow importing engine as a go module

* implement a high-level interface that might be consumed by flux

* fix deadlock caused by cluster cache event handler

* ClusterCache should return error if requested group kind not found

* remove obsolete tests

* apply reviewer notes
2020-05-15 10:01:18 -07:00
Jai Govindani
490d4004b1 docs: typo/punctuation in tracking_strategies.md (#3449)
* Fix typo/punctuation

* Add Honestbank to USERS.md

* fix: typo in image caption

Signed-off-by: Jai Govindani <jai@honestbank.com>
2020-05-15 18:25:23 +02:00
Shuhei Kitagawa
c2ff86e8b2 chore: Change cli log to logrus (#3566) 2020-05-15 17:49:35 +02:00
chroju
a32f70f207 Fix small typo in user management docs (#3438) 2020-05-14 07:42:08 -07:00
jannfis
02b3c61fd9 feat: Introduce diff normalizer knobs and allow for ignoring aggregated cluster roles (#2382) (#3076)
* Add the ability to ignore rules added by aggregated cluster roles
2020-05-13 13:34:43 -07:00
Riccardo M. Cefala
f822d098c3 Add External Secrets Operator to secret management list (#3579) 2020-05-13 11:36:12 -07:00
Alexander Matyushentsev
dc5ac89f36 docs: add more details about redis issue during 1.4 -> 1.5 upgrade (#3584) 2020-05-13 11:08:13 -07:00
Christine Banek
046406e7d3 fix: Fix login with port forwarding (#3574)
The argocd command line supports using the --port-forward options
to allow you to connect to an argocd without an ingress rule.  This
is especially useful for command line automation of new environments.

But login doesn't respect port-forward - making it impossible to login
to argocd to be able to later create apps.  App creation works fine
with port-forwarding after being able to login.
2020-05-13 10:28:42 -07:00
Alexander Matyushentsev
4f49168c1a fix: use 'git show-ref' to both retrieve and store generated manifests (#3578)
* fix: use 'git show-ref' to both retrieve and store generated manifests

* print warning message when an incorrect repo tag is detected
2020-05-13 10:19:59 -07:00
Simon Rüegg
22bb1dd40f feat: Implement Crossplane CRD health checks (#3581)
* Implement Crossplane CRD health checks

A health check for the ClusterStackInstall CRD to help Argo CD to wait
for a successful install.

Signed-off-by: Simon Rüegg <simon@rueggs.ch>

* Add VSHN to USERS.md

Signed-off-by: Simon Rüegg <simon@rueggs.ch>
2020-05-13 09:45:27 -07:00
Alexander Matyushentsev
cd1de6e680 fix: redis request failed with nil error should not be counted as failed (#3576) 2020-05-12 18:02:22 -07:00
Alexander Matyushentsev
24fa758444 fix: enable redis retries; add redis request duration metric (#3575) 2020-05-12 14:39:18 -07:00
jannfis
9208176e86 feat: Allow selecting TLS ciphers on server (#3524) 2020-05-12 12:32:06 -07:00
rachelwang20
66e1fb78f7 feat: Adding deploy time and duration label (#3563)
* Adding deploy time and duration label

* Update application-deployment-history.tsx

* Adding deploy time and duration label

* Formatting
2020-05-11 13:24:29 -07:00
May Zhang
e42102a67e fix: when --rootpath is on, 404 is returned when URL contains encoded URI (#3564)
* Fix when --rootpath is on, 404 is returned when URL contains encoded URI

* Update doc

* Update doc
2020-05-11 08:39:27 -07:00
dthomson25
887adffcc8 Add Rollout restart action (#3557) 2020-05-08 14:08:34 -07:00
Shuwei Hao
c66919f9ff support delete cluster from UI (#3555)
Signed-off-by: haoshuwei <haoshuwei24@gmail.com>
2020-05-08 09:22:11 -07:00
jqlu
301d18820a feat: add button loading status for time-consuming operations (#3559) 2020-05-08 00:21:20 -07:00
jannfis
d2d37583af docs: Add note about required ConfigMap annotation to docs (#3540)
* Add note about required ConfigMap annotation to docs

* More clarifications
2020-05-07 22:41:21 -07:00
iamsudip
e0e995a944 Add moengage to users list (#3542) 2020-05-07 22:40:36 -07:00
jannfis
1f87950d48 Update security docs to reflect recent changes (#3558) 2020-05-07 22:31:15 -07:00
Shuhei Kitagawa
9a17103830 feat: Add --logformat switch to API server, repository server and controller (#3408) 2020-05-05 14:03:48 +02:00
Shuhei Kitagawa
fd49a4e74f doc: Fix Contribution Guide link in running-locally.md (#3545) 2020-05-05 12:32:47 +02:00
May Zhang
e78f61ea37 Fix version (#3544) 2020-05-04 14:48:16 -07:00
SB
e5d4673eac feat: Add a Get Repo command to see if Argo CD has a repo (#3523)
* fix: Updating to jsonnet v1.15.0 fix issue #3277

* feat: Changes from codegen, adding a repository gt service

* feat: Adding a get repository command

* Retrigger CI pipeline

* refactor: delete deprecated option on Get
refactor printing getcommand result
Getrepository() dependent on rbac enforcement

* fix: setting Get repo command to get
2020-05-04 09:20:48 +02:00
jannfis
3df4850418 fix: Disable keep-alive for HTTPS connection to Git (#3531) 2020-05-01 10:56:25 -07:00
Chris Pappas
1b0421c3aa docs: Adding OneLogin integration docs (#3529) 2020-04-30 21:05:03 -07:00
Alexander Matyushentsev
20d56730ff Revert "fix: Text overflow when the application status panel item was too big (#3460)" (#3530)
This reverts commit ffc99354d2.
2020-04-30 17:47:03 -07:00
Martin Jaime
ffc99354d2 fix: Text overflow when the application status panel item was too big (#3460) 2020-04-30 14:23:12 -07:00
Alexander Matyushentsev
e845478a96 docs: v1.5.3 changelog (#3526)
* docs: v1.5.3 changelog

* address reviewer notes
2020-04-30 13:17:44 -07:00
Alexander Matyushentsev
28dd7167d0 docs: describe upgrading process and version breaking changes (#3512)
* docs: describe upgrading process and version breaking changes

* add upgrading instructions link to overview doc
2020-04-30 12:28:39 -07:00
May Zhang
faee66888e docs: update document for --rootpath support for argoCD server and UI (#3525)
* Update document for rootpath support
2020-04-30 12:01:54 -07:00
Moses Bett
fc753ac489 added MTN Group as a user of ArgoCD (#3497) 2020-04-30 11:19:46 -07:00
jqlu
88a76022c1 fix: remove extra backtick(`) in JSX (#3518) 2020-04-30 09:42:04 -07:00
Alexander Matyushentsev
31df9d11a9 feat: upgrade helm 3 to v3.2.0; user --insecure-verify-flag (#3514) 2020-04-29 21:04:25 -07:00
May Zhang
7ed6c18762 fix: to support --rootpath (#3503)
* added path to cookie

* additional changes to support rootpath:
1. when using https, redirect to the right URL.
2. when rootpath is set, handle healthz, swagger, etc.

* additional changes to support rootpath:
1. when using https, redirect to the right URL.
2. when rootpath is set, handle healthz only.

* additional changes to support rootpath:
1. when using https, redirect to the right URL.
2. when rootpath is set, handle healthz only.

* Fixed for swagger-ui with rootpath

* Fixed for swagger test

* Fixed for redirect path

* Fixed for redirect path
2020-04-29 14:40:03 -07:00
Alexander Matyushentsev
81d5b13083 fix: api incorrectly verifies if auto-sync is enabled and reject sync local request (#3506) 2020-04-29 00:09:27 -07:00
Alexander Matyushentsev
02624bf3a6 fix: redis timeout should be more than client timeout (#3505) 2020-04-29 08:49:10 +02:00
Alexander Matyushentsev
842a3d12f6 feat: add redis metrics to application controller and api server (#3500)
* add redis metrics to application controller and api server

* fix failed test
2020-04-28 12:52:03 -07:00
May Zhang
14f1725f53 added path to cookie (#3501) 2020-04-28 10:26:47 -07:00
Alexander Matyushentsev
9b142c799a fix: 'argocd sync' does not take into account IgnoreExtraneous annotation (#3486) 2020-04-28 08:49:07 -07:00
May Zhang
d77072b534 fix: Set root path (#3475)
* Set root path

* updated http mux if --rootpath is set during server startup.
updated baseHRef if --rootpath is set.
added --grpc-web-root-path for CLI.

* added rootpath as part of config context name

* clean up not used variables.
2020-04-27 08:35:58 -07:00
Alexander Matyushentsev
8a77075cff fix: CLI renders flipped diff results (#3480) 2020-04-24 10:18:15 -07:00
Alexander Matyushentsev
f5b600d4af feat: limit the maximum number of concurrent login attempts (#3467)
* feat: limit the maximum number of concurrent login attempts

* unit test rate limiter

* address reviewer questions
2020-04-23 12:33:17 -07:00
Alexander Matyushentsev
4ae70139d9 feat: upgrade kustomize version to 3.5.4 (#3472) 2020-04-23 10:29:15 -07:00
rumstead
7660e40fdc Update README.md (#3470)
Fix spelling/spacing
2020-04-23 07:49:01 -07:00
Alexander Matyushentsev
310b40aa20 feat: downgrade dex to 2.22.0 and revert bug workaround (#3468) 2020-04-22 17:34:58 -07:00
Alexander Matyushentsev
0b0c72a80b docs: update incorrect sync options example (#3457) 2020-04-22 09:41:57 +02:00
Alexander Matyushentsev
14188656c8 fix: GetApplicationSyncWindows API should not validate project permissions (#3456) 2020-04-21 11:26:17 -07:00
jannfis
76bacfdea4 fix: Add initial implementation for rate limiting failed logins (#3404)
* fix: Add initial implementation  for rate limiting failed logins

* Trigger test build

* Remove deprecated code and fix new project tests

* move cache related code from sessionmanager to cache access wrapper

* avoid using sleep in sessionmanager tests

* mention SECONDS in session manager environment variables to make it easier to understand meaning of each variable

* Login button should be disabled while user is waiting for login result

* prevent timing-based user enumeration attack

* reject too many failed attempts; always compute hash and introduce random delay

* remove unused constants

* fix linter errors

Co-authored-by: Alexander Matyushentsev <amatyushentsev@gmail.com>
2020-04-21 11:10:25 -07:00
Alexander Matyushentsev
ee44e489b5 fix: javascript error on accounts list page (#3453) 2020-04-21 10:08:36 -07:00
Alexander Matyushentsev
89774fef17 fix: argocd-util kubeconfig should use RawRestConfig to export config (#3447)
* fix: argocd-util kubeconfig should use RawRestConfig to export config

* document 'argocd-util kubeconfig' command
2020-04-21 13:45:20 +02:00
Alexander Matyushentsev
acc2369dc7 feat: upgrade dex to v2.23.0 (#3448)
* feat: upgrade dex to v2.23.0

* workaround for https://github.com/dexidp/dex/issues/1695
2020-04-20 22:22:19 -07:00
Alexander Matyushentsev
9de06e35eb Clean docker images before building Argo CD image to avoid no disk space left failure (#3446) 2020-04-20 15:57:36 -07:00
jannfis
4575adca86 chore: Disable lint in CI due to OOM fails (#3444) 2020-04-20 23:01:05 +02:00
jannfis
ca42a375c2 Revert "feat: metrics, argocd_app_info adding syncpolicy info, argocd_cluster_info adding clustername (#3411)" (#3443)
This reverts commit 0214eb8d92.
2020-04-20 08:55:38 -07:00
wecger
0214eb8d92 feat: metrics, argocd_app_info adding syncpolicy info, argocd_cluster_info adding clustername (#3411)
* extending metrics with syncpolicies and clustername

* extending metrics with syncpolicies and clustername: fixing tests

* extending metrics with syncpolicies and clustername: fixing order in labels

* extending metrics with syncpolicies and clustername: fixing lint issues
2020-04-20 11:32:20 +02:00
Alexander Matyushentsev
949518e680 fix: sort imports in knowntypes_normalizer.go (#3440)
* fix: sort imports in knowntypes_normalizer.go

* drafT
2020-04-19 09:05:26 +02:00
Ed Lee
81e4bb1fef Update OWNERS (#3439) 2020-04-18 19:54:44 -07:00
Alexander Matyushentsev
35b40cdb22 fix: support both <group>/<kind> as well as <kind> as a resource override key (#3433) 2020-04-17 09:23:19 -07:00
Alexander Matyushentsev
fa47fe00a2 fix: Grafana dashboard should dynamically load list of clusters (#3435) 2020-04-17 00:13:34 -07:00
Alexander Matyushentsev
743371ed4f fix: use $datasource variable as a source for all dashboard panels (#3434) 2020-04-16 18:13:52 -07:00
jannfis
75d9f23adb chore: Migrate golangci-lint into CircleCI tests (#3427) 2020-04-16 08:55:13 -07:00
SB
e05ebc4990 fix: Updating to jsonnet v1.15.0 fix issue #3277 (#3431) 2020-04-16 08:44:51 -07:00
May Zhang
6ffd34dcf9 fix for helm repo add with flag --insecure-skip-server-verification (#3420) 2020-04-15 16:56:27 -07:00
Alexander Matyushentsev
16c6eaf9ae feat: support user specified account token ids (#3425) 2020-04-15 15:19:25 -07:00
Alexander Matyushentsev
e67a55463f fix: update min CLI version to 1.4.0 (#3413) 2020-04-15 14:17:24 -07:00
jannfis
476cb655b7 fix: Make CLI downwards compatible using old repository API (#3418) 2020-04-15 23:05:17 +02:00
jannfis
6c1ccf4d60 docs: Update documentation for CVE-2020-5260 (#3421) 2020-04-15 12:16:29 -07:00
Alexander Matyushentsev
05f5a79923 feat: support separate Kustomize version per application (#3414) 2020-04-15 12:04:31 -07:00
May Zhang
3dbc330cf0 fix: app diff --local support for helm repo. #3151 (#3407)
* Fixing argocd app diff when using helm repo

* adding test code

* get rid of optional parameter

* get rid of optional parameter

* Added test case

* Fix failed tests
2020-04-14 08:13:38 -07:00
jannfis
8ad928330f chore: Fix a bunch of lint issues (#3412)
* chore: Fix linter complaints
2020-04-14 08:01:43 -07:00
Bruno Clermont
355e77e56f feat: add support for dex prometheus metrics (#3249) 2020-04-14 07:53:59 -07:00
Alexander Matyushentsev
376d79a454 feat: add settings troubleshooting commands to the 'argocd-util' binary (#3398)
* feat: add settings troubleshooting commands to the 'argocd-util' binary
2020-04-14 07:51:16 -07:00
peteski
b74a9461ed docs: Updated best practices to remove typos. (#3410)
Fixed typos in best practices section for immutability.
2020-04-14 12:26:09 +02:00
rachelwang20
b4236e1dc7 feat: Let user to define meaningful unique JWT token name (#3388)
* feat: Let user to define meaningful unique JWT token name

* Update sessionmanager.go

* Update server_test.go

* Update sessionmanager_test.go

* Adding get JWTToken by id if not then by issued time

* Adding relate tests

* Adding relate tests

* Retrigger the build

* feat: Let user to define meaningful unique JWT token name

* Update sessionmanager.go

* Update server_test.go

* Update sessionmanager_test.go

* Adding get JWTToken by id if not then by issued time

* Adding relate tests

* Retrigger the build

* feat: Let user to define meaningful unique JWT token name

* Adding get JWTToken by id if not then by issued time

* Adding relate tests

* Adding UI change

* add yarn lint
2020-04-13 14:13:05 -07:00
jannfis
6ecc25edbd docs: Beautify & update security considerations doc (#3400) 2020-04-13 21:51:40 +02:00
jannfis
56ca1fb4ea chore: Fix some Sonarcloud related quirks (#3399)
* chore: Fix some Sonarcloud related quirks
2020-04-13 11:45:54 -07:00
jannfis
3629346085 chore: Workaround for CircleCI bug (#3397)
* chore: workaround circleci bug

* Oops
2020-04-10 15:47:49 -07:00
jannfis
092072a281 chore: Add sonarqube configuration for CI (#3392) 2020-04-10 22:18:31 +02:00
Alexey Osheychik
e1142f9759 docs: Fix azure AD integration doc (#3396)
* docs: Add permissions configuration process for Azure to docs

* docs: Update configuration for Azure SSO integration
2020-04-10 13:03:11 +02:00
jannfis
fbd3fe69ff docs: Add bug triage process proposal to docs (#3394) 2020-04-09 11:35:37 -07:00
ramz
f05f84979c Fix for #3286 updated with the expected display message. (#3385) 2020-04-09 11:21:38 -07:00
Devan Goodwin
3d6ff9e903 Add a fake owner reference for ClusterServiceVersion. (#3390)
For anyone installing an Operator Lifecycle Manager operator, the ArgoCD
UI would show your OperatorGroup and Subscription, but would not detect
the resulting ClusterServiceVersion, and subsequent pods etc, limiting
the value of the UI in viewing overall status of your operator.

The CSV should not technically have an owner reference, so we add a fake
one in similar fashion to the pre-existing code above for endpoints. The
CSV then is linked to it's OperatorGroup via the olm.operatorGroup
annotation. The CSV has no link to it's Subscription or InstallPlan that
I can see. Adding an annotation to this might be something we could
pursue with OLM folks.
2020-04-09 11:20:37 -07:00
Alexander Matyushentsev
4c812576c1 chore: minor dev tools fixing for mac (#3330) 2020-04-09 15:01:45 +02:00
jannfis
6753fc9743 Add Dex and missing url field to FAQ (#3380) 2020-04-08 13:23:23 -07:00
Andreas Kappler
8d082cc46e feat: Introduce sync-option SkipDryRunOnMissingResource=true (#2873) (#3247)
* feat: Introduce sync-option SkipDryRunOnMissingResource=true
2020-04-08 10:53:18 -07:00
Denis Jajčević
f586385c8b docs: Fix diffing_known_types.txt link (#3381)
Update documentation to have valid link to `diffing_known_types.txt`.
2020-04-08 19:03:07 +02:00
jannfis
466c73fa3b chore: Code coverage offensive 05: util/clusterauth (#3371)
* Add first batch of clusterauth tests

* More tests
2020-04-07 12:39:24 +02:00
May Zhang
9e6c78d55c Fix for jsonnet when it is localed in nested subdirectory and uses import (#3372) 2020-04-06 15:20:07 -07:00
jannfis
c6af4cca10 docs: Clarify RBAC requirement for local users (#3361)
* Clarify RBAC requirement for local users

* Update docs/operator-manual/user-management/index.md

Co-Authored-By: Alexander Matyushentsev <AMatyushentsev@gmail.com>

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-04-06 21:41:10 +02:00
Alexander Matyushentsev
5448466ddc feat: support normalizing CRD fields that use known built-in K8S types (#3357)
* feat: support normalizing CRD fields that use known built-in K8S types

* apply reviewers notes

* fix codegen
2020-04-06 21:13:50 +02:00
yutachaos
0eec2fee71 fix: Update 4.5.3 redis-ha helm manifest (#3370)
Signed-off-by: yutachaos <18604471+yutachaos@users.noreply.github.com>
2020-04-06 12:02:40 -07:00
Alexander Matyushentsev
e5452ff70e fix: return 401 error code if username does not exist (#3369) 2020-04-06 11:15:15 +02:00
jannfis
9fdd782854 fix: Do not panic while running hooks with short revision (#3368) 2020-04-05 23:54:09 -07:00
jannfis
053ae28ed5 Add note about .git suffixes for GitLab repository URLs (#3363) 2020-04-05 21:09:54 -07:00
jannfis
6eb4f41343 chore: Keep autogenerated message in upstream.yaml for HA manifests (#3367)
* fix: Keep autogenerated message in upstream.yaml
2020-04-05 21:08:59 -07:00
Alexander Matyushentsev
d9072d8200 docs: mention issue #3358 in 1.5 changelog (#3359) 2020-04-04 08:43:38 +02:00
Alexander Matyushentsev
238abbf771 docs: document built-in user limitations and workaround (#3341)
* document security limitations

* minor issue description revisions + formatting

* Update security.md

* move CVEs description into separate document

Co-authored-by: Matt Hamilton <matt@soluble.ai>
Co-authored-by: Ed Lee <edlee2121@users.noreply.github.com>
2020-04-04 08:43:21 +02:00
jannfis
aa4fb9ab4a fix: Increase HAProxy check interval to prevent intermittent failures (#3356)
* Increase HAProxy check interval to prevent intermittent failures/state flapping

* Restore original namespace
2020-04-03 17:10:37 -07:00
May Zhang
55bc144410 fix: Helm v3 CRD are not deployed (#3345)
* Fixing could not find plugin issue when app sync and app diff

* Fixing codegen error

* Revert "Fixing codegen error"

This reverts commit b2dcfb81

* Fixing codegen error

* If user is logged in, settings API would return ConfigManagementPlugins

* For helm3, add flag --include-crds when calling helm template to support helm3 crd

* Fixing typo.

* Added further assertion of ResourceSyncStatusIs for CRD resources.
2020-04-03 13:41:17 -07:00
jannfis
c428e091ab chore: Fix flaky test TestWatchCacheUpdated (#3350) 2020-04-03 18:26:37 +02:00
Sara Jarjoura
c13bf422f8 docs: Added detail on how to use the caData field with Okta SAML (#3351) 2020-04-03 16:49:11 +02:00
jannfis
b4bbe60b8c chore: Code coverage offensive 02: util/argo (#3329) 2020-04-03 09:53:47 +02:00
jannfis
4fdf573fd1 chore: More tests (#3340) 2020-04-02 23:38:23 +02:00
rachelwang20
d326daef62 Rebase (#3333) 2020-04-02 11:08:24 -07:00
May Zhang
98337065ae fix: Fixing could not find plugin issue when app sync and app diff (#3326)
* Fixing could not find plugin issue when app sync and app diff

* Fixing codegen error

* Revert "Fixing codegen error"

This reverts commit b2dcfb81

* Fixing codegen error

* If user is logged in, settings API would return ConfigManagementPlugins
2020-04-02 09:50:42 -07:00
jannfis
1b1df76ef2 chore: Code coverage offensive 03: util/cache (#3335)
* Add dependency for miniredis, used for unit testing Redis cache

* Add more tests
2020-04-02 09:16:42 -07:00
Yurii Komar
7f40739b97 Changed GRPC Message Size for apiclient (#3337) 2020-04-02 09:14:02 -07:00
dthomson25
9db879f68f Add V0.8 changes to Rollouts healthcheck (#3331) 2020-04-02 09:00:30 -07:00
Alexander Matyushentsev
e4235dabb8 docs: improved Grafana dashboard (#3327) 2020-04-01 11:58:43 -07:00
May Zhang
ff07b112b1 fix: update documentation for adding environment variable KUBE_VERSION and KUBE_API_VERSION (#3323)
* ArgoCD plugin: add environment variable KUBEVERSION and KUBE_API_VERSIONS.

* Added test verification of KUBE_API_VERSION

* Using assert.EqualValues for assertion.

* update build-environment.md to add KUBE_VERSION and KUBE_API_VERSIONS
2020-03-31 20:21:39 -07:00
Alexander Matyushentsev
53e618a4c0 docs: mention metrics changes and add legacy grafana dashboard (#3324) 2020-03-31 17:54:57 -07:00
Alexander Matyushentsev
eae0527839 fix: argocd fails to connect clusters with IAM authentication configuration (#3325) 2020-03-31 17:44:00 -07:00
jannfis
2d79dbb0bb chore: Update argocd-test-tools to Go v1.14.1 (#3306)
* Update test-tools-image to v0.2.0 and optimize layers in Dockerfile

* Also adapt CirclCI config for new image

* Retrigger CI on possible flaky test
2020-03-31 19:33:59 +02:00
Dai Kurosawa
a501cdbb56 chore: Upgrade golang version from v1.14.0 to v1.14.1 (#3304)
* Upgrade golang version from v1.14.0 to v1.14.1

* use argocd-test-tools version v0.2.0
2020-03-31 19:13:51 +02:00
May Zhang
d2c1821148 feat: ArgoCD plugin: add environment variable KUBEVERSION and KUBE_API_VERS… (#3318)
* ArgoCD plugin: add environment variable KUBEVERSION and KUBE_API_VERSIONS.

* Added test verification of KUBE_API_VERSION

* Using assert.EqualValues for assertion.
2020-03-31 09:13:15 -07:00
rachelwang20
00d44910b8 feat: Whitelisted namespace in UI (#3314)
* Including namespace whiteliste resources support

* regenerate CRD definition and related go code

* Redo make codegen

* revert pkg/apiclient/repository/repository.pb.go

* Whitelisted namespace in UI

* Reflect the whitelist description

* Break one long line to two lines

* Break lines

* Adding line break

* Formatting

Co-authored-by: Alexander Matyushentsev <amatyushentsev@gmail.com>
2020-03-30 16:13:40 -07:00
Alexander Matyushentsev
7ae204d426 fix: avoid nil pointer dereference in badge handler (#3316) 2020-03-30 14:27:43 -07:00
Alexander Matyushentsev
6411958be5 fix: pass APIVersions value to manifest generation request during app validation and during app manifests loading (#3312)
* fix: pass APIVersions value to manifest generation request during app validation and during app manifests loading
2020-03-30 13:36:46 -07:00
jannfis
a7f6866344 Add UI lint instructions and accompanying targets to Makefile (#3315) 2020-03-30 22:21:27 +02:00
Shuwei Hao
c71bfc62ba fix: update help info about argcd account can-i (#3310)
Signed-off-by: Shuwei Hao <haoshuwei24@gmail.com>
2020-03-30 11:49:03 +02:00
jannfis
c4d6fde1c4 chore: Code coverage offensive #1: util/dex (#3305)
* Fix possible panic when generating Dex config from malformed YAML

* Add first batch of tests for util/dex

* More tests

* More tests

* More tests

* Use constants
2020-03-29 14:02:04 -07:00
jannfis
306a84193a Fix possible panic when generating Dex config from malformed YAML (#3303) 2020-03-29 11:42:17 +02:00
jannfis
b02f7f14a7 chore: Run "dep check" in CircleCI pipeline to detect for changes in Gopkg.lock (#3301)
* Run "dep check" in CircleCI pipeline to detect for changes in Gopkg.lock

* Run dep check after restoring vendor cache

* Use -skip-vendor on dep check
2020-03-29 11:10:02 +02:00
Alexander Matyushentsev
ac8ac14545 fix: SSO user unable to change local account password (#3297) (#3298)
* fix: SSO user unable to change local account password (#3297)

* apply code review notes
2020-03-29 10:35:25 +02:00
Alexander Matyushentsev
cdb8758b34 fix: use pagination while loading initial cluster state to avoid memory spikes (#3299) 2020-03-27 22:31:36 -07:00
Alexander Matyushentsev
521f87fe5f fix: convert 'namesuffix', 'nameprefix' string flags to boolean flags in 'argocd app unset' (#3300) 2020-03-27 20:26:22 -07:00
jannfis
27141ff083 chore: Containerize complete build & test toolchain (#3245)
chore: Containerize complete build & test toolchain
2020-03-27 11:36:20 -07:00
Alexander Matyushentsev
7599516f68 fix: fix Cannot read property 'length' of undefined error (#3296) 2020-03-27 10:48:49 +01:00
rachelwang20
e3a18b9cd7 feat: Including namespace whiteliste resources support (#3292)
feat: Including namespace whiteliste resources support (#3292)
2020-03-26 16:13:31 -07:00
May Zhang
eef35a32ab feat: Argocd App Unset Kustomize Override (#3289)
feat: Argocd App Unset Kustomize Override (#3289)
2020-03-26 15:35:55 -07:00
jannfis
e26dace64d Fix unparam errors from linter (#3283) 2020-03-26 09:31:22 -07:00
Adriaan Knapen
1520346369 docs: document Traefik 2 ingress requires disabling TLS (#3284) 2020-03-26 09:30:35 -07:00
Therianthropie
702d4358d1 Add Healy to USERS.md (#3250)
Moved Healy entry to the right position
2020-03-26 09:03:30 -07:00
Alexander Matyushentsev
0162971ea0 fix: implement workaround for helm/helm#6870 bug (#3290)
* fix: implement workaround for  helm/helm#6870 bug

* Update app_management_test.go
2020-03-25 21:07:02 -07:00
Alexander Matyushentsev
7fd7999e49 fix: increase max connections count to support clusters with very large number of CRDs (#3278) 2020-03-25 01:02:33 -07:00
Alexander Matyushentsev
03f773d0ff docs: add slack link to issue template (#3273) 2020-03-24 09:08:35 +01:00
Alexander Matyushentsev
c4bc740fb7 docs: fix resource hooks docs layout (#3266) (#3272) 2020-03-24 08:55:14 +01:00
Jesse Suen
5934bc4699 improvement: remove app name and project labels from reconcliation histogram to reduce cardinality (#3271) 2020-03-23 16:07:37 -07:00
Josef Meier
3f0d26ec17 Refine docs: How to explicitly select a tool (#3261)
Its easy to misconfigure the Application if you use the Application creation wizard, because the default is 'Directory'. If you choose that, your kustomize repo won't work.
2020-03-23 09:54:09 -07:00
Alexander Matyushentsev
7665e58613 chore: update example dashboard to use updated metrics (#3264) 2020-03-23 09:53:04 -07:00
Alexander Matyushentsev
ab80a8126b fix: prevent syncing the same cluster cache multiple times due to race condition (#3256) 2020-03-19 12:44:23 -07:00
Jesse Suen
6905196665 feat: rework prometheus metrics to support richer dashboards (#3254)
* the argocd_app_sync_status and argocd_app_health_status are deprecated in place of additional labels to argocd_app_info
* argocd_app_created_time is deprecated
* deprecated labels can be re-enabled using ARGOCD_LEGACY_CONTROLLER_METRICS
* operation label was added to argocd_app_info to support a guauge of in-progress operations.
* dest_server label was added to k8s related counters to support filtering by cluster
2020-03-18 19:59:51 -07:00
Alexander Matyushentsev
4e283c14fb fix: upgrade argoproj/pkg version (#3255) 2020-03-18 18:22:40 -07:00
Alexander Matyushentsev
1b5925a494 fix: stop trigging auto-syncing if app only need to prune resources and automated prune is disabled (#3253) 2020-03-18 14:19:54 -07:00
Alexander Matyushentsev
d500b27f1d feat: store the name operation initator in the app CRD (#3252) 2020-03-18 13:32:39 -07:00
Alexander Matyushentsev
868b4c4c7c fix: UI crashes when trying to enable auto-sync (#3251) 2020-03-18 11:37:32 -07:00
Jesse Suen
4bbce1cb22 perf: reduce unnecessary K8s calls for CRDs during reconciliation (#3246)
* reduce K8s calls for CRDs during reconciliation
* additional metric labels to k8s API requests (server, verb, kind, namespace)
2020-03-18 03:28:31 -07:00
Bruno Clermont
127f50d697 fix: really skip app requeing for some types of resources (#3225)
* Really skip app requeing

* Add new user
2020-03-17 23:03:01 -07:00
Alexander Matyushentsev
e51aab8d1f fix: applications.List API should sort apps by name (#3248) 2020-03-17 17:10:54 -07:00
Miles Armstrong
85a746f861 feat: Add revision to status badge (#2445) (#3128)
* Refactor SVG and colour assignment

* Add option to include revision (short SHA) in the badge

* Remove unnecessary conversion
2020-03-17 15:44:40 -07:00
Alexander Matyushentsev
3c2be61827 feat: implement Service Account / Local Users (#3215)
* feat: implement Service Account / Local Users

* add local users documentation

* implement accounts management UI

* address code review notes
2020-03-17 15:31:37 -07:00
Alexander Matyushentsev
42d572306d feat: use --api-versions during helm chart rendering (#3243) 2020-03-17 14:20:36 -07:00
Alexander Matyushentsev
b3f8e7a02c docs: add v1.5 change log (#3244) 2020-03-17 11:50:00 -07:00
Jesse Suen
476b09cbbf feat: improve api-server and controller performance (#3222)
* group read comparison settings during app reconciliation
* Reduce lock contention in clusterInfo::ensureSynced(). Add getRepoObj stats
* Remove additional source of lock contention
* Exclude the coordination.k8s.io/Lease resource

Co-authored-by: Alexander Matyushentsev <amatyushentsev@gmail.com>
2020-03-16 11:51:59 -07:00
Conlan Cesar
487d6647d5 Add missing parentheses to Webhook docs (#3239) 2020-03-16 09:44:15 -07:00
jannfis
0378819c54 Test for nil to prevent nil pointer dereference (#3237) 2020-03-16 09:43:44 -07:00
jannfis
bbb925cb63 Update testify to v1.5.1 (#3209) 2020-03-13 19:33:22 -07:00
Alexander Matyushentsev
9d1a378ce8 fix: fix broken URL regex expression (#3236) 2020-03-13 14:35:08 -07:00
Alexander Matyushentsev
e2358cabc9 refactor: use http forwarders from argoproj/pkg repository (#3235) 2020-03-13 11:50:19 -07:00
Alexander Matyushentsev
5cd12a3943 fix: 'requires pruning' is not rendered on app details page for resources that should be pruned (#3234) 2020-03-13 11:36:08 -07:00
Alexander Matyushentsev
ebb06b8c89 fix: app reconciliation fails with panic: index out of (#3233) 2020-03-13 10:52:24 -07:00
Alexander Matyushentsev
d5d01eca3e fix: upgrade argoproj/pkg version to fix leaked sensitive information in logs (#3230) 2020-03-12 13:19:14 -07:00
bergur88
e13bb79578 add docs on mapping different scopes for microsoft (#3224) 2020-03-11 09:06:04 -07:00
khhirani
a8b6282b15 improvement: Surface failure reasons for Rollouts/AnalysisRuns (#3219)
* Modify AnalysisRun error messages. Return hard-coded value if AnalysisRun status doesn't contain message

* Create tests
2020-03-10 16:18:51 -07:00
Saradhi Sreegiriraju
fc00d73cf5 docs: Create USERS.md (#3206)
* Create USERS.md

Create a new USERS file to keep track of who is using Argo CD to minimize scrolling on README.

* Update README.md

Removed `Who users Argo CD` section from README. Users are now tracked in USERS file.

* Update README.md

* Update README.md

* Update USERS.md

* Update pull_request_template.md
2020-03-10 09:01:35 +01:00
CBytelabs
303d46e67c docs: Fixed documentation fault in user-guide/projects/ (#3207)
* Update projects.md

~ Fixed adding policy with wildcard in documentation

* Update projects.md

~ acutally fixed the command completly
2020-03-09 20:20:57 +01:00
Matthias Bertschy
a00798bc5e fix: set MaxCallSendMsgSize to MaxGRPCMessageSize for the GRPC caller (#3189) 2020-03-07 19:30:44 -08:00
Abdullah Alqarni
1c4a15129b feat(ui): add docs to sync policy options present in create application panel (Close #3098) (#3203)
* feat(ui): document sealHeal & pruneResources options in create-application panel

* fix(ui): re-order import statements in application-create-panel.tsx

* docs: correct a typo in user guide auto_sync.md

* docs: document Automatic Self-Healing in user guide auto_sync.md

* docs: add v1.4.3 changelog

* fix: capitalize git word

* docs: update CHANGELOG

* docs: remove CHANGELOG update
2020-03-07 18:03:15 +01:00
Alex Khaerov
0ca35ef26c Add Prudential to the customer list (#3199)
Signed-off-by: Alex Khaerov <alex.khaerov@prudential.com.sg>
2020-03-06 16:26:44 -08:00
Alexander Matyushentsev
b38a9aacb2 fix: codegen task is broken locally (#3200) 2020-03-06 12:51:03 -08:00
jannfis
5b239fc1d1 fix: stop caching helm index (#3193)
* fix: stop caching helm index

* Apply reviewer notes
2020-03-05 19:55:47 +01:00
jannfis
fdf7566bb7 fix: error message on login page if login is disabled (#3198) 2020-03-05 19:54:26 +01:00
Alexander Matyushentsev
389858b6df Add note about where the valueFiles param references (#3196)
This file seems to serve as the only real reference as to what parameters are available for the Application CRD. It took me a bit of trial and error to figure out that these are in the git repo referenced and relative to the path of the helm chart set previously. Hopefully this helps a future user save some time.
2020-03-05 10:00:33 -08:00
Alexander Matyushentsev
20adad76ef feat: Disable Admin Login (fixes #3019) (#3179)
feat: Disable Admin Login (fixes #3019) (#3179)
2020-03-04 15:26:07 -08:00
Alexander Matyushentsev
f37ae1c1f6 docs: document resource.inclusions setting (#3190)
* docs: document resource.inclusions setting

* clarify that resource.inclusions and resource.exclusions might be used together
2020-03-04 17:33:08 +01:00
Alexander Matyushentsev
6edd18bb89 feat: support helm3 (#2383) (#3178)
* feat: support helm3 (#2383)

* draft

* Apply reviewer notes
2020-03-04 17:05:44 +01:00
Alex Mironov
4d23fe8108 feat: add "service-account" flag to "cluster add" command (#3183) (#3184)
* Add "skip-rbac-setup" flag to "cluster add" command

"InstallClusterManagerRBAC" method of the clusterauth package
is somewhat opinionated about rolebindings and role definitions
for "argocd-manager" SA. Sometimes it is desirable however to manually
pre-configure such bindings and/or modify them in order to comply
with existing infrastructure requirements.

This commit introduces a new option "--skip-rbac-setup" which allows operator
to skip the aforementioned "InstallClusterManagerRBAC" method call.

* Modified --skip-rbac-setup into --service-account flag

* use reference instead of hardoded SA name
2020-03-04 14:25:36 +01:00
Andy Boyett
7eeefb003c docs: correct typo in diffing section on HPAs (#3172)
Reordering `spec.metrics` will fix an OutOfSync state due to the HPA
controller reordering this array. The previously referenced
`spec.replicas` field doesn't exist within any known version of the
`HorizontalPodAutoscaler` (autoscaling/v1, autoscaling/v2beta1, or
autoscaling/v2beta2)
2020-03-03 17:51:21 -08:00
Masaya Ozawa
3ae5b2bfe4 Fixed description of non-cascade command in App Deletion (#3173) 2020-03-02 18:01:05 +01:00
wecger
cdebd26ab4 examples/dashboard.json: removing filling, add increase to grpc metrics (#3154) 2020-02-28 10:12:02 -08:00
Alexander Matyushentsev
3a088c7c86 fix: dex proxy should forward request to dex preserving the basehref (#3165) 2020-02-28 18:57:14 +01:00
Dai Kurosawa
5a363e9d9f Update Go version from v1.13.8 to v1.14.0 (#3162) 2020-02-28 08:42:56 -08:00
Gustav Paul
57ea24281c fix: set default login redirect to baseHRef (#3164) 2020-02-27 11:35:51 -08:00
Gustav Paul
94d7c10baa fix: don't double-prepend basehref to redirect URLs (fixes #3137) (#3138)
* fix: don't double-prepend basehref to redirect URLs

Fixes https://github.com/argoproj/argo-cd/issues/3137

* ui/src/app: add basehref to window.location.href assignment
2020-02-26 15:13:42 -08:00
Shelby Moore
28027897aa fix: upgrade redis-ha chart and enable haproxy (#3147)
* fix: upgrade redis-ha chart and enable haproxy

* fix: regenerate manifests, revert removal of failover cache client

* fix: add kustomize patch to strip namespace from redis-ha manifests
2020-02-26 14:22:34 -08:00
nurinamu
0c610f91e5 fix broken url and resize it (#3145) 2020-02-26 14:18:41 -08:00
jannfis
990d9ef92b Use a more sane regexp pattern without capture groups for URL matching (#3161) 2020-02-26 10:07:52 -08:00
wecger
6592773a35 improvement: example/dashboard.json: added labels to legends (#3140) 2020-02-22 10:32:59 +01:00
Shelby Moore
beee4de10e fix: make dex server deployment init container resilient to restarts (#3136) 2020-02-20 21:52:21 +01:00
David J. M. Karlsen
7fde387dd6 Update auth0.md (#3133)
cosmetics

Signed-off-by: David Karlsen <david@davidkarlsen.com>
2020-02-19 11:30:00 -08:00
Dai Kurosawa
64c8ac70fb Update Go version from v1.13.7 to v1.13.8 (#3129) 2020-02-17 22:42:19 +01:00
Andreas Grimmer
f230df938e Improve docs for Hooks (#3115) 2020-02-14 07:39:47 -08:00
Alex Rowley
c9b0fdf1d7 Add missing CHANGELOG entry for 1.2.5 (#3109) 2020-02-14 07:39:08 -08:00
jannfis
ea57d15a80 fix: Allow multiple hostnames per SSH known hosts entry and also allow IPv6 (#2814) (#3074)
* Allow multiple hostnames per SSH known hosts entry and also allow IPv6

* Satisfy lint monster

* And also satisfy the other lint monster
2020-02-10 14:11:50 -08:00
Alex Collins
ebc048167c feat: Supports the validate-false option at an app level. Closes #1063 (#2542) 2020-02-10 14:09:25 -08:00
Nándor István Krácser
3b8405a89b add Bank-Vaults to Secret Management (#3106) 2020-02-10 14:05:22 -08:00
Jesse Suen
66d496d1ef fix: argocd-util backup produced truncated backups. import app status (#3096) 2020-02-10 11:24:33 -08:00
Alex Stein
9d71ae5ad6 Adding ThousandEyes to user-list in README.md (#3103) 2020-02-10 08:44:14 -08:00
Felix Gläske
85d660f0b9 Update custom_tools.md (#3100)
docs: fix typo in custom_tools.md (#3100)
2020-02-10 09:11:55 +01:00
Alexander Matyushentsev
d5286296eb fix: install exact version of mkdocs and mkdocs_material during docs site building (#3095) 2020-02-07 16:06:06 -08:00
Alexander Matyushentsev
916d4aed57 fix: reduct secret values of manifests stored in git (#3088) 2020-02-07 15:40:58 -08:00
Alexander Matyushentsev
59d7b7d2b4 fix: ui referring to /api/version using absolute path (#3092) 2020-02-07 15:39:07 -08:00
Alexander Matyushentsev
18c8716f0a feat: add dest cluster and namespace in the Events (#3093) 2020-02-07 15:38:58 -08:00
Fred Dubois
a1afe44066 docs: Fix json pointer in docs (#3087)
We just copy/pasted this json pointer because we deployed a
`MutatingWebhookConfiguration` and realized it wasn't fixing the out of sync.
2020-02-06 21:19:21 +01:00
Alexander Matyushentsev
1695457f9c fix: when user tries to rollback an app with auto-sync enabled UI should ask for user confirmation once (#3080) 2020-02-04 14:55:17 -08:00
Alexander Matyushentsev
06bc4064c1 fix: labels not being deleted via UI (#3081) 2020-02-04 13:49:21 -08:00
Abdullah Alqarni
d67b4f6c36 Fix: correct a typo in kustomize.md (#3079)
Only for the sake of perfection, replacing `it's` with `its` :)

More on this here[http://its-not-its.info/](http://its-not-its.info/)
2020-02-03 23:47:04 -08:00
Adam Johnson
d2ff5887ac Rollback disables auto sync issue #2441 (#2591)
* rollback disables auto sync

* add error check

* Add confirmation to disable auto sync in ui and revert backend change
2020-02-03 16:48:22 -08:00
eSamS
205926fa80 feat: allow ssh and http repository references in bitbucketserver webhook #2773 (#3036)
* check ssh and https url in bitbucketserver webhook

* do not break up checking webhook urls if one check fails

* log webhook url if regexp compile fails
2020-02-03 10:03:48 +01:00
jannfis
c4dd9d19c2 Use 'latest' as default tag for Docker image builds (#3072) 2020-02-01 20:47:25 -08:00
Guido Maria Serra+Fenaroli
74fe4af98e fix: HTTP|HTTPS|NO_PROXY env variable reading #3055 (#3063)
* attempting to fix HTTP|HTTPS|NO_PROXY env variable reading #3055 -> @jannfis tnx for the snippet ;)

* adding a couple of sponsors references

* fix! semanthic and form of the statement

* doc: add ref. to companies that sponsored my work on ArgoCD #3055

* avoiding problems

* Trigger notification

Co-authored-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>
2020-02-01 20:46:20 -08:00
Miles Armstrong
949808f0b2 docs: Add MOO Print to list of users (#3065)
* Add MOO Print to list of users

* Re-sort 'Who uses' list alphabetically
2020-01-31 14:36:50 -08:00
jannfis
9ef80ef1f7 chore: Update CHANGELOG.md up to 1.4.2 (#3069) 2020-01-31 13:41:23 -08:00
Dai Kurosawa
1801212ac7 chore: Upgrade Go version from v1.13.6 to v1.13.7 (#3056) 2020-01-31 22:00:43 +01:00
jannfis
722d5b02d9 fix: Correct usage text for repo add command regarding insecure repos (#3068)
* Correct usage information for repo add command regarding insecure repositories

* Retrigger stuck CI
2020-01-31 12:50:39 -08:00
jannfis
9f8505205f fix: Ensure SSH private key is written out with a final newline character (#2890) (#3064)
* Ensure SSH private key is written out with a final newline character

* Retrigger stuck CI
2020-01-31 11:02:43 -08:00
jannfis
9e81c38c13 fix: Handle SSH URLs in 'git@server:org/repo' notation correctly (#3062)
* Handle invalid repo URLs better

* Safeguard Git repository root at client creation
2020-01-31 01:14:22 -08:00
rayanebel
ff40297bdc fix sso condition when several sso connectors has been configured (#3057) 2020-01-30 13:40:16 -08:00
Dai Kurosawa
c8d74d1a7f Fix bug where the same pointer is used. (#3059) 2020-01-30 09:47:18 -08:00
Alexander Matyushentsev
a3f8ec33f4 chore: fix codegen-local (#3053) 2020-01-29 20:00:32 +01:00
Alexander Matyushentsev
c7718242f9 chore: publish image on every push to master (#3051) 2020-01-29 19:09:16 +01:00
Sean Dukehart
57eeaa4231 Changes to enable helm --set-file (#2752)
Necessary STDIN changes to support Windows

Added support for SE Linux

Informational message about linting OOM

Updated due to latest helm stable being 3.x
2020-01-29 08:26:05 -08:00
aarongorka
7edcf47a03 docs: Clarify syntax for diff customization should be json-patch (#3044)
One might assume that Argo is expecting
[JSONPath](https://kubernetes.io/docs/reference/kubectl/jsonpath/)
rather than JSON Patch, which this commit clarifies via a link to the
official RFC.
2020-01-29 07:46:58 -08:00
Pablo Fredrikson
f561f22caa Removing extra dot in docs (#3043)
This dot breaks the yaml and it shouldn't be present
2020-01-28 15:07:21 -08:00
jannfis
dcea620ca6 Update argo-ui dependency to latest commit in master (#3038) 2020-01-27 08:57:46 -08:00
jannfis
9790a5da9c fix: Better handling of K8s secrets for repository credentials & templates (#3016 #3028) (#3029)
* Fix for calculation of credential secrets' names and secret deletion

* Fix comments to reflect reality

* Update unit tests

* Don't encode parts of the repo URL into secret names anymore

* Lint fixes

* Satisfy linter: Remove unused variable

* Retrigger stuck CI
2020-01-27 07:56:41 -08:00
jannfis
b1d281e7bb Allow dash character in output of kubectl version (#3035) 2020-01-27 07:16:37 -08:00
Glen Keane
2e7fa935c4 docs: Fix getting started 404, add useful links (#3037) 2020-01-27 13:51:06 +01:00
Dai Kurosawa
8b69efcdb9 fix: Include resource group for events InvolvedObject.APIVersion #3011 (#3031) 2020-01-25 12:09:24 +01:00
jannfis
8b08a337c5 Clarify that non-standard SSH ports have to use ssh:// URLs (#3030) 2020-01-24 14:27:26 -08:00
Daniel Beal
e22f946415 fix: Jsonnet TLA parameters of same type are overwritten (#3022)
* TLA parameters of same time are overwritten

When updating an application deployed with existing TLAs using the following command:

```
argocd app set m2-jsonnet --jsonnet-tla-code "myTLAVar={hello:'world'}"
```

The all the TLAs of type code will be cleared and not preserved as would be expected of a set. The only TLA remaining is `myTLAVar`.
This will set the behavior of TLAs to match that of extVars

Signed-off-by: Daniel Beal <dbeal@wiser.com>

* revert gopkg.lock

* add unit tests

* fix go formatting
2020-01-24 10:34:53 -08:00
Joseph Mulloy
3c6715a6f9 fix: Replace aws-iam-authenticator to support IRSA (#3010)
Replace aws-iam-authenticator with aws cli to support EKS cluster auth
via IAM Roles for Service Accounts (IRSA)

See https://aws.amazon.com/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts/
2020-01-24 10:32:33 -08:00
Dário Nascimento
4cf02fd813 Hide bindPW in dex config (#3025)
Like https://github.com/argoproj/argo-cd/issues/2536 , the DEX password for LDAP is being leaked in a command that prints configuration.
This change not only hides the bindPW but also changes the logging level to trace so that by default, the configuration is not leaked to logs.
2020-01-24 08:37:14 -08:00
Masayuki Ishii
17d217c2d6 feat: Add argocd cmd for Windows #2121 (#3015)
* fix: Explicitly cast Stdin file descriptors to int

Signed-off-by: Masayuki Ishii <masa213f@gmail.com>

* feat: Add the windows CLI

Signed-off-by: Masayuki Ishii <masa213f@gmail.com>

* fix: Fix warning message

Signed-off-by: Masayuki Ishii <masa213f@gmail.com>
2020-01-24 08:18:00 +01:00
Alexander Matyushentsev
32d5a05aef fix: correctly replace cache in namespace isolation mode (#3023) 2020-01-23 16:19:29 -08:00
rumstead
e3f3688227 docs: Update disaster_recovery.md (#3021)
Fixing verbiage.
2020-01-23 19:39:19 +01:00
Dai Kurosawa
ad715565a6 Upgrade Go version from v1.12.6 to v1.13.6 (#2994) 2020-01-23 10:11:01 -08:00
Alexander Matyushentsev
d7cad4ac6d fix: run dep ensure (#3018) 2020-01-22 14:42:06 -08:00
jannfis
cc6c67d343 fix: Provide correct example for repocreds add command (#3016) (#3017)
* Correct SSH example for repocreds add command

* More example & comment fixes for repo and repocreds commands
2020-01-22 10:34:34 -08:00
Alexander Matyushentsev
6ada626dda fix: impossible to config RBAC if group name includes ',' (#3013)
* fix:  impossible to config RBAC if group name includes ','

* apply reviewer notes
2020-01-22 18:19:46 +01:00
Alexander Matyushentsev
5bc59003af chore: add jannfis to approvers list (#3014) 2020-01-22 08:45:39 +01:00
Alexander Matyushentsev
fe583c2f5d docs: update v1.4 contributors list (#2993) 2020-01-21 14:53:07 -08:00
Marco Schmid
539281f89e fix: Fixes username matching for SSH repositories for webhooks (fixes #2988) (#2990)
* fixed username matching for ssh-repos

* fixed string format
2020-01-16 08:02:41 -08:00
Alexander Matyushentsev
e5ea3fe1fb feat: upgrade dex to v2.21.0 (#2985) 2020-01-15 14:06:38 -08:00
Alexander Matyushentsev
f36ea4646d fix: sync apps panel fails with 'No App Selected' message if name contains '.' (#2983) 2020-01-15 11:00:25 -08:00
Alexander Matyushentsev
ddcdbaa990 docs: add notifications.md with recommandation about notifications (#2979)
* docs: add demo argocd/grafana links

* docs: add notifications.md with recommandation about notifications
2020-01-15 10:48:03 -08:00
Paul Brit
857ce87f00 docs: Fix a broken link to Helm Hooks (#2970) 2020-01-14 14:13:45 -08:00
Alexander Matyushentsev
4643a1c26d fix: fix nil pointer dereference in CreateRepositoryCredentials method (#2975) 2020-01-14 14:13:40 -08:00
Alexander Matyushentsev
3bf8dc6fb0 fix: remove 'total' suffix from gauge prom metric (#2976) 2020-01-14 14:13:19 -08:00
Alexander Matyushentsev
f62559128d fix: fix rendering CRD acronym (#2978) 2020-01-14 14:13:00 -08:00
Alexander Matyushentsev
63fe5f32ba docs: v1.3 and v1.4 changelog (#2952) 2020-01-14 14:10:44 -08:00
1656 changed files with 155097 additions and 45012 deletions

View File

@@ -1,217 +0,0 @@
version: 2.1
commands:
configure_git:
steps:
- run:
name: Configure Git
command: |
set -x
# must be configured for tests to run
git config --global user.email you@example.com
git config --global user.name "Your Name"
echo "export PATH=/home/circleci/.go_workspace/src/github.com/argoproj/argo-cd/hack:\$PATH" | tee -a $BASH_ENV
echo "export GIT_ASKPASS=git-ask-pass.sh" | tee -a $BASH_ENV
restore_vendor:
steps:
- restore_cache:
keys:
- vendor-v1-{{ checksum "Gopkg.lock" }}-{{ .Environment.CIRCLE_JOB }}
save_vendor:
steps:
- save_cache:
key: vendor-v1-{{ checksum "Gopkg.lock" }}-{{ .Environment.CIRCLE_JOB }}
paths:
- vendor
install_golang:
steps:
- run:
name: Install Golang v1.12.6
command: |
go get golang.org/dl/go1.12.6
[ -e /home/circleci/sdk/go1.12.6 ] || go1.12.6 download
go env
echo "export GOPATH=/home/circleci/.go_workspace" | tee -a $BASH_ENV
echo "export PATH=/home/circleci/sdk/go1.12.6/bin:\$PATH" | tee -a $BASH_ENV
save_go_cache:
steps:
- save_cache:
key: go-v1-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
# https://circleci.com/docs/2.0/language-go/
paths:
- /home/circleci/.cache/go-build
- /home/circleci/sdk/go1.12.6
restore_go_cache:
steps:
- restore_cache:
keys:
- go-v1-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
- go-v1-master-{{ .Environment.CIRCLE_JOB }}
jobs:
codegen:
docker:
- image: circleci/golang:1.12
working_directory: /go/src/github.com/argoproj/argo-cd
steps:
- checkout
- restore_cache:
keys:
- codegen-v1-{{ checksum "Gopkg.lock" }}-{{ checksum "hack/installers/install-codegen-go-tools.sh" }}
- run: ./hack/install.sh codegen-go-tools
- run: sudo ./hack/install.sh codegen-tools
- run: dep ensure -v
- save_cache:
key: codegen-v1-{{ checksum "Gopkg.lock" }}-{{ checksum "hack/installers/install-codegen-go-tools.sh" }}
paths: [vendor, /tmp/dl, /go/pkg]
- run: helm init --client-only
- run: make codegen-local
- run:
name: Check nothing has changed
command: |
set -xo pipefail
# This makes sure you ran `make pre-commit` before you pushed.
# We exclude the Swagger resources; CircleCI doesn't generate them correctly.
# When this fails, it will, create a patch file you can apply locally to fix it.
# To troubleshoot builds: https://argoproj.github.io/argo-cd/developer-guide/ci/
git diff --exit-code -- . ':!Gopkg.lock' ':!assets/swagger.json' | tee codegen.patch
- store_artifacts:
path: codegen.patch
destination: .
test:
working_directory: /home/circleci/.go_workspace/src/github.com/argoproj/argo-cd
machine:
image: circleci/classic:201808-01
steps:
- restore_go_cache
- install_golang
- checkout
- restore_cache:
key: test-dl-v1
- run: sudo ./hack/install.sh kubectl-linux kubectx-linux dep-linux ksonnet-linux helm-linux kustomize-linux
- save_cache:
key: test-dl-v1
paths: [/tmp/dl]
- configure_git
- run: go get github.com/jstemmer/go-junit-report
- restore_vendor
- run: dep ensure -v
- run: make test
- save_vendor
- save_go_cache
- run:
name: Uploading code coverage
command: bash <(curl -s https://codecov.io/bash) -f coverage.out
- store_test_results:
path: test-results
- store_artifacts:
path: test-results
destination: .
e2e:
working_directory: /home/circleci/.go_workspace/src/github.com/argoproj/argo-cd
machine:
image: circleci/classic:201808-01
environment:
ARGOCD_FAKE_IN_CLUSTER: "true"
ARGOCD_SSH_DATA_PATH: "/tmp/argo-e2e/app/config/ssh"
ARGOCD_TLS_DATA_PATH: "/tmp/argo-e2e/app/config/tls"
steps:
- run:
name: Install and start K3S v0.5.0
command: |
curl -sfL https://get.k3s.io | sh -
sudo chmod -R a+rw /etc/rancher/k3s
kubectl version
background: true
environment:
INSTALL_K3S_EXEC: --docker
INSTALL_K3S_VERSION: v0.5.0
- restore_go_cache
- install_golang
- checkout
- restore_cache:
keys: [e2e-dl-v1]
- run: sudo ./hack/install.sh kubectx-linux dep-linux ksonnet-linux helm-linux kustomize-linux
- run: go get github.com/jstemmer/go-junit-report
- save_cache:
key: e2e-dl-v10
paths: [/tmp/dl]
- restore_vendor
- run: dep ensure -v
- configure_git
- run: make cli
- run:
name: Create namespace
command: |
set -x
kubectl create ns argocd-e2e
kubens argocd-e2e
# install the certificates (not 100% sure we need this)
sudo cp /var/lib/rancher/k3s/server/tls/token-ca.crt /usr/local/share/ca-certificates/k3s.crt
sudo update-ca-certificates
# create the kubecfg, again - not sure we need this
cat /etc/rancher/k3s/k3s.yaml | sed "s/localhost/`hostname`/" | tee ~/.kube/config
echo "127.0.0.1 `hostname`" | sudo tee -a /etc/hosts
- run:
name: Apply manifests
command: kustomize build test/manifests/base | kubectl apply -f -
- run:
name: Start Redis
command: docker run --rm --name argocd-redis -i -p 6379:6379 redis:5.0.3-alpine --save "" --appendonly no
background: true
- run:
name: Start repo server
command: go run ./cmd/argocd-repo-server/main.go --loglevel debug --redis localhost:6379
background: true
- run:
name: Start API server
command: go run ./cmd/argocd-server/main.go --loglevel debug --redis localhost:6379 --insecure --dex-server http://localhost:5556 --repo-server localhost:8081 --staticassets ../argo-cd-ui/dist/app
background: true
- run:
name: Start Test Git
command: |
test/fixture/testrepos/start-git.sh
background: true
- run: until curl -v http://localhost:8080/healthz; do sleep 10; done
- run:
name: Start controller
command: go run ./cmd/argocd-application-controller/main.go --loglevel debug --redis localhost:6379 --repo-server localhost:8081 --kubeconfig ~/.kube/config
background: true
- run:
command: PATH=dist:$PATH make test-e2e
environment:
ARGOCD_OPTS: "--server localhost:8080 --plaintext"
ARGOCD_E2E_K3S: "true"
- save_vendor
- save_go_cache
- store_test_results:
path: test-results
- store_artifacts:
path: test-results
destination: .
ui:
docker:
- image: node:11.15.0
working_directory: ~/argo-cd/ui
steps:
- checkout:
path: ~/argo-cd/
- restore_cache:
keys:
- yarn-packages-v4-{{ checksum "yarn.lock" }}
- run: yarn install --frozen-lockfile --ignore-optional --non-interactive
- save_cache:
key: yarn-packages-v4-{{ checksum "yarn.lock" }}
paths: [~/.cache/yarn, node_modules]
- run: yarn test
- run: ./node_modules/.bin/codecov -p ..
- run: NODE_ENV='production' yarn build
- run: yarn lint
workflows:
version: 2
workflow:
jobs:
- test
- codegen
- ui:
requires:
- codegen
- e2e

View File

@@ -5,9 +5,12 @@ title: ''
labels: 'bug'
assignees: ''
---
If you are trying to resolve an environment-specific issue or have a one-off question about the edge case that does not require a feature then please consider asking a question in argocd slack [channel](https://argoproj.github.io/community/join-slack).
Checklist:
* [ ] I've searched in the docs and FAQ for my answer: http://bit.ly/argocd-faq.
* [ ] I've searched in the docs and FAQ for my answer: https://bit.ly/argocd-faq.
* [ ] I've included steps to reproduce the bug.
* [ ] I've pasted the output of `argocd version`.

12
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
blank_issues_enabled: false
contact_links:
- name: Have you read the docs?
url: https://argo-cd.readthedocs.io/
about: Much help can be found in the docs
- name: Ask a question
url: https://github.com/argoproj/argo-cd/discussions/new
about: Ask a question or start a discussion about Argo CD
- name: Chat on Slack
url: https://argoproj.github.io/community/join-slack
about: Maybe chatting with the community can help

View File

@@ -1,7 +1,17 @@
Note on DCO:
If the DCO action in the integration test fails, one or more of your commits are not signed off. Please click on the *Details* link next to the DCO action for instructions on how to resolve this.
Checklist:
* [ ] Either (a) I've created an [enhancement proposal](https://github.com/argoproj/argo-cd/issues/new/choose) and discussed it with the community, (b) this is a bug fix, or (c) this does not need to be in the release notes.
* [ ] The title of the PR states what changed and the related issues number (used for the release note).
* [ ] I've included "Closes [ISSUE #]" or "Fixes [ISSUE #]" in the description to automatically close the associated issue.
* [ ] I've updated both the CLI and UI to expose my feature, or I plan to submit a second PR with them.
* [ ] Optional. My organization is added to the README.
* [ ] I've signed the CLA and my build is green ([troubleshooting builds](https://argoproj.github.io/argo-cd/developer-guide/ci/)).
* [ ] Does this PR require documentation updates?
* [ ] I've updated documentation as required by this PR.
* [ ] Optional. My organization is added to USERS.md.
* [ ] I have signed off all my commits as required by [DCO](https://github.com/argoproj/argoproj/tree/master/community#contributing-to-argo)
* [ ] I have written unit and/or e2e tests for my change. PRs without these are unlikely to be merged.
* [ ] My build is green ([troubleshooting builds](https://argo-cd.readthedocs.io/en/latest/developer-guide/ci/)).

436
.github/workflows/ci-build.yaml vendored Normal file
View File

@@ -0,0 +1,436 @@
name: Integration tests
on:
push:
branches:
- 'master'
- 'release-*'
- '!release-1.4'
- '!release-1.5'
pull_request:
branches:
- 'master'
- 'release-*'
env:
# Golang version to use across CI steps
GOLANG_VERSION: '1.16.11'
jobs:
build-docker:
name: Build Docker image
runs-on: ubuntu-latest
if: github.head_ref != ''
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build Docker image
run: |
make image
check-go:
name: Ensure Go modules synchronicity
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: Download all Go modules
run: |
go mod download
- name: Check for tidyness of go.mod and go.sum
run: |
go mod tidy
git diff --exit-code -- .
build-go:
name: Build & cache Go code
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: Restore go build cache
uses: actions/cache@v1
with:
path: ~/.cache/go-build
key: ${{ runner.os }}-go-build-v1-${{ github.run_id }}
- name: Download all Go modules
run: |
go mod download
- name: Compile all packages
run: make build-local
lint-go:
name: Lint Go code
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Run golangci-lint
uses: golangci/golangci-lint-action@v2
with:
version: v1.38.0
args: --timeout 10m --exclude SA5011
test-go:
name: Run unit tests for Go packages
runs-on: ubuntu-latest
needs:
- build-go
steps:
- name: Create checkout directory
run: mkdir -p ~/go/src/github.com/argoproj
- name: Checkout code
uses: actions/checkout@v2
- name: Create symlink in GOPATH
run: ln -s $(pwd) ~/go/src/github.com/argoproj/argo-cd
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: Install required packages
run: |
sudo apt-get install git -y
- name: Switch to temporal branch so we re-attach head
run: |
git switch -c temporal-pr-branch
git status
- name: Fetch complete history for blame information
run: |
git fetch --prune --no-tags --depth=1 origin +refs/heads/*:refs/remotes/origin/*
- name: Add ~/go/bin to PATH
run: |
echo "/home/runner/go/bin" >> $GITHUB_PATH
- name: Add /usr/local/bin to PATH
run: |
echo "/usr/local/bin" >> $GITHUB_PATH
- name: Restore go build cache
uses: actions/cache@v1
with:
path: ~/.cache/go-build
key: ${{ runner.os }}-go-build-v1-${{ github.run_id }}
- name: Install all tools required for building & testing
run: |
make install-test-tools-local
- name: Setup git username and email
run: |
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
- name: Download and vendor all required packages
run: |
go mod download
- name: Run all unit tests
run: make test-local
- name: Generate code coverage artifacts
uses: actions/upload-artifact@v2
with:
name: code-coverage
path: coverage.out
- name: Generate test results artifacts
uses: actions/upload-artifact@v2
with:
name: test-results
path: test-results/
test-go-race:
name: Run unit tests with -race, for Go packages
runs-on: ubuntu-latest
needs:
- build-go
steps:
- name: Create checkout directory
run: mkdir -p ~/go/src/github.com/argoproj
- name: Checkout code
uses: actions/checkout@v2
- name: Create symlink in GOPATH
run: ln -s $(pwd) ~/go/src/github.com/argoproj/argo-cd
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: Install required packages
run: |
sudo apt-get install git -y
- name: Switch to temporal branch so we re-attach head
run: |
git switch -c temporal-pr-branch
git status
- name: Fetch complete history for blame information
run: |
git fetch --prune --no-tags --depth=1 origin +refs/heads/*:refs/remotes/origin/*
- name: Add ~/go/bin to PATH
run: |
echo "/home/runner/go/bin" >> $GITHUB_PATH
- name: Add /usr/local/bin to PATH
run: |
echo "/usr/local/bin" >> $GITHUB_PATH
- name: Restore go build cache
uses: actions/cache@v1
with:
path: ~/.cache/go-build
key: ${{ runner.os }}-go-build-v1-${{ github.run_id }}
- name: Install all tools required for building & testing
run: |
make install-test-tools-local
- name: Setup git username and email
run: |
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
- name: Download and vendor all required packages
run: |
go mod download
- name: Run all unit tests
run: make test-race-local
- name: Generate test results artifacts
uses: actions/upload-artifact@v2
with:
name: race-results
path: test-results/
codegen:
name: Check changes to generated code
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: Create symlink in GOPATH
run: |
mkdir -p ~/go/src/github.com/argoproj
cp -a ../argo-cd ~/go/src/github.com/argoproj
- name: Add ~/go/bin to PATH
run: |
echo "/home/runner/go/bin" >> $GITHUB_PATH
- name: Add /usr/local/bin to PATH
run: |
echo "/usr/local/bin" >> $GITHUB_PATH
- name: Download & vendor dependencies
run: |
# We need to vendor go modules for codegen yet
go mod download
go mod vendor -v
working-directory: /home/runner/go/src/github.com/argoproj/argo-cd
- name: Install toolchain for codegen
run: |
make install-codegen-tools-local
make install-go-tools-local
working-directory: /home/runner/go/src/github.com/argoproj/argo-cd
- name: Initialize local Helm
run: |
helm2 init --client-only
- name: Run codegen
run: |
set -x
export GOPATH=$(go env GOPATH)
git checkout -- go.mod go.sum
make codegen-local
working-directory: /home/runner/go/src/github.com/argoproj/argo-cd
- name: Check nothing has changed
run: |
set -xo pipefail
git diff --exit-code -- . ':!go.sum' ':!go.mod' ':!assets/swagger.json' | tee codegen.patch
working-directory: /home/runner/go/src/github.com/argoproj/argo-cd
build-ui:
name: Build, test & lint UI code
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup NodeJS
uses: actions/setup-node@v1
with:
node-version: '12.18.4'
- name: Restore node dependency cache
id: cache-dependencies
uses: actions/cache@v1
with:
path: ui/node_modules
key: ${{ runner.os }}-node-dep-v2-${{ hashFiles('**/yarn.lock') }}
- name: Install node dependencies
run: |
cd ui && yarn install --frozen-lockfile --ignore-optional --non-interactive
- name: Build UI code
run: |
yarn test
yarn build
env:
NODE_ENV: production
NODE_ONLINE_ENV: online
working-directory: ui/
- name: Run ESLint
run: yarn lint
working-directory: ui/
analyze:
name: Process & analyze test artifacts
runs-on: ubuntu-latest
needs:
- test-go
- build-ui
env:
sonar_secret: ${{ secrets.SONAR_TOKEN }}
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Restore node dependency cache
id: cache-dependencies
uses: actions/cache@v1
with:
path: ui/node_modules
key: ${{ runner.os }}-node-dep-v2-${{ hashFiles('**/yarn.lock') }}
- name: Remove other node_modules directory
run: |
rm -rf ui/node_modules/argo-ui/node_modules
- name: Create test-results directory
run: |
mkdir -p test-results
- name: Get code coverage artifiact
uses: actions/download-artifact@v2
with:
name: code-coverage
- name: Get test result artifact
uses: actions/download-artifact@v2
with:
name: test-results
path: test-results
- name: Upload code coverage information to codecov.io
uses: codecov/codecov-action@v1
with:
file: coverage.out
- name: Perform static code analysis using SonarCloud
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SCANNER_VERSION: 4.2.0.1873
SCANNER_PATH: /tmp/cache/scanner
OS: linux
run: |
# We do not use the provided action, because it does contain an old
# version of the scanner, and also takes time to build.
set -e
mkdir -p ${SCANNER_PATH}
export SONAR_USER_HOME=${SCANNER_PATH}/.sonar
if [[ ! -x "${SCANNER_PATH}/sonar-scanner-${SCANNER_VERSION}-${OS}/bin/sonar-scanner" ]]; then
curl -Ol https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SCANNER_VERSION}-${OS}.zip
unzip -qq -o sonar-scanner-cli-${SCANNER_VERSION}-${OS}.zip -d ${SCANNER_PATH}
fi
chmod +x ${SCANNER_PATH}/sonar-scanner-${SCANNER_VERSION}-${OS}/bin/sonar-scanner
chmod +x ${SCANNER_PATH}/sonar-scanner-${SCANNER_VERSION}-${OS}/jre/bin/java
# Explicitly set NODE_MODULES
export NODE_MODULES=${PWD}/ui/node_modules
export NODE_PATH=${PWD}/ui/node_modules
${SCANNER_PATH}/sonar-scanner-${SCANNER_VERSION}-${OS}/bin/sonar-scanner
if: env.sonar_secret != ''
test-e2e:
name: Run end-to-end tests
runs-on: ubuntu-latest
strategy:
matrix:
k3s-version: [v1.21.2, v1.20.2, v1.19.2, v1.18.9, v1.17.11]
needs:
- build-go
env:
GOPATH: /home/runner/go
ARGOCD_FAKE_IN_CLUSTER: "true"
ARGOCD_SSH_DATA_PATH: "/tmp/argo-e2e/app/config/ssh"
ARGOCD_TLS_DATA_PATH: "/tmp/argo-e2e/app/config/tls"
ARGOCD_E2E_SSH_KNOWN_HOSTS: "../fixture/certs/ssh_known_hosts"
ARGOCD_E2E_K3S: "true"
ARGOCD_IN_CI: "true"
ARGOCD_E2E_APISERVER_PORT: "8088"
ARGOCD_SERVER: "127.0.0.1:8088"
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: GH actions workaround - Kill XSP4 process
run: |
sudo pkill mono || true
- name: Install K3S
env:
INSTALL_K3S_VERSION: ${{ matrix.k3s-version }}+k3s1
run: |
set -x
curl -sfL https://get.k3s.io | sh -
sudo chmod -R a+rw /etc/rancher/k3s
sudo mkdir -p $HOME/.kube && sudo chown -R runner $HOME/.kube
sudo k3s kubectl config view --raw > $HOME/.kube/config
sudo chown runner $HOME/.kube/config
kubectl version
- name: Restore go build cache
uses: actions/cache@v1
with:
path: ~/.cache/go-build
key: ${{ runner.os }}-go-build-v1-${{ github.run_id }}
- name: Add ~/go/bin to PATH
run: |
echo "/home/runner/go/bin" >> $GITHUB_PATH
- name: Add /usr/local/bin to PATH
run: |
echo "/usr/local/bin" >> $GITHUB_PATH
- name: Download Go dependencies
run: |
go mod download
go get github.com/mattn/goreman
- name: Install all tools required for building & testing
run: |
make install-test-tools-local
- name: Setup git username and email
run: |
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
- name: Pull Docker image required for tests
run: |
docker pull quay.io/dexidp/dex:v2.25.0
docker pull argoproj/argo-cd-ci-builder:v1.0.0
docker pull redis:6.2.6-alpine
- name: Create target directory for binaries in the build-process
run: |
mkdir -p dist
chown runner dist
- name: Run E2E server and wait for it being available
timeout-minutes: 30
run: |
set -x
# Something is weird in GH runners -- there's a phantom listener for
# port 8080 which is not visible in netstat -tulpen, but still there
# with a HTTP listener. We have API server listening on port 8088
# instead.
make start-e2e-local 2>&1 | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" > /tmp/e2e-server.log &
count=1
until curl -f http://127.0.0.1:8088/healthz; do
sleep 10;
if test $count -ge 60; then
echo "Timeout"
exit 1
fi
count=$((count+1))
done
- name: Run E2E testsuite
run: |
set -x
make test-e2e-local
- name: Upload e2e-server logs
uses: actions/upload-artifact@v2
with:
name: e2e-server-k8s${{ matrix.k3s-version }}.log
path: /tmp/e2e-server.log
if: ${{ failure() }}

52
.github/workflows/codeql.yml vendored Normal file
View File

@@ -0,0 +1,52 @@
name: "Code scanning - action"
on:
push:
pull_request:
schedule:
- cron: '0 19 * * 0'
jobs:
CodeQL-Build:
# CodeQL runs on ubuntu-latest and windows-latest
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@@ -4,6 +4,9 @@ on:
push:
branches:
- master
pull_request:
branches:
- 'master'
jobs:
deploy:
@@ -13,15 +16,8 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: 3.x
python-version: 3.9.8
- name: build
run: |
pip install mkdocs mkdocs_material
mkdocs build
mkdir ./site/.circleci && echo '{version: 2, jobs: {build: {branches: {ignore: gh-pages}}}}' > ./site/.circleci/config.yml
- name: deploy
uses: peaceiris/actions-gh-pages@v2.5.0
env:
PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
PUBLISH_BRANCH: gh-pages
PUBLISH_DIR: ./site
pip install -r docs/requirements.txt
mkdocs build

59
.github/workflows/image.yaml vendored Normal file
View File

@@ -0,0 +1,59 @@
name: Image
on:
push:
branches:
- master
env:
GOLANG_VERSION: '1.16.11'
jobs:
publish:
runs-on: ubuntu-latest
env:
GOPATH: /home/runner/work/argo-cd/argo-cd
steps:
- uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- uses: actions/checkout@master
with:
path: src/github.com/argoproj/argo-cd
# get image tag
- run: echo ::set-output name=tag::$(cat ./VERSION)-${GITHUB_SHA::8}
working-directory: ./src/github.com/argoproj/argo-cd
id: image
# build
- run: |
docker images -a --format "{{.ID}}" | xargs -I {} docker rmi {}
make image DEV_IMAGE=true DOCKER_PUSH=false IMAGE_NAMESPACE=ghcr.io/argoproj IMAGE_TAG=${{ steps.image.outputs.tag }}
working-directory: ./src/github.com/argoproj/argo-cd
# publish
- run: |
docker login ghcr.io --username $USERNAME --password $PASSWORD
docker push ghcr.io/argoproj/argocd:${{ steps.image.outputs.tag }}
docker login --username "${DOCKER_USERNAME}" --password "${DOCKER_TOKEN}"
docker tag ghcr.io/argoproj/argocd:${{ steps.image.outputs.tag }} argoproj/argocd:latest
docker push argoproj/argocd:latest
env:
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.TOKEN }}
DOCKER_USERNAME: ${{ secrets.RELEASE_DOCKERHUB_USERNAME }}
DOCKER_TOKEN: ${{ secrets.RELEASE_DOCKERHUB_TOKEN }}
# deploy
- run: git clone "https://$TOKEN@github.com/argoproj/argoproj-deployments"
env:
TOKEN: ${{ secrets.TOKEN }}
- run: |
docker run -u $(id -u):$(id -g) -v $(pwd):/src -w /src --rm -t ghcr.io/argoproj/argocd:${{ steps.image.outputs.tag }} kustomize edit set image quay.io/argoproj/argocd=ghcr.io/argoproj/argocd:${{ steps.image.outputs.tag }}
git config --global user.email 'ci@argoproj.com'
git config --global user.name 'CI'
git diff --exit-code && echo 'Already deployed' || (git commit -am 'Upgrade argocd to ${{ steps.image.outputs.tag }}' && git push)
working-directory: argoproj-deployments/argocd
# TODO: clean up old images once github supports it: https://github.community/t5/How-to-use-Git-and-GitHub/Deleting-images-from-GitHub-Package-Registry/m-p/41202/thread-id/9811

282
.github/workflows/release.yaml vendored Normal file
View File

@@ -0,0 +1,282 @@
name: Create ArgoCD release
on:
push:
tags:
- 'release-v*'
- '!release-v1.5*'
- '!release-v1.4*'
- '!release-v1.3*'
- '!release-v1.2*'
- '!release-v1.1*'
- '!release-v1.0*'
- '!release-v0*'
env:
GOLANG_VERSION: '1.16.11'
jobs:
prepare-release:
name: Perform automatic release on trigger ${{ github.ref }}
runs-on: ubuntu-latest
env:
# The name of the tag as supplied by the GitHub event
SOURCE_TAG: ${{ github.ref }}
# The image namespace where Docker image will be published to
IMAGE_NAMESPACE: quay.io/argoproj
# Whether to create & push image and release assets
DRY_RUN: false
# Whether a draft release should be created, instead of public one
DRAFT_RELEASE: false
# Whether to update homebrew with this release as well
# Set RELEASE_HOMEBREW_TOKEN secret in repository for this to work - needs
# access to public repositories
UPDATE_HOMEBREW: false
# Name of the GitHub user for Git config
GIT_USERNAME: argo-bot
# E-Mail of the GitHub user for Git config
GIT_EMAIL: argoproj@gmail.com
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Check if the published tag is well formed and setup vars
run: |
set -xue
# Target version must match major.minor.patch and optional -rcX suffix
# where X must be a number.
TARGET_VERSION=${SOURCE_TAG#*release-v}
if ! echo "${TARGET_VERSION}" | egrep '^[0-9]+\.[0-9]+\.[0-9]+(-rc[0-9]+)*$'; then
echo "::error::Target version '${TARGET_VERSION}' is malformed, refusing to continue." >&2
exit 1
fi
# Target branch is the release branch we're going to operate on
# Its name is 'release-<major>.<minor>'
TARGET_BRANCH="release-${TARGET_VERSION%\.[0-9]*}"
# The release tag is the source tag, minus the release- prefix
RELEASE_TAG="${SOURCE_TAG#*release-}"
# Whether this is a pre-release (indicated by -rc suffix)
PRE_RELEASE=false
if echo "${RELEASE_TAG}" | egrep -- '-rc[0-9]+$'; then
PRE_RELEASE=true
fi
# We must not have a release trigger within the same release branch,
# because that means a release for this branch is already running.
if git tag -l | grep "release-v${TARGET_VERSION%\.[0-9]*}" | grep -v "release-v${TARGET_VERSION}"; then
echo "::error::Another release for branch ${TARGET_BRANCH} is currently in progress."
exit 1
fi
# Ensure that release do not yet exist
if git rev-parse ${RELEASE_TAG}; then
echo "::error::Release tag ${RELEASE_TAG} already exists in repository. Refusing to continue."
exit 1
fi
# Make the variables available in follow-up steps
echo "TARGET_VERSION=${TARGET_VERSION}" >> $GITHUB_ENV
echo "TARGET_BRANCH=${TARGET_BRANCH}" >> $GITHUB_ENV
echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV
echo "PRE_RELEASE=${PRE_RELEASE}" >> $GITHUB_ENV
- name: Check if our release tag has a correct annotation
run: |
set -ue
# Fetch all tag information as well
git fetch --prune --tags --force
echo "=========== BEGIN COMMIT MESSAGE ============="
git show ${SOURCE_TAG}
echo "============ END COMMIT MESSAGE =============="
# Quite dirty hack to get the release notes from the annotated tag
# into a temporary file.
RELEASE_NOTES=$(mktemp -p /tmp release-notes.XXXXXX)
prefix=true
begin=false
git show ${SOURCE_TAG} | while read line; do
# Whatever is in commit history for the tag, we only want that
# annotation from our tag. We discard everything else.
if test "$begin" = "false"; then
if echo "$line" | grep -q "tag ${SOURCE_TAG#refs/tags/}"; then begin="true"; fi
continue
fi
if test "$prefix" = "true"; then
if test -z "$line"; then prefix=false; fi
else
if echo "$line" | egrep -q '^commit [0-9a-f]+'; then
break
fi
echo "$line" >> ${RELEASE_NOTES}
fi
done
# For debug purposes
echo "============BEGIN RELEASE NOTES================="
cat ${RELEASE_NOTES}
echo "=============END RELEASE NOTES=================="
# Too short release notes are suspicious. We need at least 100 bytes.
relNoteLen=$(stat -c '%s' $RELEASE_NOTES)
if test $relNoteLen -lt 100; then
echo "::error::No release notes provided in tag annotation (or tag is not annotated)"
exit 1
fi
# Check for magic string '## Quick Start' in head of release notes
if ! head -2 ${RELEASE_NOTES} | grep -iq '## Quick Start'; then
echo "::error::Release notes seem invalid, quick start section not found."
exit 1
fi
# We store path to temporary release notes file for later reading, we
# need it when creating release.
echo "RELEASE_NOTES=${RELEASE_NOTES}" >> $GITHUB_ENV
- name: Setup Golang
uses: actions/setup-go@v1
with:
go-version: ${{ env.GOLANG_VERSION }}
- name: Setup Git author information
run: |
set -ue
git config --global user.email "${GIT_EMAIL}"
git config --global user.name "${GIT_USERNAME}"
- name: Checkout corresponding release branch
run: |
set -ue
echo "Switching to release branch '${TARGET_BRANCH}'"
if ! git checkout ${TARGET_BRANCH}; then
echo "::error::Checking out release branch '${TARGET_BRANCH}' for target version '${TARGET_VERSION}' (tagged '${RELEASE_TAG}') failed. Does it exist in repo?"
exit 1
fi
- name: Create VERSION information
run: |
set -ue
echo "Bumping version from $(cat VERSION) to ${TARGET_VERSION}"
echo "${TARGET_VERSION}" > VERSION
git commit -m "Bump version to ${TARGET_VERSION}" VERSION
- name: Generate new set of manifests
run: |
set -ue
make install-codegen-tools-local
helm2 init --client-only
make manifests-local VERSION=${TARGET_VERSION}
git diff
git commit manifests/ -m "Bump version to ${TARGET_VERSION}"
- name: Create the release tag
run: |
set -ue
echo "Creating release ${RELEASE_TAG}"
git tag ${RELEASE_TAG}
- name: Build Docker image for release
run: |
set -ue
git clean -fd
mkdir -p dist/
make image IMAGE_TAG="${TARGET_VERSION}" DOCKER_PUSH=false
make release-cli
chmod +x ./dist/argocd-linux-amd64
./dist/argocd-linux-amd64 version --client
if: ${{ env.DRY_RUN != 'true' }}
- name: Push docker image to repository
env:
DOCKER_USERNAME: ${{ secrets.RELEASE_DOCKERHUB_USERNAME }}
DOCKER_TOKEN: ${{ secrets.RELEASE_DOCKERHUB_TOKEN }}
QUAY_USERNAME: ${{ secrets.RELEASE_QUAY_USERNAME }}
QUAY_TOKEN: ${{ secrets.RELEASE_QUAY_TOKEN }}
run: |
set -ue
docker login quay.io --username "${QUAY_USERNAME}" --password "${QUAY_TOKEN}"
docker push ${IMAGE_NAMESPACE}/argocd:v${TARGET_VERSION}
# Remove the following when Docker Hub is gone
docker login --username "${DOCKER_USERNAME}" --password "${DOCKER_TOKEN}"
docker tag ${IMAGE_NAMESPACE}/argocd:v${TARGET_VERSION} argoproj/argocd:v${TARGET_VERSION}
docker push argoproj/argocd:v${TARGET_VERSION}
if: ${{ env.DRY_RUN != 'true' }}
- name: Read release notes file
id: release-notes
uses: juliangruber/read-file-action@v1
with:
path: ${{ env.RELEASE_NOTES }}
- name: Push changes to release branch
run: |
set -ue
git push origin ${TARGET_BRANCH}
git push origin ${RELEASE_TAG}
- name: Create GitHub release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
id: create_release
with:
tag_name: ${{ env.RELEASE_TAG }}
release_name: ${{ env.RELEASE_TAG }}
draft: ${{ env.DRAFT_RELEASE }}
prerelease: ${{ env.PRE_RELEASE }}
body: ${{ steps.release-notes.outputs.content }}
- name: Upload argocd-linux-amd64 binary to release assets
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./dist/argocd-linux-amd64
asset_name: argocd-linux-amd64
asset_content_type: application/octet-stream
if: ${{ env.DRY_RUN != 'true' }}
- name: Upload argocd-darwin-amd64 binary to release assets
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./dist/argocd-darwin-amd64
asset_name: argocd-darwin-amd64
asset_content_type: application/octet-stream
if: ${{ env.DRY_RUN != 'true' }}
- name: Upload argocd-windows-amd64 binary to release assets
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./dist/argocd-windows-amd64.exe
asset_name: argocd-windows-amd64.exe
asset_content_type: application/octet-stream
if: ${{ env.DRY_RUN != 'true' }}
- name: Update homebrew formula
env:
HOMEBREW_TOKEN: ${{ secrets.RELEASE_HOMEBREW_TOKEN }}
uses: dawidd6/action-homebrew-bump-formula@v3
with:
token: ${{env.HOMEBREW_TOKEN}}
formula: argocd
if: ${{ env.HOMEBREW_TOKEN != '' && env.UPDATE_HOMEBREW == 'true' && env.PRE_RELEASE != 'true' }}
- name: Delete original request tag from repository
run: |
set -ue
git push --delete origin ${SOURCE_TAG}
if: ${{ always() }}

16
.gitignore vendored
View File

@@ -2,11 +2,23 @@
.idea/
.DS_Store
vendor/
dist/
dist/*
ui/dist/app/*
!ui/dist/app/gitkeep
site/
*.iml
# delve debug binaries
cmd/**/debug
debug.test
coverage.out
test-results
test-results
.scannerwork
.scratch
node_modules/
.kube/
# ignore built binaries
cmd/argocd/argocd
cmd/argocd-application-controller/argocd-application-controller
cmd/argocd-repo-server/argocd-repo-server
cmd/argocd-server/argocd-server

17
.gitpod.Dockerfile vendored Normal file
View File

@@ -0,0 +1,17 @@
FROM gitpod/workspace-full
USER root
RUN curl -o /usr/local/bin/kubectl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \
chmod +x /usr/local/bin/kubectl
RUN curl -L https://go.kubebuilder.io/dl/2.3.1/$(go env GOOS)/$(go env GOARCH) | \
tar -xz -C /tmp/ && mv /tmp/kubebuilder_2.3.1_$(go env GOOS)_$(go env GOARCH) /usr/local/kubebuilder
RUN apt-get install redis-server -y
RUN go get github.com/mattn/goreman
USER gitpod
ENV ARGOCD_REDIS_LOCAL=true
ENV KUBECONFIG=/tmp/kubeconfig

6
.gitpod.yml Normal file
View File

@@ -0,0 +1,6 @@
image:
file: .gitpod.Dockerfile
tasks:
- init: make mod-download-local dep-ui-local && GO111MODULE=off go get github.com/mattn/goreman
command: make start-test-k8s

7
.readthedocs.yml Normal file
View File

@@ -0,0 +1,7 @@
version: 2
formats: all
mkdocs:
fail_on_warning: false
python:
install:
- requirements: docs/requirements.txt

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
ARG BASE_IMAGE=debian:10-slim
ARG BASE_IMAGE=docker.io/library/ubuntu:21.04
####################################################################################################
# Builder image
# Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image
# Also used as the image in CI jobs so needs all dependencies
####################################################################################################
FROM golang:1.12.6 as builder
FROM docker.io/library/golang:1.16.11 as builder
RUN echo 'deb http://deb.debian.org/debian buster-backports main' >> /etc/apt/sources.list
@@ -17,6 +17,7 @@ RUN apt-get update && apt-get install -y \
make \
wget \
gcc \
sudo \
zip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
@@ -25,14 +26,12 @@ WORKDIR /tmp
ADD hack/install.sh .
ADD hack/installers installers
ADD hack/tool-versions.sh .
RUN ./install.sh dep-linux
RUN ./install.sh packr-linux
RUN ./install.sh kubectl-linux
RUN ./install.sh ksonnet-linux
RUN ./install.sh helm2-linux
RUN ./install.sh helm-linux
RUN ./install.sh kustomize-linux
RUN ./install.sh aws-iam-authenticator-linux
####################################################################################################
# Argo CD Base - used as the base for both the release and dev argocd images
@@ -41,28 +40,30 @@ FROM $BASE_IMAGE as argocd-base
USER root
RUN echo 'deb http://deb.debian.org/debian buster-backports main' >> /etc/apt/sources.list
ENV DEBIAN_FRONTEND=noninteractive
RUN groupadd -g 999 argocd && \
useradd -r -u 999 -g argocd argocd && \
mkdir -p /home/argocd && \
chown argocd:0 /home/argocd && \
chmod g=u /home/argocd && \
chmod g=u /etc/passwd && \
apt-get update && \
apt-get install -y git git-lfs && \
apt-get dist-upgrade -y && \
apt-get install -y git git-lfs python3-pip tini gpg tzdata && \
apt-get clean && \
pip3 install awscli==1.18.80 && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY hack/git-ask-pass.sh /usr/local/bin/git-ask-pass.sh
COPY hack/gpg-wrapper.sh /usr/local/bin/gpg-wrapper.sh
COPY hack/git-verify-wrapper.sh /usr/local/bin/git-verify-wrapper.sh
COPY --from=builder /usr/local/bin/ks /usr/local/bin/ks
COPY --from=builder /usr/local/bin/helm2 /usr/local/bin/helm2
COPY --from=builder /usr/local/bin/helm /usr/local/bin/helm
COPY --from=builder /usr/local/bin/kubectl /usr/local/bin/kubectl
COPY --from=builder /usr/local/bin/kustomize /usr/local/bin/kustomize
COPY --from=builder /usr/local/bin/aws-iam-authenticator /usr/local/bin/aws-iam-authenticator
# script to add current (possibly arbitrary) user to /etc/passwd at runtime
# (if it's not already there, to be openshift friendly)
COPY uid_entrypoint.sh /usr/local/bin/uid_entrypoint.sh
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
# keep uid_entrypoint.sh for backward compatibility
RUN ln -s /usr/local/bin/entrypoint.sh /usr/local/bin/uid_entrypoint.sh
# support for mounting configuration from a configmap
RUN mkdir -p /app/config/ssh && \
@@ -70,17 +71,21 @@ RUN mkdir -p /app/config/ssh && \
ln -s /app/config/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts
RUN mkdir -p /app/config/tls
RUN mkdir -p /app/config/gpg/source && \
mkdir -p /app/config/gpg/keys && \
chown argocd /app/config/gpg/keys && \
chmod 0700 /app/config/gpg/keys
# workaround ksonnet issue https://github.com/ksonnet/ksonnet/issues/298
ENV USER=argocd
USER argocd
USER 999
WORKDIR /home/argocd
####################################################################################################
# Argo CD UI stage
####################################################################################################
FROM node:11.15.0 as argocd-ui
FROM docker.io/library/node:12.18.4 as argocd-ui
WORKDIR /src
ADD ["ui/package.json", "ui/yarn.lock", "./"]
@@ -91,37 +96,42 @@ ADD ["ui/", "."]
ARG ARGO_VERSION=latest
ENV ARGO_VERSION=$ARGO_VERSION
RUN NODE_ENV='production' yarn build
RUN NODE_ENV='production' NODE_ONLINE_ENV='online' yarn build
####################################################################################################
# Argo CD Build stage which performs the actual build of Argo CD binaries
####################################################################################################
FROM golang:1.12.6 as argocd-build
FROM docker.io/library/golang:1.16.11 as argocd-build
COPY --from=builder /usr/local/bin/dep /usr/local/bin/dep
COPY --from=builder /usr/local/bin/packr /usr/local/bin/packr
WORKDIR /go/src/github.com/argoproj/argo-cd
# A dummy directory is created under $GOPATH/src/dummy so we are able to use dep
# to install all the packages of our dep lock file
COPY Gopkg.toml ${GOPATH}/src/dummy/Gopkg.toml
COPY Gopkg.lock ${GOPATH}/src/dummy/Gopkg.lock
COPY go.mod go.mod
COPY go.sum go.sum
RUN cd ${GOPATH}/src/dummy && \
dep ensure -vendor-only && \
mv vendor/* ${GOPATH}/src/ && \
rmdir vendor
RUN go mod download
# Perform the build
WORKDIR /go/src/github.com/argoproj/argo-cd
COPY . .
RUN make cli server controller repo-server argocd-util && \
make CLI_NAME=argocd-darwin-amd64 GOOS=darwin cli
COPY --from=argocd-ui /src/dist/app /go/src/github.com/argoproj/argo-cd/ui/dist/app
RUN make argocd-all
ARG BUILD_ALL_CLIS=true
RUN if [ "$BUILD_ALL_CLIS" = "true" ] ; then \
make BIN_NAME=argocd-darwin-amd64 GOOS=darwin argocd-all && \
make BIN_NAME=argocd-windows-amd64.exe GOOS=windows argocd-all \
; fi
####################################################################################################
# Final image
####################################################################################################
FROM argocd-base
COPY --from=argocd-build /go/src/github.com/argoproj/argo-cd/dist/argocd* /usr/local/bin/
COPY --from=argocd-ui ./src/dist/app /shared/app
USER root
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-cmp-server
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex
USER 999

View File

@@ -2,5 +2,13 @@
# argocd-dev
####################################################################################################
FROM argocd-base
COPY argocd* /usr/local/bin/
COPY --from=argocd-ui ./src/dist/app /shared/app
COPY argocd /usr/local/bin/
COPY argocd-darwin-amd64 /usr/local/bin/
COPY argocd-windows-amd64.exe /usr/local/bin/
USER root
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller
RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex
USER 999

2104
Gopkg.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,117 +0,0 @@
# Packages should only be added to the following list when we use them *outside* of our go code.
# (e.g. we want to build the binary to invoke as part of the build process, such as in
# generate-proto.sh). Normal use of golang packages should be added via `dep ensure`, and pinned
# with a [[constraint]] or [[override]] when version is important.
required = [
"github.com/golang/protobuf/protoc-gen-go",
"github.com/gogo/protobuf/protoc-gen-gofast",
"github.com/gogo/protobuf/protoc-gen-gogofast",
"k8s.io/code-generator/cmd/go-to-protobuf",
"k8s.io/kube-openapi/cmd/openapi-gen",
"github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway",
"github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger",
"golang.org/x/sync/errgroup",
]
[[constraint]]
name = "google.golang.org/grpc"
version = "1.15.0"
[[constraint]]
name = "github.com/gogo/protobuf"
version = "1.3.1"
# override github.com/grpc-ecosystem/go-grpc-middleware's constraint on master
[[override]]
name = "github.com/golang/protobuf"
version = "1.2.0"
[[constraint]]
name = "github.com/grpc-ecosystem/grpc-gateway"
version = "v1.3.1"
# prometheus does not believe in semversioning yet
[[constraint]]
name = "github.com/prometheus/client_golang"
revision = "7858729281ec582767b20e0d696b6041d995d5e0"
[[override]]
branch = "release-1.16"
name = "k8s.io/api"
[[override]]
branch = "release-1.16"
name = "k8s.io/kubernetes"
[[override]]
branch = "release-1.16"
name = "k8s.io/code-generator"
[[override]]
branch = "release-1.16"
name = "k8s.io/apimachinery"
[[override]]
branch = "release-1.16"
name = "k8s.io/apiextensions-apiserver"
[[override]]
branch = "release-1.16"
name = "k8s.io/apiserver"
[[override]]
branch = "release-1.16"
name = "k8s.io/kubectl"
[[override]]
branch = "release-1.16"
name = "k8s.io/cli-runtime"
[[override]]
version = "2.0.3"
name = "sigs.k8s.io/kustomize"
# ASCIIRenderer does not implement blackfriday.Renderer
[[override]]
name = "github.com/russross/blackfriday"
version = "1.5.2"
[[override]]
branch = "release-13.0"
name = "k8s.io/client-go"
[[override]]
name = "github.com/casbin/casbin"
version = "1.9.1"
[[constraint]]
name = "github.com/stretchr/testify"
version = "1.2.2"
[[constraint]]
name = "github.com/gobuffalo/packr"
version = "v1.11.0"
[[constraint]]
branch = "master"
name = "github.com/argoproj/pkg"
[[constraint]]
branch = "master"
name = "github.com/yudai/gojsondiff"
# Fixes: Could not introduce sigs.k8s.io/kustomize@v2.0.3, as it has a dependency on github.com/spf13/cobra with constraint ^0.0.2, which has no overlap with existing constraint 0.0.5 from (root)
[[override]]
name = "github.com/spf13/cobra"
revision = "0.0.5"
# TODO: move off of k8s.io/kube-openapi and use controller-tools for CRD spec generation
# (override argoproj/argo contraint on master)
[[override]]
revision = "30be4d16710ac61bce31eb28a01054596fe6a9f1"
name = "k8s.io/kube-openapi"
# jsonpatch replace operation does not apply: doc is missing key: /metadata/annotations
[[override]]
name = "github.com/evanphx/json-patch"
version = "v4.1.0"

448
Makefile
View File

@@ -1,18 +1,119 @@
PACKAGE=github.com/argoproj/argo-cd/common
PACKAGE=github.com/argoproj/argo-cd/v2/common
CURRENT_DIR=$(shell pwd)
DIST_DIR=${CURRENT_DIR}/dist
CLI_NAME=argocd
BIN_NAME=argocd
HOST_OS:=$(shell go env GOOS)
HOST_ARCH:=$(shell go env GOARCH)
VERSION=$(shell cat ${CURRENT_DIR}/VERSION)
BUILD_DATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
GIT_COMMIT=$(shell git rev-parse HEAD)
GIT_TAG=$(shell if [ -z "`git status --porcelain`" ]; then git describe --exact-match --tags HEAD 2>/dev/null; fi)
GIT_TREE_STATE=$(shell if [ -z "`git status --porcelain`" ]; then echo "clean" ; else echo "dirty"; fi)
PACKR_CMD=$(shell if [ "`which packr`" ]; then echo "packr"; else echo "go run vendor/github.com/gobuffalo/packr/packr/main.go"; fi)
VOLUME_MOUNT=$(shell [[ $(go env GOOS)=="darwin" ]] && echo ":delegated" || echo "")
VOLUME_MOUNT=$(shell if test "$(go env GOOS)" = "darwin"; then echo ":delegated"; elif test selinuxenabled; then echo ":delegated"; else echo ""; fi)
KUBECTL_VERSION=$(shell go list -m all | grep k8s.io/client-go | cut -d ' ' -f5)
define run-in-dev-tool
docker run --rm -it -u $(shell id -u) -e HOME=/home/user -v ${CURRENT_DIR}:/go/src/github.com/argoproj/argo-cd${VOLUME_MOUNT} -w /go/src/github.com/argoproj/argo-cd argocd-dev-tools bash -c "GOPATH=/go $(1)"
GOPATH?=$(shell if test -x `which go`; then go env GOPATH; else echo "$(HOME)/go"; fi)
GOCACHE?=$(HOME)/.cache/go-build
DOCKER_SRCDIR?=$(GOPATH)/src
DOCKER_WORKDIR?=/go/src/github.com/argoproj/argo-cd
ARGOCD_PROCFILE?=Procfile
# Strict mode has been disabled in latest versions of mkdocs-material.
# Thus pointing to the older image of mkdocs-material matching the version used by argo-cd.
MKDOCS_DOCKER_IMAGE?=squidfunk/mkdocs-material:4.1.1
MKDOCS_RUN_ARGS?=
# Configuration for building argocd-test-tools image
TEST_TOOLS_NAMESPACE?=
TEST_TOOLS_IMAGE=argocd-test-tools
TEST_TOOLS_TAG?=latest
ifdef TEST_TOOLS_NAMESPACE
TEST_TOOLS_PREFIX=${TEST_TOOLS_NAMESPACE}/
endif
# You can change the ports where ArgoCD components will be listening on by
# setting the appropriate environment variables before running make.
ARGOCD_E2E_APISERVER_PORT?=8080
ARGOCD_E2E_REPOSERVER_PORT?=8081
ARGOCD_E2E_REDIS_PORT?=6379
ARGOCD_E2E_DEX_PORT?=5556
ARGOCD_E2E_YARN_HOST?=localhost
ARGOCD_E2E_DISABLE_AUTH?=
ARGOCD_E2E_TEST_TIMEOUT?=20m
ARGOCD_IN_CI?=false
ARGOCD_TEST_E2E?=true
ARGOCD_LINT_GOGC?=20
# Depending on where we are (legacy or non-legacy pwd), we need to use
# different Docker volume mounts for our source tree
LEGACY_PATH=$(GOPATH)/src/github.com/argoproj/argo-cd
ifeq ("$(PWD)","$(LEGACY_PATH)")
DOCKER_SRC_MOUNT="$(DOCKER_SRCDIR):/go/src$(VOLUME_MOUNT)"
else
DOCKER_SRC_MOUNT="$(PWD):/go/src/github.com/argoproj/argo-cd$(VOLUME_MOUNT)"
endif
# Runs any command in the argocd-test-utils container in server mode
# Server mode container will start with uid 0 and drop privileges during runtime
define run-in-test-server
docker run --rm -it \
--name argocd-test-server \
-u $(shell id -u):$(shell id -g) \
-e USER_ID=$(shell id -u) \
-e HOME=/home/user \
-e GOPATH=/go \
-e GOCACHE=/tmp/go-build-cache \
-e ARGOCD_IN_CI=$(ARGOCD_IN_CI) \
-e ARGOCD_E2E_TEST=$(ARGOCD_E2E_TEST) \
-e ARGOCD_E2E_YARN_HOST=$(ARGOCD_E2E_YARN_HOST) \
-e ARGOCD_E2E_DISABLE_AUTH=$(ARGOCD_E2E_DISABLE_AUTH) \
-e ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} \
-e ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} \
-e ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} \
-v ${DOCKER_SRC_MOUNT} \
-v ${GOPATH}/pkg/mod:/go/pkg/mod${VOLUME_MOUNT} \
-v ${GOCACHE}:/tmp/go-build-cache${VOLUME_MOUNT} \
-v ${HOME}/.kube:/home/user/.kube${VOLUME_MOUNT} \
-v /tmp:/tmp${VOLUME_MOUNT} \
-w ${DOCKER_WORKDIR} \
-p ${ARGOCD_E2E_APISERVER_PORT}:8080 \
-p 4000:4000 \
-p 5000:5000 \
$(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE):$(TEST_TOOLS_TAG) \
bash -c "$(1)"
endef
# Runs any command in the argocd-test-utils container in client mode
define run-in-test-client
docker run --rm -it \
--name argocd-test-client \
-u $(shell id -u):$(shell id -g) \
-e HOME=/home/user \
-e GOPATH=/go \
-e ARGOCD_E2E_K3S=$(ARGOCD_E2E_K3S) \
-e GOCACHE=/tmp/go-build-cache \
-e ARGOCD_LINT_GOGC=$(ARGOCD_LINT_GOGC) \
-v ${DOCKER_SRC_MOUNT} \
-v ${GOPATH}/pkg/mod:/go/pkg/mod${VOLUME_MOUNT} \
-v ${GOCACHE}:/tmp/go-build-cache${VOLUME_MOUNT} \
-v ${HOME}/.kube:/home/user/.kube${VOLUME_MOUNT} \
-v /tmp:/tmp${VOLUME_MOUNT} \
-w ${DOCKER_WORKDIR} \
$(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE):$(TEST_TOOLS_TAG) \
bash -c "$(1)"
endef
#
define exec-in-test-server
docker exec -it -u $(shell id -u):$(shell id -g) -e ARGOCD_E2E_K3S=$(ARGOCD_E2E_K3S) argocd-test-server $(1)
endef
PATH:=$(PATH):$(PWD)/hack
@@ -24,12 +125,16 @@ IMAGE_NAMESPACE?=
STATIC_BUILD?=true
# build development images
DEV_IMAGE?=false
ARGOCD_GPG_ENABLED?=true
ARGOCD_E2E_APISERVER_PORT?=8080
override LDFLAGS += \
-X ${PACKAGE}.version=${VERSION} \
-X ${PACKAGE}.buildDate=${BUILD_DATE} \
-X ${PACKAGE}.gitCommit=${GIT_COMMIT} \
-X ${PACKAGE}.gitTreeState=${GIT_TREE_STATE}
-X ${PACKAGE}.gitTreeState=${GIT_TREE_STATE}\
-X ${PACKAGE}.gitTreeState=${GIT_TREE_STATE}\
-X ${PACKAGE}.kubectlVersion=${KUBECTL_VERSION}
ifeq (${STATIC_BUILD}, true)
override LDFLAGS += -extldflags "-static"
@@ -38,6 +143,8 @@ endif
ifneq (${GIT_TAG},)
IMAGE_TAG=${GIT_TAG}
LDFLAGS += -X ${PACKAGE}.gitTag=${GIT_TAG}
else
IMAGE_TAG?=latest
endif
ifeq (${DOCKER_PUSH},true)
@@ -51,73 +158,96 @@ IMAGE_PREFIX=${IMAGE_NAMESPACE}/
endif
.PHONY: all
all: cli image argocd-util
all: cli image
# We have some legacy requirements for being checked out within $GOPATH.
# The ensure-gopath target can be used as dependency to ensure we are running
# within these boundaries.
.PHONY: ensure-gopath
ensure-gopath:
ifneq ("$(PWD)","$(LEGACY_PATH)")
@echo "Due to legacy requirements for codegen, repository needs to be checked out within \$$GOPATH"
@echo "Location of this repo should be '$(LEGACY_PATH)' but is '$(PWD)'"
@exit 1
endif
.PHONY: gogen
gogen: ensure-gopath
export GO111MODULE=off
go generate ./util/argo/...
.PHONY: protogen
protogen:
protogen: ensure-gopath
export GO111MODULE=off
./hack/generate-proto.sh
.PHONY: openapigen
openapigen:
openapigen: ensure-gopath
export GO111MODULE=off
./hack/update-openapi.sh
.PHONY: clientgen
clientgen:
clientgen: ensure-gopath
export GO111MODULE=off
./hack/update-codegen.sh
.PHONY: clidocsgen
clidocsgen: ensure-gopath
go run tools/cmd-docs/main.go
.PHONY: codegen-local
codegen-local: protogen clientgen openapigen manifests-local
codegen-local: ensure-gopath mod-vendor-local gogen protogen clientgen openapigen clidocsgen manifests-local
rm -rf vendor/
.PHONY: codegen
codegen: dev-tools-image
$(call run-in-dev-tool,make codegen-local)
codegen: test-tools-image
$(call run-in-test-client,make codegen-local)
.PHONY: cli
cli: clean-debug
CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd/argocd
cli: test-tools-image
$(call run-in-test-client, GOOS=${HOST_OS} GOARCH=${HOST_ARCH} make cli-local)
.PHONY: cli-local
cli-local: clean-debug
CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd
.PHONY: release-cli
release-cli: clean-debug image
docker create --name tmp-argocd-linux $(IMAGE_PREFIX)argocd:$(IMAGE_TAG)
docker cp tmp-argocd-linux:/usr/local/bin/argocd ${DIST_DIR}/argocd-linux-amd64
docker cp tmp-argocd-linux:/usr/local/bin/argocd-darwin-amd64 ${DIST_DIR}/argocd-darwin-amd64
docker cp tmp-argocd-linux:/usr/local/bin/argocd-windows-amd64.exe ${DIST_DIR}/argocd-windows-amd64.exe
docker rm tmp-argocd-linux
.PHONY: argocd-util
argocd-util: clean-debug
# Build argocd-util as a statically linked binary, so it could run within the alpine-based dex container (argoproj/argo-cd#844)
CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-util ./cmd/argocd-util
.PHONY: dev-tools-image
dev-tools-image:
cd hack && docker build -t argocd-dev-tools . -f Dockerfile.dev-tools
.PHONY: test-tools-image
test-tools-image:
docker build --build-arg UID=$(shell id -u) -t $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE) -f test/container/Dockerfile .
docker tag $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE) $(TEST_TOOLS_PREFIX)$(TEST_TOOLS_IMAGE):$(TEST_TOOLS_TAG)
.PHONY: manifests-local
manifests-local:
./hack/update-manifests.sh
.PHONY: manifests
manifests: dev-tools-image
$(call run-in-dev-tool,make manifests-local IMAGE_TAG='${IMAGE_TAG}')
manifests: test-tools-image
$(call run-in-test-client,make manifests-local IMAGE_NAMESPACE='${IMAGE_NAMESPACE}' IMAGE_TAG='${IMAGE_TAG}')
# consolidated binary for cli, util, server, repo-server, controller
.PHONY: argocd-all
argocd-all: clean-debug
CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${BIN_NAME} ./cmd
# NOTE: we use packr to do the build instead of go, since we embed swagger files and policy.csv
# files into the go binary
.PHONY: server
server: clean-debug
CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-server ./cmd/argocd-server
CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-server ./cmd
.PHONY: repo-server
repo-server:
CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-repo-server ./cmd/argocd-repo-server
CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-repo-server ./cmd
.PHONY: controller
controller:
CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd/argocd-application-controller
.PHONY: packr
packr:
go build -o ${DIST_DIR}/packr ./vendor/github.com/gobuffalo/packr/packr/
CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd
.PHONY: image
ifeq ($(DEV_IMAGE), true)
@@ -125,15 +255,19 @@ ifeq ($(DEV_IMAGE), true)
# which speeds up builds. Dockerfile.dev needs to be copied into dist to perform the build, since
# the dist directory is under .dockerignore.
IMAGE_TAG="dev-$(shell git describe --always --dirty)"
image: packr
image:
docker build -t argocd-base --target argocd-base .
docker build -t argocd-ui --target argocd-ui .
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-server ./cmd/argocd-server
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd/argocd-application-controller
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-repo-server ./cmd/argocd-repo-server
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-util ./cmd/argocd-util
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd ./cmd/argocd
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-darwin-amd64 ./cmd/argocd
find ./ui/dist -type f -not -name gitkeep -delete
docker run -v ${CURRENT_DIR}/ui/dist/app:/tmp/app --rm -t argocd-ui sh -c 'cp -r ./dist/app/* /tmp/app/'
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd ./cmd
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-darwin-amd64 ./cmd
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-windows-amd64.exe ./cmd
ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-server
ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-application-controller
ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-repo-server
ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-cmp-server
ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-dex
cp Dockerfile.dev dist
docker build -t $(IMAGE_PREFIX)argocd:$(IMAGE_TAG) -f dist/Dockerfile.dev dist
else
@@ -142,56 +276,155 @@ image:
endif
@if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)argocd:$(IMAGE_TAG) ; fi
.PHONY: armimage
# The "BUILD_ALL_CLIS" argument is to skip building the CLIs for darwin and windows
# which would take a really long time.
armimage:
docker build -t $(IMAGE_PREFIX)argocd:$(IMAGE_TAG)-arm . --build-arg BUILD_ALL_CLIS="false"
.PHONY: builder-image
builder-image:
docker build -t $(IMAGE_PREFIX)argo-cd-ci-builder:$(IMAGE_TAG) --target builder .
@if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)argo-cd-ci-builder:$(IMAGE_TAG) ; fi
.PHONY: dep
dep:
dep ensure -v
.PHONY: mod-download
mod-download: test-tools-image
$(call run-in-test-client,go mod download)
.PHONY: dep-ensure
dep-ensure:
dep ensure -no-vendor
.PHONY: mod-download-local
mod-download-local:
go mod download && go mod tidy # go mod download changes go.sum https://github.com/golang/go/issues/42970
.PHONY: mod-vendor
mod-vendor: test-tools-image
$(call run-in-test-client,go mod vendor)
.PHONY: mod-vendor-local
mod-vendor-local: mod-download-local
go mod vendor
# Deprecated - replace by install-local-tools
.PHONY: install-lint-tools
install-lint-tools:
./hack/install.sh lint-tools
# Run linter on the code
.PHONY: lint
lint:
golangci-lint --version
golangci-lint run --fix --verbose
lint: test-tools-image
$(call run-in-test-client,make lint-local)
# Run linter on the code (local version)
.PHONY: lint-local
lint-local:
golangci-lint --version
# NOTE: If you get a "Killed" OOM message, try reducing the value of GOGC
# See https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint
GOGC=$(ARGOCD_LINT_GOGC) GOMAXPROCS=2 golangci-lint run --fix --verbose --timeout 300s
.PHONY: lint-ui
lint-ui: test-tools-image
$(call run-in-test-client,make lint-ui-local)
.PHONY: lint-ui-local
lint-ui-local:
cd ui && yarn lint
# Build all Go code
.PHONY: build
build:
build: test-tools-image
mkdir -p $(GOCACHE)
$(call run-in-test-client, make build-local)
# Build all Go code (local version)
.PHONY: build-local
build-local:
go build -v `go list ./... | grep -v 'resource_customizations\|test/e2e'`
# Run all unit tests
#
# If TEST_MODULE is set (to fully qualified module name), only this specific
# module will be tested.
.PHONY: test
test:
./hack/test.sh -coverprofile=coverage.out `go list ./... | grep -v 'test/e2e'`
test: test-tools-image
mkdir -p $(GOCACHE)
$(call run-in-test-client,make TEST_MODULE=$(TEST_MODULE) test-local)
# Run all unit tests (local version)
.PHONY: test-local
test-local:
if test "$(TEST_MODULE)" = ""; then \
./hack/test.sh -coverprofile=coverage.out `go list ./... | grep -v 'test/e2e'`; \
else \
./hack/test.sh -coverprofile=coverage.out "$(TEST_MODULE)"; \
fi
.PHONY: test-race
test-race: test-tools-image
mkdir -p $(GOCACHE)
$(call run-in-test-client,make TEST_MODULE=$(TEST_MODULE) test-race-local)
# Run all unit tests, with data race detection, skipping known failures (local version)
.PHONY: test-race-local
test-race-local:
if test "$(TEST_MODULE)" = ""; then \
./hack/test.sh -race -coverprofile=coverage.out `go list ./... | grep -v 'test/e2e'`; \
else \
./hack/test.sh -race -coverprofile=coverage.out "$(TEST_MODULE)"; \
fi
# Run the E2E test suite. E2E test servers (see start-e2e target) must be
# started before.
.PHONY: test-e2e
test-e2e:
./hack/test.sh -timeout 15m ./test/e2e
$(call exec-in-test-server,make test-e2e-local)
# Run the E2E test suite (local version)
.PHONY: test-e2e-local
test-e2e-local: cli-local
# NO_PROXY ensures all tests don't go out through a proxy if one is configured on the test system
export GO111MODULE=off
ARGOCD_GPG_ENABLED=true NO_PROXY=* ./hack/test.sh -timeout $(ARGOCD_E2E_TEST_TIMEOUT) -v ./test/e2e
# Spawns a shell in the test server container for debugging purposes
debug-test-server: test-tools-image
$(call run-in-test-server,/bin/bash)
# Spawns a shell in the test client container for debugging purposes
debug-test-client: test-tools-image
$(call run-in-test-client,/bin/bash)
# Starts e2e server in a container
.PHONY: start-e2e
start-e2e: cli
killall goreman || true
# check we can connect to Docker to start Redis
start-e2e: test-tools-image
docker version
mkdir -p ${GOCACHE}
$(call run-in-test-server,make ARGOCD_PROCFILE=test/container/Procfile start-e2e-local)
# Starts e2e server locally (or within a container)
.PHONY: start-e2e-local
start-e2e-local:
kubectl create ns argocd-e2e || true
kubectl config set-context --current --namespace=argocd-e2e
kustomize build test/manifests/base | kubectl apply -f -
# Create GPG keys and source directories
if test -d /tmp/argo-e2e/app/config/gpg; then rm -rf /tmp/argo-e2e/app/config/gpg/*; fi
mkdir -p /tmp/argo-e2e/app/config/gpg/keys && chmod 0700 /tmp/argo-e2e/app/config/gpg/keys
mkdir -p /tmp/argo-e2e/app/config/gpg/source && chmod 0700 /tmp/argo-e2e/app/config/gpg/source
mkdir -p /tmp/argo-e2e/app/config/plugin && chmod 0700 /tmp/argo-e2e/app/config/plugin
# set paths for locally managed ssh known hosts and tls certs data
ARGOCD_SSH_DATA_PATH=/tmp/argo-e2e/app/config/ssh \
ARGOCD_TLS_DATA_PATH=/tmp/argo-e2e/app/config/tls \
ARGOCD_GPG_DATA_PATH=/tmp/argo-e2e/app/config/gpg/source \
ARGOCD_GNUPGHOME=/tmp/argo-e2e/app/config/gpg/keys \
ARGOCD_GPG_ENABLED=$(ARGOCD_GPG_ENABLED) \
ARGOCD_PLUGINCONFIGFILEPATH=/tmp/argo-e2e/app/config/plugin \
ARGOCD_E2E_DISABLE_AUTH=false \
ARGOCD_ZJWT_FEATURE_FLAG=always \
goreman start
ARGOCD_IN_CI=$(ARGOCD_IN_CI) \
ARGOCD_E2E_TEST=true \
goreman -f $(ARGOCD_PROCFILE) start ${ARGOCD_START}
# Cleans VSCode debug.test files from sub-dirs to prevent them from being included in packr boxes
# Cleans VSCode debug.test files from sub-dirs to prevent them from being included in by golang embed
.PHONY: clean-debug
clean-debug:
-find ${CURRENT_DIR} -name debug.test | xargs rm -f
@@ -201,17 +434,39 @@ clean: clean-debug
-rm -rf ${CURRENT_DIR}/dist
.PHONY: start
start:
killall goreman || true
# check we can connect to Docker to start Redis
start: test-tools-image
docker version
kubectl create ns argocd || true
kubens argocd
ARGOCD_ZJWT_FEATURE_FLAG=always \
goreman start
$(call run-in-test-server,make ARGOCD_PROCFILE=test/container/Procfile start-local ARGOCD_START=${ARGOCD_START})
# Starts a local instance of ArgoCD
.PHONY: start-local
start-local: mod-vendor-local dep-ui-local
# check we can connect to Docker to start Redis
killall goreman || true
kubectl create ns argocd || true
rm -rf /tmp/argocd-local
mkdir -p /tmp/argocd-local
mkdir -p /tmp/argocd-local/gpg/keys && chmod 0700 /tmp/argocd-local/gpg/keys
mkdir -p /tmp/argocd-local/gpg/source
ARGOCD_ZJWT_FEATURE_FLAG=always \
ARGOCD_IN_CI=false \
ARGOCD_GPG_ENABLED=$(ARGOCD_GPG_ENABLED) \
ARGOCD_E2E_TEST=false \
goreman -f $(ARGOCD_PROCFILE) start ${ARGOCD_START}
# Run goreman start with exclude option , provide exclude env variable with list of services
.PHONY: run
run:
bash ./hack/goreman-start.sh
# Runs pre-commit validation with the virtualized toolchain
.PHONY: pre-commit
pre-commit: dep-ensure codegen build lint test
pre-commit: codegen build lint test
# Runs pre-commit validation with the local toolchain
.PHONY: pre-commit-local
pre-commit-local: codegen-local build-local lint-local test-local
.PHONY: release-precheck
release-precheck: manifests
@@ -222,19 +477,68 @@ release-precheck: manifests
.PHONY: release
release: pre-commit release-precheck image release-cli
.PHONY: build-docs-local
build-docs-local:
mkdocs build
.PHONY: build-docs
build-docs:
mkdocs build
docker run ${MKDOCS_RUN_ARGS} --rm -it -p 8000:8000 -v ${CURRENT_DIR}:/docs ${MKDOCS_DOCKER_IMAGE} build
.PHONY: serve-docs-local
serve-docs-local:
mkdocs serve
.PHONY: serve-docs
serve-docs:
mkdocs serve
docker run ${MKDOCS_RUN_ARGS} --rm -it -p 8000:8000 -v ${CURRENT_DIR}:/docs ${MKDOCS_DOCKER_IMAGE} serve -a 0.0.0.0:8000
.PHONY: lint-docs
lint-docs:
# https://github.com/dkhamsing/awesome_bot
find docs -name '*.md' -exec grep -l http {} + | xargs docker run --rm -v $(PWD):/mnt:ro dkhamsing/awesome_bot -t 3 --allow-dupe --allow-redirect --white-list `cat white-list | grep -v "#" | tr "\n" ','` --skip-save-results --
.PHONY: publish-docs
publish-docs: lint-docs
mkdocs gh-deploy
# Verify that kubectl can connect to your K8s cluster from Docker
.PHONY: verify-kube-connect
verify-kube-connect: test-tools-image
$(call run-in-test-client,kubectl version)
# Show the Go version of local and virtualized environments
.PHONY: show-go-version
show-go-version: test-tools-image
@echo -n "Local Go version: "
@go version
@echo -n "Docker Go version: "
$(call run-in-test-client,go version)
# Installs all tools required to build and test ArgoCD locally
.PHONY: install-tools-local
install-tools-local: install-test-tools-local install-codegen-tools-local install-go-tools-local
# Installs all tools required for running unit & end-to-end tests (Linux packages)
.PHONY: install-test-tools-local
install-test-tools-local:
./hack/install.sh kustomize-linux
./hack/install.sh ksonnet-linux
./hack/install.sh helm2-linux
./hack/install.sh helm-linux
# Installs all tools required for running codegen (Linux packages)
.PHONY: install-codegen-tools-local
install-codegen-tools-local:
./hack/install.sh codegen-tools
# Installs all tools required for running codegen (Go packages)
.PHONY: install-go-tools-local
install-go-tools-local:
./hack/install.sh codegen-go-tools
.PHONY: dep-ui
dep-ui: test-tools-image
$(call run-in-test-client,make dep-ui-local)
dep-ui-local:
cd ui && yarn install
start-test-k8s:
go run ./hack/k8s

19
OWNERS
View File

@@ -1,12 +1,23 @@
owners:
- alexec
- alexmt
- jessesuen
reviewers:
- jannfis
approvers:
- alexec
- alexmt
- jannfis
- jessesuen
- jgwest
- mayzhang2000
- rbreeze
reviewers:
- dthomson25
- tetchel
- wtam2018
- ishitasequeira
- reginapizza
- hblixt
- chetan-rns
- wanghong230
- pasha-codefresh

View File

@@ -1,7 +1,9 @@
controller: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true go run ./cmd/argocd-application-controller/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}"
api-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true go run ./cmd/argocd-server/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --staticassets ui/dist/app"
dex: sh -c "go run github.com/argoproj/argo-cd/cmd/argocd-util gendexcfg -o `pwd`/dist/dex.yaml && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml quay.io/dexidp/dex:v2.14.0 serve /dex.yaml"
redis: docker run --rm --name argocd-redis -i -p ${ARGOCD_E2E_REDIS_PORT:-6379}:${ARGOCD_E2E_REDIS_PORT:-6379} redis:5.0.3-alpine --save "" --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379}
repo-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true go run ./cmd/argocd-repo-server/main.go --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379}"
controller: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-application-controller go run ./cmd/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}"
api-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-server go run ./cmd/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} "
dex: sh -c "ARGOCD_BINARY_NAME=argocd-dex go run github.com/argoproj/argo-cd/v2/cmd gendexcfg -o `pwd`/dist/dex.yaml && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml ghcr.io/dexidp/dex:v2.30.2 dex serve /dex.yaml"
redis: bash -c "if [ \"$ARGOCD_REDIS_LOCAL\" == 'true' ]; then redis-server --save '' --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379}; else docker run --rm --name argocd-redis -i -p ${ARGOCD_E2E_REDIS_PORT:-6379}:${ARGOCD_E2E_REDIS_PORT:-6379} redis:6.2.6-alpine --save '' --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379}; fi"
repo-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_PLUGINSOCKFILEPATH=${ARGOCD_PLUGINSOCKFILEPATH:-/tmp/argo-e2e/app/config/plugin} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-repo-server ARGOCD_GPG_ENABLED=${ARGOCD_GPG_ENABLED:-false} go run ./cmd/main.go --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379}"
ui: sh -c 'cd ui && ${ARGOCD_E2E_YARN_CMD:-yarn} start'
git-server: test/fixture/testrepos/start-git.sh
helm-registry: test/fixture/testrepos/start-helm-registry.sh
dev-mounter: [[ "$ARGOCD_E2E_TEST" != "true" ]] && go run hack/dev-mounter/main.go --configmap argocd-ssh-known-hosts-cm=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} --configmap argocd-tls-certs-cm=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} --configmap argocd-gpg-keys-cm=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source}

103
README.md
View File

@@ -1,6 +1,8 @@
[![Integration tests](https://github.com/argoproj/argo-cd/workflows/Integration%20tests/badge.svg?branch=master)](https://github.com/argoproj/argo-cd/actions?query=workflow%3A%22Integration+tests%22)
[![slack](https://img.shields.io/badge/slack-argoproj-brightgreen.svg?logo=slack)](https://argoproj.github.io/community/join-slack)
[![codecov](https://codecov.io/gh/argoproj/argo-cd/branch/master/graph/badge.svg)](https://codecov.io/gh/argoproj/argo-cd)
[![Release Version](https://img.shields.io/github/v/release/argoproj/argo-cd?label=argo-cd)](https://github.com/argoproj/argo-cd/releases/latest)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4486/badge)](https://bestpractices.coreinfrastructure.org/projects/4486)
# Argo CD - Declarative Continuous Delivery for Kubernetes
@@ -10,78 +12,63 @@ Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
![Argo CD UI](docs/assets/argocd-ui.gif)
[![Argo CD Demo](https://img.youtube.com/vi/0WAm0y2vLIo/0.jpg)](https://youtu.be/0WAm0y2vLIo)
## Why Argo CD?
Application definitions, configurations, and environments should be declarative and version controlled.
Application deployment and lifecycle management should be automated, auditable, and easy to understand.
1. Application definitions, configurations, and environments should be declarative and version controlled.
1. Application deployment and lifecycle management should be automated, auditable, and easy to understand.
## Who uses Argo CD?
Organizations below are **officially** using Argo CD. Please send a PR with your organization name if you are using Argo CD.
1. [127Labs](https://127labs.com/)
1. [Adevinta](https://www.adevinta.com/)
1. [ANSTO - Australian Synchrotron](https://www.synchrotron.org.au/)
1. [ARZ Allgemeines Rechenzentrum GmbH ](https://www.arz.at/)
1. [Baloise](https://www.baloise.com)
1. [BioBox Analytics](https://biobox.io)
1. [CARFAX](https://www.carfax.com)
1. [Celonis](https://www.celonis.com/)
1. [Codility](https://www.codility.com/)
1. [Commonbond](https://commonbond.co/)
1. [CyberAgent](https://www.cyberagent.co.jp/en/)
1. [Cybozu](https://cybozu-global.com)
1. [EDF Renewables](https://www.edf-re.com/)
1. [Elium](https://www.elium.com)
1. [END.](https://www.endclothing.com/)
1. [Fave](https://myfave.com)
1. [Future PLC](https://www.futureplc.com/)
1. [GMETRI](https://gmetri.com/)
1. [hipages](https://hipages.com.au/)
1. [Intuit](https://www.intuit.com/)
1. [KintoHub](https://www.kintohub.com/)
1. [KompiTech GmbH](https://www.kompitech.com/)
1. [Lytt](https://www.lytt.co/)
1. [Major League Baseball](https://mlb.com)
1. [Mambu](https://www.mambu.com/)
1. [Max Kelsen](https://www.maxkelsen.com/)
1. [Mirantis](https://mirantis.com/)
1. [OpenSaaS Studio](https://opensaas.studio)
1. [Optoro](https://www.optoro.com/)
1. [Peloton Interactive](https://www.onepeloton.com/)
1. [Pipefy](https://www.pipefy.com/)
1. [Riskified](https://www.riskified.com/)
1. [Red Hat](https://www.redhat.com/)
1. [Saildrone](https://www.saildrone.com/)
1. [Saloodo! GmbH](https://www.saloodo.com)
1. [Syncier](https://syncier.com/)
1. [Tesla](https://tesla.com/)
1. [Tiger Analytics](https://www.tigeranalytics.com/)
1. [tZERO](https://www.tzero.com/)
1. [Ticketmaster](https://ticketmaster.com)
1. [Twilio SendGrid](https://sendgrid.com)
1. [Yieldlab](https://www.yieldlab.de/)
1. [UBIO](https://ub.io/)
1. [Universidad Mesoamericana](https://www.umes.edu.gt/)
1. [Viaduct](https://www.viaduct.ai/)
1. [Volvo Cars](https://www.volvocars.com/)
1. [Walkbase](https://www.walkbase.com/)
[Official Argo CD user list](USERS.md)
## Documentation
To learn more about Argo CD [go to the complete documentation](https://argoproj.github.io/argo-cd/).
To learn more about Argo CD [go to the complete documentation](https://argo-cd.readthedocs.io/).
Check live demo at https://cd.apps.argoproj.io/.
## Community Blogs and Presentations
## Community
### Contribution, Discussion and Support
You can reach the Argo CD community and developers via the following channels:
* Q & A : [Github Discussions](https://github.com/argoproj/argo-cd/discussions)
* Chat : [The #argo-cd Slack channel](https://argoproj.github.io/community/join-slack)
* Contributors Office Hours: [Every Thursday](https://calendar.google.com/calendar/u/0/embed?src=argoproj@gmail.com) | [Agenda](https://docs.google.com/document/d/1ttgw98MO45Dq7ZUHpIiOIEfbyeitKHNfMjbY5dLLMKQ)
* User Community meeting: [Every other Wednesday](https://calendar.google.com/calendar/u/0/embed?src=argoproj@gmail.com) | [Agenda](https://docs.google.com/document/d/1xkoFkVviB70YBzSEa4bDnu-rUZ1sIFtwKKG1Uw8XsY8)
Participation in the Argo CD project is governed by the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md)
### Blogs and Presentations
1. [Awesome-Argo: A Curated List of Awesome Projects and Resources Related to Argo](https://github.com/terrytangyuan/awesome-argo)
1. [GitOps Without Pipelines With ArgoCD Image Updater](https://youtu.be/avPUQin9kzU)
1. [Combining Argo CD (GitOps), Crossplane (Control Plane), And KubeVela (OAM)](https://youtu.be/eEcgn_gU3SM)
1. [How to Apply GitOps to Everything - Combining Argo CD and Crossplane](https://youtu.be/yrj4lmScKHQ)
1. [Couchbase - How To Run a Database Cluster in Kubernetes Using Argo CD](https://youtu.be/nkPoPaVzExY)
1. [Automation of Everything - How To Combine Argo Events, Workflows & Pipelines, CD, and Rollouts](https://youtu.be/XNXJtxkUKeY)
1. [Environments Based On Pull Requests (PRs): Using Argo CD To Apply GitOps Principles On Previews](https://youtu.be/cpAaI8p4R60)
1. [Argo CD: Applying GitOps Principles To Manage Production Environment In Kubernetes](https://youtu.be/vpWQeoaiRM4)
1. [Creating Temporary Preview Environments Based On Pull Requests With Argo CD And Codefresh](https://codefresh.io/continuous-deployment/creating-temporary-preview-environments-based-pull-requests-argo-cd-codefresh/)
1. [Tutorial: Everything You Need To Become A GitOps Ninja](https://www.youtube.com/watch?v=r50tRQjisxw) 90m tutorial on GitOps and Argo CD.
1. [Comparison of Argo CD, Spinnaker, Jenkins X, and Tekton](https://www.inovex.de/blog/spinnaker-vs-argo-cd-vs-tekton-vs-jenkins-x/)
1. [Simplify and Automate Deployments Using GitOps with IBM Multicloud Manager 3.1.2](https://medium.com/ibm-cloud/simplify-and-automate-deployments-using-gitops-with-ibm-multicloud-manager-3-1-2-4395af317359)
1. [GitOps for Kubeflow using Argo CD](https://www.kubeflow.org/docs/use-cases/gitops-for-kubeflow/)
1. [Simplify and Automate Deployments Using GitOps with IBM Multicloud Manager 3.1.2](https://www.ibm.com/cloud/blog/simplify-and-automate-deployments-using-gitops-with-ibm-multicloud-manager-3-1-2)
1. [GitOps for Kubeflow using Argo CD](https://v0-6.kubeflow.org/docs/use-cases/gitops-for-kubeflow/)
1. [GitOps Toolsets on Kubernetes with CircleCI and Argo CD](https://www.digitalocean.com/community/tutorials/webinar-series-gitops-tool-sets-on-kubernetes-with-circleci-and-argo-cd)
1. [Simplify and Automate Deployments Using GitOps with IBM Multicloud Manager](https://www.ibm.com/blogs/bluemix/2019/02/simplify-and-automate-deployments-using-gitops-with-ibm-multicloud-manager-3-1-2/)
1. [CI/CD in Light Speed with K8s and Argo CD](https://www.youtube.com/watch?v=OdzH82VpMwI&feature=youtu.be)
1. [Machine Learning as Code](https://www.youtube.com/watch?v=VXrGp5er1ZE&t=0s&index=135&list=PLj6h78yzYM2PZf9eA7bhWnIh_mK1vyOfU). Among other things, describes how Kubeflow uses Argo CD to implement GitOPs for ML
1. [Argo CD - GitOps Continuous Delivery for Kubernetes](https://www.youtube.com/watch?v=aWDIQMbp1cc&feature=youtu.be&t=1m4s)
1. [Introduction to Argo CD : Kubernetes DevOps CI/CD](https://www.youtube.com/watch?v=2WSJF7d8dUg&feature=youtu.be)
1. [GitOps Deployment and Kubernetes - using Argo CD](https://medium.com/riskified-technology/gitops-deployment-and-kubernetes-f1ab289efa4b)
1. [Deploy Argo CD with Ingress and TLS in Three Steps: No YAML Yak Shaving Required](https://itnext.io/deploy-argo-cd-with-ingress-and-tls-in-three-steps-no-yaml-yak-shaving-required-bc536d401491)
1. [GitOps Continuous Delivery with Argo and Codefresh](https://codefresh.io/events/cncf-member-webinar-gitops-continuous-delivery-argo-codefresh/)
1. [Stay up to date with Argo CD and Renovate](https://mjpitz.com/blog/2020/12/03/renovate-your-gitops/)
1. [Setting up Argo CD with Helm](https://www.arthurkoziel.com/setting-up-argocd-with-helm/)
1. [Applied GitOps with Argo CD](https://thenewstack.io/applied-gitops-with-argocd/)
1. [Solving configuration drift using GitOps with Argo CD](https://www.cncf.io/blog/2020/12/17/solving-configuration-drift-using-gitops-with-argo-cd/)
1. [Decentralized GitOps over environments](https://blogs.sap.com/2021/05/06/decentralized-gitops-over-environments/)
1. [How GitOps and Operators mark the rise of Infrastructure-As-Software](https://paytmlabs.com/blog/2021/10/how-to-improve-operational-work-with-operators-and-gitops/)

66
SECURITY.md Normal file
View File

@@ -0,0 +1,66 @@
# Security Policy for Argo CD
Version: **v1.2 (2020-08-07)**
## Preface
As a deployment tool, Argo CD needs to have production access which makes
security a very important topic. The Argoproj team takes security very
seriously and is continuously working on improving it.
## A word about security scanners
Many organisations these days employ security scanners to validate their
container images before letting them on their clusters, and that is a good
thing. However, the quality and results of these scanners vary greatly,
many of them produce false positives and require people to look at the
issues reported and validate them for correctness. A great example of that
is, that some scanners report kernel vulnerabilities for container images
just because they are derived from some distribution.
We kindly ask you to not raise issues or contact us regarding any issues
that are found by your security scanner. Many of those produce a lot of false
positives, and many of these issues don't affect Argo CD. We do have scanners
in place for our code, dependencies and container images that we publish. We
are well aware of the issues that may affect Argo CD and are constantly
working on the remediation of those that affect Argo CD and our users.
If you believe that we might have missed an issue that we should take a look
at (that can happen), then please discuss it with us. But please, do validate
that assumption before at least roughly.
## Supported Versions
We currently support the most recent release (`N`, e.g. `1.8`) and the release
previous to the most recent one (`N-1`, e.g. `1.7`). With the release of
`N+1`, `N-1` drops out of support and `N` becomes `N-1`.
We regularly perform patch releases (e.g. `1.8.5` and `1.7.12`) for the
supported versions, which will contain fixes for security vulnerabilities and
important bugs. Prior releases might receive critical security fixes on a best
effort basis, however, it cannot be guaranteed that security fixes get
back-ported to these unsupported versions.
In rare cases, where a security fix needs complex re-design of a feature or is
otherwise very intrusive, and there's a workaround available, we may decide to
provide a forward-fix only, e.g. to be released the next minor release, instead
of releasing it within a patch branch for the currently supported releases.
## Reporting a Vulnerability
If you find a security related bug in ArgoCD, we kindly ask you for responsible
disclosure and for giving us appropriate time to react, analyze and develop a
fix to mitigate the found security vulnerability.
We will do our best to react quickly on your inquiry, and to coordinate a fix
and disclosure with you. Sometimes, it might take a little longer for us to
react (e.g. out of office conditions), so please bear with us in these cases.
We will publish security advisiories using the
[Git Hub Security Advisories](https://github.com/argoproj/argo-cd/security/advisories)
feature to keep our community well informed, and will credit you for your
findings (unless you prefer to stay anonymous, of course).
Please report vulnerabilities by e-mail to the following address:
* cncf-argo-security@lists.cncf.io

8
SECURITY_CONTACTS Normal file
View File

@@ -0,0 +1,8 @@
# Defined below are the security contacts for this repo.
#
# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE
# INSTRUCTIONS AT https://argo-cd.readthedocs.io/en/latest/security_considerations/#reporting-vulnerabilities
alexmt
edlee2121
jessesuen

180
USERS.md Normal file
View File

@@ -0,0 +1,180 @@
## Who uses Argo CD?
As the Argo Community grows, we'd like to keep track of our users. Please send a PR with your organization name if you are using Argo CD.
Currently, the following organizations are **officially** using Argo CD:
1. [127Labs](https://127labs.com/)
1. [3Rein](https://www.3rein.com/)
1. [7shifts](https://www.7shifts.com/)
1. [Adevinta](https://www.adevinta.com/)
1. [Adventure](https://jp.adventurekk.com/)
1. [Akuity](https://akuity.io/)
1. [Alibaba Group](https://www.alibabagroup.com/)
1. [Ambassador Labs](https://www.getambassador.io/)
1. [Ant Group](https://www.antgroup.com/)
1. [ANSTO - Australian Synchrotron](https://www.synchrotron.org.au/)
1. [AppDirect](https://www.appdirect.com)
1. [Arctiq Inc.](https://www.arctiq.ca)
1. [ARZ Allgemeines Rechenzentrum GmbH ](https://www.arz.at/)
1. [Axual B.V.](https://axual.com)
1. [Baloise](https://www.baloise.com)
1. [BCDevExchange DevOps Platform](https://bcdevexchange.org/DevOpsPlatform)
1. [Beat](https://thebeat.co/en/)
1. [Beez Innovation Labs](https://www.beezlabs.com/)
1. [BioBox Analytics](https://biobox.io)
1. [BigPanda](https://bigpanda.io)
1. [BMW Group](https://www.bmwgroup.com/)
1. [Camptocamp](https://camptocamp.com)
1. [Capital One](https://www.capitalone.com)
1. [CARFAX](https://www.carfax.com)
1. [Celonis](https://www.celonis.com/)
1. [Chime](https://www.chime.com)
1. [Codefresh](https://www.codefresh.io/)
1. [Codility](https://www.codility.com/)
1. [Commonbond](https://commonbond.co/)
1. [Crédit Agricole CIB](https://www.ca-cib.com)
1. [CROZ d.o.o.](https://croz.net/)
1. [CyberAgent](https://www.cyberagent.co.jp/en/)
1. [Cybozu](https://cybozu-global.com)
1. [Chargetrip](https://chargetrip.com)
1. [D2iQ](https://www.d2iq.com)
1. [Devtron Labs](https://github.com/devtron-labs/devtron)
1. [EDF Renewables](https://www.edf-re.com/)
1. [edX](https://edx.org)
1. [Electronic Arts Inc. ](https://www.ea.com)
1. [Elium](https://www.elium.com)
1. [END.](https://www.endclothing.com/)
1. [Energisme](https://energisme.com/)
1. [Fave](https://myfave.com)
1. [Future PLC](https://www.futureplc.com/)
1. [Garner](https://www.garnercorp.com)
1. [G DATA CyberDefense AG](https://www.gdata-software.com/)
1. [Generali Deutschland AG](https://www.generali.de/)
1. [Gitpod](https://www.gitpod.io)
1. [Glovo](https://www.glovoapp.com)
1. [GMETRI](https://gmetri.com/)
1. [Gojek](https://www.gojek.io/)
1. [Greenpass](https://www.greenpass.com.br/)
1. [Handelsbanken](https://www.handelsbanken.se)
1. [Healy](https://www.healyworld.net)
1. [hipages](https://hipages.com.au/)
1. [Hiya](https://hiya.com)
1. [Honestbank](https://honestbank.com)
1. [IBM](https://www.ibm.com/)
1. [IITS-Consulting](https://iits-consulting.de)
1. [Index Exchange](https://www.indexexchange.com/)
1. [InsideBoard](https://www.insideboard.com)
1. [Intuit](https://www.intuit.com/)
1. [Joblift](https://joblift.com/)
1. [JovianX](https://www.jovianx.com/)
1. [Karrot](https://www.daangn.com/)
1. [KarrotPay](https://www.daangnpay.com/)
1. [Kasa](https://kasa.co.kr/)
1. [Keptn](https://keptn.sh)
1. [Kinguin](https://www.kinguin.net/)
1. [KintoHub](https://www.kintohub.com/)
1. [KompiTech GmbH](https://www.kompitech.com/)
1. [LexisNexis](https://www.lexisnexis.com/)
1. [LINE](https://linecorp.com/en/)
1. [Lytt](https://www.lytt.co/)
1. [Major League Baseball](https://mlb.com)
1. [Mambu](https://www.mambu.com/)
1. [Mattermost](https://www.mattermost.com)
1. [Max Kelsen](https://www.maxkelsen.com/)
1. [MindSpore](https://mindspore.cn)
1. [Mirantis](https://mirantis.com/)
1. [mixi Group](https://mixi.co.jp/)
1. [Moengage](https://www.moengage.com/)
1. [Money Forward](https://corp.moneyforward.com/en/)
1. [MOO Print](https://www.moo.com/)
1. [MTN Group](https://www.mtn.com/)
1. [Natura &Co](https://naturaeco.com/)
1. [New Relic](https://newrelic.com/)
1. [Nextdoor](https://nextdoor.com/)
1. [Nikkei](https://www.nikkei.co.jp/nikkeiinfo/en/)
1. [Octadesk](https://octadesk.com)
1. [openEuler](https://openeuler.org)
1. [openGauss](https://opengauss.org/)
1. [openLooKeng](https://openlookeng.io)
1. [OpenSaaS Studio](https://opensaas.studio)
1. [Opensurvey](https://www.opensurvey.co.kr/)
1. [Optoro](https://www.optoro.com/)
1. [Orbital Insight](https://orbitalinsight.com/)
1. [Packlink](https://www.packlink.com/)
1. [PayPay](https://paypay.ne.jp/)
1. [Peloton Interactive](https://www.onepeloton.com/)
1. [Pipefy](https://www.pipefy.com/)
1. [Polarpoint.io](https://polarpoint.io)
1. [Preferred Networks](https://preferred.jp/en/)
1. [Prudential](https://prudential.com.sg)
1. [PUBG](https://www.pubg.com)
1. [Qonto](https://qonto.com)
1. [QuintoAndar](https://quintoandar.com.br)
1. [Quipper](https://www.quipper.com/)
1. [Recreation.gov](https://www.recreation.gov/)
1. [Red Hat](https://www.redhat.com/)
1. [Riskified](https://www.riskified.com/)
1. [Robotinfra](https://www.robotinfra.com)
1. [Saildrone](https://www.saildrone.com/)
1. [Saloodo! GmbH](https://www.saloodo.com)
1. [Schwarz IT](https://jobs.schwarz/it-mission)
1. [Snyk](https://snyk.io/)
1. [Speee](https://speee.jp/)
1. [Spendesk](https://spendesk.com/)
1. [Sumo Logic](https://sumologic.com/)
1. [Sutpc](http://www.sutpc.com/)
1. [Swisscom](https://www.swisscom.ch)
1. [Swissquote](https://github.com/swissquote)
1. [Syncier](https://syncier.com/)
1. [TableCheck](https://tablecheck.com/)
1. [Tailor Brands](https://www.tailorbrands.com)
1. [Tesla](https://tesla.com/)
1. [ThousandEyes](https://www.thousandeyes.com/)
1. [Ticketmaster](https://ticketmaster.com)
1. [Tiger Analytics](https://www.tigeranalytics.com/)
1. [Tigera](https://www.tigera.io/)
1. [Toss](https://toss.im/en)
1. [tru.ID](https://tru.id)
1. [Twilio SendGrid](https://sendgrid.com)
1. [tZERO](https://www.tzero.com/)
1. [ungleich.ch](https://ungleich.ch/)
1. [UBIO](https://ub.io/)
1. [UFirstGroup](https://www.ufirstgroup.com/en/)
1. [Universidad Mesoamericana](https://www.umes.edu.gt/)
1. [Viaduct](https://www.viaduct.ai/)
1. [Virtuo](https://www.govirtuo.com/)
1. [VISITS Technologies](https://visits.world/en)
1. [Volvo Cars](https://www.volvocars.com/)
1. [VSHN - The DevOps Company](https://vshn.ch/)
1. [Walkbase](https://www.walkbase.com/)
1. [Wehkamp](https://www.wehkamp.nl/)
1. [WeMo Scooter](https://www.wemoscooter.com/)
1. [Webstores](https://www.webstores.nl)
1. [Whitehat Berlin](https://whitehat.berlin) by Guido Maria Serra +Fenaroli
1. [Witick](https://witick.io/)
1. [WooliesX](https://wooliesx.com.au/)
1. [Woolworths Group](https://www.woolworthsgroup.com.au/)
1. [WSpot](https://www.wspot.com.br/)
1. [Yieldlab](https://www.yieldlab.de/)
1. [Zimpler](https://www.zimpler.com/)
1. [Sap Labs](http://sap.com)
1. [Smilee.io](https://smilee.io)
1. [Metanet](http://www.metanet.co.kr/en/)
1. [Unifonic Inc](https://www.unifonic.com/)
1. [Tamkeen Technologies](https://tamkeentech.sa/)
1. [Kaltura](https://corp.kaltura.com/)
1. [Boticario](https://www.boticario.com.br/)
1. [Beleza Na Web](https://www.belezanaweb.com.br/)
1. [MariaDB](https://mariadb.com)
1. [Lightricks](https://www.lightricks.com/)
1. [RightRev](https://rightrev.com/)
1. [MeDirect](https://medirect.com.mt/)
1. [Snapp](https://snapp.ir/)
1. [Technacy](https://www.technacy.it/)
1. [freee](https://corp.freee.co.jp/en/company/)
1. [Youverify](https://youverify.co/)
1. [Keeeb](https://www.keeeb.com/)
1. [p3r](https://www.p3r.one/)
1. [Faro](https://www.faro.com/)
1. [Rise](https://www.risecard.eu/)

View File

@@ -1 +1 @@
1.4.0
2.2.9

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -11,6 +11,8 @@ p, role:readonly, certificates, get, *, allow
p, role:readonly, clusters, get, *, allow
p, role:readonly, repositories, get, *, allow
p, role:readonly, projects, get, *, allow
p, role:readonly, accounts, get, *, allow
p, role:readonly, gpgkeys, get, *, allow
p, role:admin, applications, create, */*, allow
p, role:admin, applications, update, */*, allow
@@ -30,6 +32,9 @@ p, role:admin, repositories, delete, *, allow
p, role:admin, projects, create, *, allow
p, role:admin, projects, update, *, allow
p, role:admin, projects, delete, *, allow
p, role:admin, accounts, update, *, allow
p, role:admin, gpgkeys, create, *, allow
p, role:admin, gpgkeys, delete, *, allow
g, role:admin, role:readonly
g, admin, role:admin
1 # Built-in policy which defines two roles: role:readonly and role:admin,
11 p, role:readonly, repositories, get, *, allow
12 p, role:readonly, projects, get, *, allow
13 p, role:admin, applications, create, */*, allow p, role:readonly, accounts, get, *, allow
14 p, role:readonly, gpgkeys, get, *, allow
15 p, role:admin, applications, create, */*, allow
16 p, role:admin, applications, update, */*, allow
17 p, role:admin, applications, delete, */*, allow
18 p, role:admin, applications, sync, */*, allow
32 p, role:admin, projects, delete, *, allow
33 g, role:admin, role:readonly p, role:admin, accounts, update, *, allow
34 g, admin, role:admin p, role:admin, gpgkeys, create, *, allow
35 p, role:admin, gpgkeys, delete, *, allow
36 g, role:admin, role:readonly
37 g, admin, role:admin
38
39
40

7
assets/embed.go Normal file
View File

@@ -0,0 +1,7 @@
package assets
import "embed"
// Embedded contains embedded assets
//go:embed *
var Embedded embed.FS

View File

@@ -11,4 +11,4 @@ g = _, _
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.res, p.res) && keyMatch(r.act, p.act) && keyMatch(r.obj, p.obj)
m = g(r.sub, p.sub) && globOrRegexMatch(r.res, p.res) && globOrRegexMatch(r.act, p.act) && globOrRegexMatch(r.obj, p.obj)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,190 @@
package commands
import (
"context"
"fmt"
"math"
"time"
"github.com/argoproj/pkg/stats"
"github.com/go-redis/redis/v8"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/controller"
"github.com/argoproj/argo-cd/v2/controller/sharding"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
cacheutil "github.com/argoproj/argo-cd/v2/util/cache"
appstatecache "github.com/argoproj/argo-cd/v2/util/cache/appstate"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/env"
"github.com/argoproj/argo-cd/v2/util/errors"
kubeutil "github.com/argoproj/argo-cd/v2/util/kube"
"github.com/argoproj/argo-cd/v2/util/settings"
"github.com/argoproj/argo-cd/v2/util/tls"
)
const (
// CLIName is the name of the CLI
cliName = "argocd-application-controller"
// Default time in seconds for application resync period
defaultAppResyncPeriod = 180
)
func NewCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
appResyncPeriod int64
repoServerAddress string
repoServerTimeoutSeconds int
selfHealTimeoutSeconds int
statusProcessors int
operationProcessors int
glogLevel int
metricsPort int
metricsCacheExpiration time.Duration
metricsAplicationLabels []string
kubectlParallelismLimit int64
cacheSrc func() (*appstatecache.Cache, error)
redisClient *redis.Client
repoServerPlaintext bool
repoServerStrictTLS bool
)
var command = cobra.Command{
Use: cliName,
Short: "Run ArgoCD Application Controller",
Long: "ArgoCD application controller is a Kubernetes controller that continuously monitors running applications and compares the current, live state against the desired target state (as specified in the repo). This command runs Application Controller in the foreground. It can be configured by following options.",
DisableAutoGenTag: true,
RunE: func(c *cobra.Command, args []string) error {
cli.SetLogFormat(cmdutil.LogFormat)
cli.SetLogLevel(cmdutil.LogLevel)
cli.SetGLogLevel(glogLevel)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
errors.CheckError(v1alpha1.SetK8SConfigDefaults(config))
kubeClient := kubernetes.NewForConfigOrDie(config)
appClient := appclientset.NewForConfigOrDie(config)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
var resyncDuration time.Duration
if appResyncPeriod == 0 {
// Re-sync should be disabled if period is 0. Set duration to a very long duration
resyncDuration = time.Hour * 24 * 365 * 100
} else {
resyncDuration = time.Duration(appResyncPeriod) * time.Second
}
tlsConfig := apiclient.TLSConfiguration{
DisableTLS: repoServerPlaintext,
StrictValidation: repoServerStrictTLS,
}
// Load CA information to use for validating connections to the
// repository server, if strict TLS validation was requested.
if !repoServerPlaintext && repoServerStrictTLS {
pool, err := tls.LoadX509CertPool(
fmt.Sprintf("%s/controller/tls/tls.crt", env.StringFromEnv(common.EnvAppConfigPath, common.DefaultAppConfigPath)),
fmt.Sprintf("%s/controller/tls/ca.crt", env.StringFromEnv(common.EnvAppConfigPath, common.DefaultAppConfigPath)),
)
if err != nil {
log.Fatalf("%v", err)
}
tlsConfig.Certificates = pool
}
repoClientset := apiclient.NewRepoServerClientset(repoServerAddress, repoServerTimeoutSeconds, tlsConfig)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
cache, err := cacheSrc()
errors.CheckError(err)
cache.Cache.SetClient(cacheutil.NewTwoLevelClient(cache.Cache.GetClient(), 10*time.Minute))
var appController *controller.ApplicationController
settingsMgr := settings.NewSettingsManager(ctx, kubeClient, namespace, settings.WithRepoOrClusterChangedHandler(func() {
appController.InvalidateProjectsCache()
}))
kubectl := kubeutil.NewKubectl()
clusterFilter := getClusterFilter()
appController, err = controller.NewApplicationController(
namespace,
settingsMgr,
kubeClient,
appClient,
repoClientset,
cache,
kubectl,
resyncDuration,
time.Duration(selfHealTimeoutSeconds)*time.Second,
metricsPort,
metricsCacheExpiration,
metricsAplicationLabels,
kubectlParallelismLimit,
clusterFilter)
errors.CheckError(err)
cacheutil.CollectMetrics(redisClient, appController.GetMetricsServer())
vers := common.GetVersion()
log.Infof("Application Controller (version: %s, built: %s) starting (namespace: %s)", vers.Version, vers.BuildDate, namespace)
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
go appController.Run(ctx, statusProcessors, operationProcessors)
// Wait forever
select {}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().Int64Var(&appResyncPeriod, "app-resync", int64(env.ParseDurationFromEnv("ARGOCD_RECONCILIATION_TIMEOUT", defaultAppResyncPeriod*time.Second, 0, math.MaxInt64).Seconds()), "Time period in seconds for application resync.")
command.Flags().StringVar(&repoServerAddress, "repo-server", env.StringFromEnv("ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER", common.DefaultRepoServerAddr), "Repo server address.")
command.Flags().IntVar(&repoServerTimeoutSeconds, "repo-server-timeout-seconds", env.ParseNumFromEnv("ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS", 60, 0, math.MaxInt64), "Repo server RPC call timeout seconds.")
command.Flags().IntVar(&statusProcessors, "status-processors", env.ParseNumFromEnv("ARGOCD_APPLICATION_CONTROLLER_STATUS_PROCESSORS", 20, 0, math.MaxInt32), "Number of application status processors")
command.Flags().IntVar(&operationProcessors, "operation-processors", env.ParseNumFromEnv("ARGOCD_APPLICATION_CONTROLLER_OPERATION_PROCESSORS", 10, 0, math.MaxInt32), "Number of application operation processors")
command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_APPLICATION_CONTROLLER_LOGFORMAT", "text"), "Set the logging format. One of: text|json")
command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_APPLICATION_CONTROLLER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error")
command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level")
command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortArgoCDMetrics, "Start metrics server on given port")
command.Flags().DurationVar(&metricsCacheExpiration, "metrics-cache-expiration", env.ParseDurationFromEnv("ARGOCD_APPLICATION_CONTROLLER_METRICS_CACHE_EXPIRATION", 0*time.Second, 0, math.MaxInt64), "Prometheus metrics cache expiration (disabled by default. e.g. 24h0m0s)")
command.Flags().IntVar(&selfHealTimeoutSeconds, "self-heal-timeout-seconds", env.ParseNumFromEnv("ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_TIMEOUT_SECONDS", 5, 0, math.MaxInt32), "Specifies timeout between application self heal attempts")
command.Flags().Int64Var(&kubectlParallelismLimit, "kubectl-parallelism-limit", 20, "Number of allowed concurrent kubectl fork/execs. Any value less the 1 means no limit.")
command.Flags().BoolVar(&repoServerPlaintext, "repo-server-plaintext", env.ParseBoolFromEnv("ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_PLAINTEXT", false), "Disable TLS on connections to repo server")
command.Flags().BoolVar(&repoServerStrictTLS, "repo-server-strict-tls", env.ParseBoolFromEnv("ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_STRICT_TLS", false), "Whether to use strict validation of the TLS cert presented by the repo server")
command.Flags().StringSliceVar(&metricsAplicationLabels, "metrics-application-labels", []string{}, "List of Application labels that will be added to the argocd_application_labels metric")
cacheSrc = appstatecache.AddCacheFlagsToCmd(&command, func(client *redis.Client) {
redisClient = client
})
return &command
}
func getClusterFilter() func(cluster *v1alpha1.Cluster) bool {
replicas := env.ParseNumFromEnv(common.EnvControllerReplicas, 0, 0, math.MaxInt32)
shard := env.ParseNumFromEnv(common.EnvControllerShard, -1, -math.MaxInt32, math.MaxInt32)
var clusterFilter func(cluster *v1alpha1.Cluster) bool
if replicas > 1 {
if shard < 0 {
var err error
shard, err = sharding.InferShard()
errors.CheckError(err)
}
log.Infof("Processing clusters from shard %d", shard)
clusterFilter = sharding.GetClusterFilter(replicas, shard)
} else {
log.Info("Processing all cluster shards")
}
return clusterFilter
}

View File

@@ -1,128 +0,0 @@
package main
import (
"context"
"fmt"
"os"
"time"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
// load the gcp plugin (required to authenticate against GKE clusters).
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
// load the oidc plugin (required to authenticate with OpenID Connect).
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/controller"
"github.com/argoproj/argo-cd/errors"
appclientset "github.com/argoproj/argo-cd/pkg/client/clientset/versioned"
"github.com/argoproj/argo-cd/reposerver/apiclient"
appstatecache "github.com/argoproj/argo-cd/util/cache/appstate"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/kube"
"github.com/argoproj/argo-cd/util/settings"
"github.com/argoproj/argo-cd/util/stats"
)
const (
// CLIName is the name of the CLI
cliName = "argocd-application-controller"
// Default time in seconds for application resync period
defaultAppResyncPeriod = 180
)
func newCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
appResyncPeriod int64
repoServerAddress string
repoServerTimeoutSeconds int
selfHealTimeoutSeconds int
statusProcessors int
operationProcessors int
logLevel string
glogLevel int
metricsPort int
kubectlParallelismLimit int64
cacheSrc func() (*appstatecache.Cache, error)
)
var command = cobra.Command{
Use: cliName,
Short: "application-controller is a controller to operate on applications CRD",
RunE: func(c *cobra.Command, args []string) error {
cli.SetLogLevel(logLevel)
cli.SetGLogLevel(glogLevel)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
config.QPS = common.K8sClientConfigQPS
config.Burst = common.K8sClientConfigBurst
kubeClient := kubernetes.NewForConfigOrDie(config)
appClient := appclientset.NewForConfigOrDie(config)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
resyncDuration := time.Duration(appResyncPeriod) * time.Second
repoClientset := apiclient.NewRepoServerClientset(repoServerAddress, repoServerTimeoutSeconds)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
cache, err := cacheSrc()
errors.CheckError(err)
settingsMgr := settings.NewSettingsManager(ctx, kubeClient, namespace)
kubectl := &kube.KubectlCmd{}
appController, err := controller.NewApplicationController(
namespace,
settingsMgr,
kubeClient,
appClient,
repoClientset,
cache,
kubectl,
resyncDuration,
time.Duration(selfHealTimeoutSeconds)*time.Second,
metricsPort,
kubectlParallelismLimit)
errors.CheckError(err)
log.Infof("Application Controller (version: %s) starting (namespace: %s)", common.GetVersion(), namespace)
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
go appController.Run(ctx, statusProcessors, operationProcessors)
// Wait forever
select {}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().Int64Var(&appResyncPeriod, "app-resync", defaultAppResyncPeriod, "Time period in seconds for application resync.")
command.Flags().StringVar(&repoServerAddress, "repo-server", common.DefaultRepoServerAddr, "Repo server address.")
command.Flags().IntVar(&repoServerTimeoutSeconds, "repo-server-timeout-seconds", 60, "Repo server RPC call timeout seconds.")
command.Flags().IntVar(&statusProcessors, "status-processors", 1, "Number of application status processors")
command.Flags().IntVar(&operationProcessors, "operation-processors", 1, "Number of application operation processors")
command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level")
command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortArgoCDMetrics, "Start metrics server on given port")
command.Flags().IntVar(&selfHealTimeoutSeconds, "self-heal-timeout-seconds", 5, "Specifies timeout between application self heal attempts")
command.Flags().Int64Var(&kubectlParallelismLimit, "kubectl-parallelism-limit", 20, "Number of allowed concurrent kubectl fork/execs. Any value less the 1 means no limit.")
cacheSrc = appstatecache.AddCacheFlagsToCmd(&command)
return &command
}
func main() {
if err := newCommand().Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

View File

@@ -0,0 +1,58 @@
package commands
import (
"time"
"github.com/argoproj/pkg/stats"
"github.com/spf13/cobra"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/cmpserver"
"github.com/argoproj/argo-cd/v2/cmpserver/plugin"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
)
const (
// CLIName is the name of the CLI
cliName = "argocd-cmp-server"
)
func NewCommand() *cobra.Command {
var (
configFilePath string
)
var command = cobra.Command{
Use: cliName,
Short: "Run ArgoCD ConfigManagementPlugin Server",
Long: "ArgoCD ConfigManagementPlugin Server is an internal service which runs as sidecar container in reposerver deployment. It can be configured by following options.",
DisableAutoGenTag: true,
RunE: func(c *cobra.Command, args []string) error {
cli.SetLogFormat(cmdutil.LogFormat)
cli.SetLogLevel(cmdutil.LogLevel)
config, err := plugin.ReadPluginConfig(configFilePath)
errors.CheckError(err)
server, err := cmpserver.NewServer(plugin.CMPServerInitConstants{
PluginConfig: *config,
})
errors.CheckError(err)
// register dumper
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
// run argocd-cmp-server server
server.Run()
return nil
},
}
command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json")
command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
command.Flags().StringVar(&configFilePath, "config-dir-path", common.DefaultPluginConfigFilePath, "Config management plugin configuration file location, Default is '/home/argocd/cmp-server/config/'")
return &command
}

View File

@@ -0,0 +1,202 @@
package commands
import (
"context"
"fmt"
"io/ioutil"
"os"
"os/exec"
"syscall"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/dex"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/settings"
)
const (
cliName = "argocd-dex"
)
func NewCommand() *cobra.Command {
var command = &cobra.Command{
Use: cliName,
Short: "argocd-dex tools used by Argo CD",
Long: "argocd-dex has internal utility tools used by Argo CD",
DisableAutoGenTag: true,
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewRunDexCommand())
command.AddCommand(NewGenDexConfigCommand())
command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json")
command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
return command
}
func NewRunDexCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
)
var command = cobra.Command{
Use: "rundex",
Short: "Runs dex generating a config using settings from the Argo CD configmap and secret",
RunE: func(c *cobra.Command, args []string) error {
_, err := exec.LookPath("dex")
errors.CheckError(err)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeClientset := kubernetes.NewForConfigOrDie(config)
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace)
prevSettings, err := settingsMgr.GetSettings()
errors.CheckError(err)
updateCh := make(chan *settings.ArgoCDSettings, 1)
settingsMgr.Subscribe(updateCh)
for {
var cmd *exec.Cmd
dexCfgBytes, err := dex.GenerateDexConfigYAML(prevSettings)
errors.CheckError(err)
if len(dexCfgBytes) == 0 {
log.Infof("dex is not configured")
} else {
err = ioutil.WriteFile("/tmp/dex.yaml", dexCfgBytes, 0644)
errors.CheckError(err)
log.Debug(redactor(string(dexCfgBytes)))
cmd = exec.Command("dex", "serve", "/tmp/dex.yaml")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Start()
errors.CheckError(err)
}
// loop until the dex config changes
for {
newSettings := <-updateCh
newDexCfgBytes, err := dex.GenerateDexConfigYAML(newSettings)
errors.CheckError(err)
if string(newDexCfgBytes) != string(dexCfgBytes) {
prevSettings = newSettings
log.Infof("dex config modified. restarting dex")
if cmd != nil && cmd.Process != nil {
err = cmd.Process.Signal(syscall.SIGTERM)
errors.CheckError(err)
_, err = cmd.Process.Wait()
errors.CheckError(err)
}
break
} else {
log.Infof("dex config unmodified")
}
}
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
return &command
}
func NewGenDexConfigCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
out string
)
var command = cobra.Command{
Use: "gendexcfg",
Short: "Generates a dex config from Argo CD settings",
RunE: func(c *cobra.Command, args []string) error {
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeClientset := kubernetes.NewForConfigOrDie(config)
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace)
settings, err := settingsMgr.GetSettings()
errors.CheckError(err)
dexCfgBytes, err := dex.GenerateDexConfigYAML(settings)
errors.CheckError(err)
if len(dexCfgBytes) == 0 {
log.Infof("dex is not configured")
return nil
}
if out == "" {
dexCfg := make(map[string]interface{})
err := yaml.Unmarshal(dexCfgBytes, &dexCfg)
errors.CheckError(err)
if staticClientsInterface, ok := dexCfg["staticClients"]; ok {
if staticClients, ok := staticClientsInterface.([]interface{}); ok {
for i := range staticClients {
staticClient := staticClients[i]
if mappings, ok := staticClient.(map[string]interface{}); ok {
for key := range mappings {
if key == "secret" {
mappings[key] = "******"
}
}
staticClients[i] = mappings
}
}
dexCfg["staticClients"] = staticClients
}
}
errors.CheckError(err)
maskedDexCfgBytes, err := yaml.Marshal(dexCfg)
errors.CheckError(err)
fmt.Print(string(maskedDexCfgBytes))
} else {
err = ioutil.WriteFile(out, dexCfgBytes, 0644)
errors.CheckError(err)
}
return nil
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().StringVarP(&out, "out", "o", "", "Output to the specified file instead of stdout")
return &command
}
func iterateStringFields(obj interface{}, callback func(name string, val string) string) {
if mapField, ok := obj.(map[string]interface{}); ok {
for field, val := range mapField {
if strVal, ok := val.(string); ok {
mapField[field] = callback(field, strVal)
} else {
iterateStringFields(val, callback)
}
}
} else if arrayField, ok := obj.([]interface{}); ok {
for i := range arrayField {
iterateStringFields(arrayField[i], callback)
}
}
}
func redactor(dirtyString string) string {
config := make(map[string]interface{})
err := yaml.Unmarshal([]byte(dirtyString), &config)
errors.CheckError(err)
iterateStringFields(config, func(name string, val string) string {
if name == "clientSecret" || name == "secret" || name == "bindPW" {
return "********"
} else {
return val
}
})
data, err := yaml.Marshal(config)
errors.CheckError(err)
return string(data)
}

View File

@@ -0,0 +1,169 @@
package commands
import (
"fmt"
"math"
"net"
"net/http"
"os"
"time"
"github.com/argoproj/pkg/stats"
"github.com/go-redis/redis/v8"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"google.golang.org/grpc/health/grpc_health_v1"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/reposerver"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
reposervercache "github.com/argoproj/argo-cd/v2/reposerver/cache"
"github.com/argoproj/argo-cd/v2/reposerver/metrics"
"github.com/argoproj/argo-cd/v2/reposerver/repository"
cacheutil "github.com/argoproj/argo-cd/v2/util/cache"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/env"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/gpg"
"github.com/argoproj/argo-cd/v2/util/healthz"
ioutil "github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/argo-cd/v2/util/tls"
)
const (
// CLIName is the name of the CLI
cliName = "argocd-repo-server"
gnuPGSourcePath = "/app/config/gpg/source"
defaultPauseGenerationAfterFailedGenerationAttempts = 3
defaultPauseGenerationOnFailureForMinutes = 60
defaultPauseGenerationOnFailureForRequests = 0
)
func getGnuPGSourcePath() string {
if path := os.Getenv("ARGOCD_GPG_DATA_PATH"); path != "" {
return path
} else {
return gnuPGSourcePath
}
}
func getPauseGenerationAfterFailedGenerationAttempts() int {
return env.ParseNumFromEnv(common.EnvPauseGenerationAfterFailedAttempts, defaultPauseGenerationAfterFailedGenerationAttempts, 0, math.MaxInt32)
}
func getPauseGenerationOnFailureForMinutes() int {
return env.ParseNumFromEnv(common.EnvPauseGenerationMinutes, defaultPauseGenerationOnFailureForMinutes, 0, math.MaxInt32)
}
func getPauseGenerationOnFailureForRequests() int {
return env.ParseNumFromEnv(common.EnvPauseGenerationRequests, defaultPauseGenerationOnFailureForRequests, 0, math.MaxInt32)
}
func NewCommand() *cobra.Command {
var (
parallelismLimit int64
listenPort int
metricsPort int
cacheSrc func() (*reposervercache.Cache, error)
tlsConfigCustomizer tls.ConfigCustomizer
tlsConfigCustomizerSrc func() (tls.ConfigCustomizer, error)
redisClient *redis.Client
disableTLS bool
)
var command = cobra.Command{
Use: cliName,
Short: "Run ArgoCD Repository Server",
Long: "ArgoCD Repository Server is an internal service which maintains a local cache of the Git repository holding the application manifests, and is responsible for generating and returning the Kubernetes manifests. This command runs Repository Server in the foreground. It can be configured by following options.",
DisableAutoGenTag: true,
RunE: func(c *cobra.Command, args []string) error {
cli.SetLogFormat(cmdutil.LogFormat)
cli.SetLogLevel(cmdutil.LogLevel)
if !disableTLS {
var err error
tlsConfigCustomizer, err = tlsConfigCustomizerSrc()
errors.CheckError(err)
}
cache, err := cacheSrc()
errors.CheckError(err)
metricsServer := metrics.NewMetricsServer()
cacheutil.CollectMetrics(redisClient, metricsServer)
server, err := reposerver.NewServer(metricsServer, cache, tlsConfigCustomizer, repository.RepoServerInitConstants{
ParallelismLimit: parallelismLimit,
PauseGenerationAfterFailedGenerationAttempts: getPauseGenerationAfterFailedGenerationAttempts(),
PauseGenerationOnFailureForMinutes: getPauseGenerationOnFailureForMinutes(),
PauseGenerationOnFailureForRequests: getPauseGenerationOnFailureForRequests(),
})
errors.CheckError(err)
grpc := server.CreateGRPC()
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", listenPort))
errors.CheckError(err)
healthz.ServeHealthCheck(http.DefaultServeMux, func(r *http.Request) error {
if val, ok := r.URL.Query()["full"]; ok && len(val) > 0 && val[0] == "true" {
// connect to itself to make sure repo server is able to serve connection
// used by liveness probe to auto restart repo server
// see https://github.com/argoproj/argo-cd/issues/5110 for more information
conn, err := apiclient.NewConnection(fmt.Sprintf("localhost:%d", listenPort), 60, &apiclient.TLSConfiguration{DisableTLS: disableTLS})
if err != nil {
return err
}
defer ioutil.Close(conn)
client := grpc_health_v1.NewHealthClient(conn)
res, err := client.Check(r.Context(), &grpc_health_v1.HealthCheckRequest{})
if err != nil {
return err
}
if res.Status != grpc_health_v1.HealthCheckResponse_SERVING {
return fmt.Errorf("grpc health check status is '%v'", res.Status)
}
return nil
}
return nil
})
http.Handle("/metrics", metricsServer.GetHandler())
go func() { errors.CheckError(http.ListenAndServe(fmt.Sprintf(":%d", metricsPort), nil)) }()
if gpg.IsGPGEnabled() {
log.Infof("Initializing GnuPG keyring at %s", common.GetGnuPGHomePath())
err = gpg.InitializeGnuPG()
errors.CheckError(err)
log.Infof("Populating GnuPG keyring with keys from %s", getGnuPGSourcePath())
added, removed, err := gpg.SyncKeyRingFromDirectory(getGnuPGSourcePath())
errors.CheckError(err)
log.Infof("Loaded %d (and removed %d) keys from keyring", len(added), len(removed))
go func() { errors.CheckError(reposerver.StartGPGWatcher(getGnuPGSourcePath())) }()
}
log.Infof("argocd-repo-server %s serving on %s", common.GetVersion(), listener.Addr())
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
err = grpc.Serve(listener)
errors.CheckError(err)
return nil
},
}
if cmdutil.LogFormat == "" {
cmdutil.LogFormat = os.Getenv("ARGOCD_REPO_SERVER_LOGLEVEL")
}
command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_REPO_SERVER_LOGFORMAT", "text"), "Set the logging format. One of: text|json")
command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_REPO_SERVER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error")
command.Flags().Int64Var(&parallelismLimit, "parallelismlimit", int64(env.ParseNumFromEnv("ARGOCD_REPO_SERVER_PARALLELISM_LIMIT", 0, 0, math.MaxInt32)), "Limit on number of concurrent manifests generate requests. Any value less the 1 means no limit.")
command.Flags().IntVar(&listenPort, "port", common.DefaultPortRepoServer, "Listen on given port for incoming connections")
command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortRepoServerMetrics, "Start metrics server on given port")
command.Flags().BoolVar(&disableTLS, "disable-tls", env.ParseBoolFromEnv("ARGOCD_REPO_SERVER_DISABLE_TLS", false), "Disable TLS on the gRPC endpoint")
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(&command)
cacheSrc = reposervercache.AddCacheFlagsToCmd(&command, func(client *redis.Client) {
redisClient = client
})
return &command
}

View File

@@ -1,84 +0,0 @@
package main
import (
"fmt"
"net"
"net/http"
"os"
"time"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/errors"
"github.com/argoproj/argo-cd/reposerver"
reposervercache "github.com/argoproj/argo-cd/reposerver/cache"
"github.com/argoproj/argo-cd/reposerver/metrics"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/stats"
"github.com/argoproj/argo-cd/util/tls"
)
const (
// CLIName is the name of the CLI
cliName = "argocd-repo-server"
)
func newCommand() *cobra.Command {
var (
logLevel string
parallelismLimit int64
listenPort int
metricsPort int
cacheSrc func() (*reposervercache.Cache, error)
tlsConfigCustomizerSrc func() (tls.ConfigCustomizer, error)
)
var command = cobra.Command{
Use: cliName,
Short: "Run argocd-repo-server",
RunE: func(c *cobra.Command, args []string) error {
cli.SetLogLevel(logLevel)
tlsConfigCustomizer, err := tlsConfigCustomizerSrc()
errors.CheckError(err)
cache, err := cacheSrc()
errors.CheckError(err)
metricsServer := metrics.NewMetricsServer()
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", 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())
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
err = grpc.Serve(listener)
errors.CheckError(err)
return nil
},
}
command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
command.Flags().Int64Var(&parallelismLimit, "parallelismlimit", 0, "Limit on number of concurrent manifests generate requests. Any value less the 1 means no limit.")
command.Flags().IntVar(&listenPort, "port", common.DefaultPortRepoServer, "Listen on given port for incoming connections")
command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortRepoServerMetrics, "Start metrics server on given port")
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(&command)
cacheSrc = reposervercache.AddCacheFlagsToCmd(&command)
return &command
}
func main() {
if err := newCommand().Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

View File

@@ -0,0 +1,184 @@
package commands
import (
"context"
"fmt"
"math"
"time"
"github.com/argoproj/pkg/stats"
"github.com/go-redis/redis/v8"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
"github.com/argoproj/argo-cd/v2/server"
servercache "github.com/argoproj/argo-cd/v2/server/cache"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/env"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/kube"
"github.com/argoproj/argo-cd/v2/util/tls"
)
const (
failureRetryCountEnv = "ARGOCD_K8S_RETRY_COUNT"
failureRetryPeriodMilliSecondsEnv = "ARGOCD_K8S_RETRY_DURATION_MILLISECONDS"
)
var (
failureRetryCount = 0
failureRetryPeriodMilliSeconds = 100
)
func init() {
failureRetryCount = env.ParseNumFromEnv(failureRetryCountEnv, failureRetryCount, 0, 10)
failureRetryPeriodMilliSeconds = env.ParseNumFromEnv(failureRetryPeriodMilliSecondsEnv, failureRetryPeriodMilliSeconds, 0, 1000)
}
// NewCommand returns a new instance of an argocd command
func NewCommand() *cobra.Command {
var (
redisClient *redis.Client
insecure bool
listenPort int
metricsPort int
glogLevel int
clientConfig clientcmd.ClientConfig
repoServerTimeoutSeconds int
baseHRef string
rootPath string
repoServerAddress string
dexServerAddress string
disableAuth bool
enableGZip bool
tlsConfigCustomizerSrc func() (tls.ConfigCustomizer, error)
cacheSrc func() (*servercache.Cache, error)
frameOptions string
repoServerPlaintext bool
repoServerStrictTLS bool
staticAssetsDir string
)
var command = &cobra.Command{
Use: cliName,
Short: "Run the ArgoCD API server",
Long: "The API server is a gRPC/REST server which exposes the API consumed by the Web UI, CLI, and CI/CD systems. This command runs API server in the foreground. It can be configured by following options.",
DisableAutoGenTag: true,
Run: func(c *cobra.Command, args []string) {
cli.SetLogFormat(cmdutil.LogFormat)
cli.SetLogLevel(cmdutil.LogLevel)
cli.SetGLogLevel(glogLevel)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
errors.CheckError(v1alpha1.SetK8SConfigDefaults(config))
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
tlsConfigCustomizer, err := tlsConfigCustomizerSrc()
errors.CheckError(err)
cache, err := cacheSrc()
errors.CheckError(err)
kubeclientset := kubernetes.NewForConfigOrDie(config)
appclientsetConfig, err := clientConfig.ClientConfig()
errors.CheckError(err)
errors.CheckError(v1alpha1.SetK8SConfigDefaults(appclientsetConfig))
if failureRetryCount > 0 {
appclientsetConfig = kube.AddFailureRetryWrapper(appclientsetConfig, failureRetryCount, failureRetryPeriodMilliSeconds)
}
appclientset := appclientset.NewForConfigOrDie(appclientsetConfig)
tlsConfig := apiclient.TLSConfiguration{
DisableTLS: repoServerPlaintext,
StrictValidation: repoServerStrictTLS,
}
// Load CA information to use for validating connections to the
// repository server, if strict TLS validation was requested.
if !repoServerPlaintext && repoServerStrictTLS {
pool, err := tls.LoadX509CertPool(
fmt.Sprintf("%s/server/tls/tls.crt", env.StringFromEnv(common.EnvAppConfigPath, common.DefaultAppConfigPath)),
fmt.Sprintf("%s/server/tls/ca.crt", env.StringFromEnv(common.EnvAppConfigPath, common.DefaultAppConfigPath)),
)
if err != nil {
log.Fatalf("%v", err)
}
tlsConfig.Certificates = pool
}
repoclientset := apiclient.NewRepoServerClientset(repoServerAddress, repoServerTimeoutSeconds, tlsConfig)
if rootPath != "" {
if baseHRef != "" && baseHRef != rootPath {
log.Warnf("--basehref and --rootpath had conflict: basehref: %s rootpath: %s", baseHRef, rootPath)
}
baseHRef = rootPath
}
argoCDOpts := server.ArgoCDServerOpts{
Insecure: insecure,
ListenPort: listenPort,
MetricsPort: metricsPort,
Namespace: namespace,
BaseHRef: baseHRef,
RootPath: rootPath,
KubeClientset: kubeclientset,
AppClientset: appclientset,
RepoClientset: repoclientset,
DexServerAddr: dexServerAddress,
DisableAuth: disableAuth,
EnableGZip: enableGZip,
TLSConfigCustomizer: tlsConfigCustomizer,
Cache: cache,
XFrameOptions: frameOptions,
RedisClient: redisClient,
StaticAssetsDir: staticAssetsDir,
}
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
for {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
argocd := server.NewServer(ctx, argoCDOpts)
argocd.Run(ctx, listenPort, metricsPort)
cancel()
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
command.Flags().BoolVar(&insecure, "insecure", env.ParseBoolFromEnv("ARGOCD_SERVER_INSECURE", false), "Run server without TLS")
command.Flags().StringVar(&staticAssetsDir, "staticassets", env.StringFromEnv("ARGOCD_SERVER_STATIC_ASSETS", "/shared/app"), "Directory path that contains additional static assets")
command.Flags().StringVar(&baseHRef, "basehref", env.StringFromEnv("ARGOCD_SERVER_BASEHREF", "/"), "Value for base href in index.html. Used if Argo CD is running behind reverse proxy under subpath different from /")
command.Flags().StringVar(&rootPath, "rootpath", env.StringFromEnv("ARGOCD_SERVER_ROOTPATH", ""), "Used if Argo CD is running behind reverse proxy under subpath different from /")
command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_SERVER_LOGFORMAT", "text"), "Set the logging format. One of: text|json")
command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_REPO_SERVER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error")
command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level")
command.Flags().StringVar(&repoServerAddress, "repo-server", env.StringFromEnv("ARGOCD_SERVER_REPO_SERVER", common.DefaultRepoServerAddr), "Repo server address")
command.Flags().StringVar(&dexServerAddress, "dex-server", env.StringFromEnv("ARGOCD_SERVER_DEX_SERVER", common.DefaultDexServerAddr), "Dex server address")
command.Flags().BoolVar(&disableAuth, "disable-auth", env.ParseBoolFromEnv("ARGOCD_SERVER_DISABLE_AUTH", false), "Disable client authentication")
command.Flags().BoolVar(&enableGZip, "enable-gzip", env.ParseBoolFromEnv("ARGOCD_SERVER_ENABLE_GZIP", false), "Enable GZIP compression")
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", env.ParseNumFromEnv("ARGOCD_SERVER_REPO_SERVER_TIMEOUT_SECONDS", 60, 0, math.MaxInt64), "Repo server RPC call timeout seconds.")
command.Flags().StringVar(&frameOptions, "x-frame-options", env.StringFromEnv("ARGOCD_SERVER_X_FRAME_OPTIONS", "sameorigin"), "Set X-Frame-Options header in HTTP responses to `value`. To disable, set to \"\".")
command.Flags().BoolVar(&repoServerPlaintext, "repo-server-plaintext", env.ParseBoolFromEnv("ARGOCD_SERVER_REPO_SERVER_PLAINTEXT", false), "Use a plaintext client (non-TLS) to connect to repository server")
command.Flags().BoolVar(&repoServerStrictTLS, "repo-server-strict-tls", env.ParseBoolFromEnv("ARGOCD_SERVER_REPO_SERVER_STRICT_TLS", false), "Perform strict validation of TLS certificates when connecting to repo server")
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(command)
cacheSrc = servercache.AddCacheFlagsToCmd(command, func(client *redis.Client) {
redisClient = client
})
return command
}

View File

@@ -1,114 +0,0 @@
package commands
import (
"context"
"time"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/errors"
appclientset "github.com/argoproj/argo-cd/pkg/client/clientset/versioned"
"github.com/argoproj/argo-cd/reposerver/apiclient"
"github.com/argoproj/argo-cd/server"
servercache "github.com/argoproj/argo-cd/server/cache"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/stats"
"github.com/argoproj/argo-cd/util/tls"
)
// 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
repoServerTimeoutSeconds int
staticAssetsDir string
baseHRef string
repoServerAddress string
dexServerAddress string
disableAuth bool
tlsConfigCustomizerSrc func() (tls.ConfigCustomizer, error)
cacheSrc func() (*servercache.Cache, error)
frameOptions string
)
var command = &cobra.Command{
Use: cliName,
Short: "Run the argocd API server",
Long: "Run the argocd API server",
Run: func(c *cobra.Command, args []string) {
cli.SetLogLevel(logLevel)
cli.SetGLogLevel(glogLevel)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
config.QPS = common.K8sClientConfigQPS
config.Burst = common.K8sClientConfigBurst
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
tlsConfigCustomizer, err := tlsConfigCustomizerSrc()
errors.CheckError(err)
cache, err := cacheSrc()
errors.CheckError(err)
kubeclientset := kubernetes.NewForConfigOrDie(config)
appclientset := appclientset.NewForConfigOrDie(config)
repoclientset := apiclient.NewRepoServerClientset(repoServerAddress, repoServerTimeoutSeconds)
argoCDOpts := server.ArgoCDServerOpts{
Insecure: insecure,
ListenPort: listenPort,
MetricsPort: metricsPort,
Namespace: namespace,
StaticAssetsDir: staticAssetsDir,
BaseHRef: baseHRef,
KubeClientset: kubeclientset,
AppClientset: appclientset,
RepoClientset: repoclientset,
DexServerAddr: dexServerAddress,
DisableAuth: disableAuth,
TLSConfigCustomizer: tlsConfigCustomizer,
Cache: cache,
XFrameOptions: frameOptions,
}
stats.RegisterStackDumper()
stats.StartStatsTicker(10 * time.Minute)
stats.RegisterHeapDumper("memprofile")
for {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
argocd := server.NewServer(ctx, argoCDOpts)
argocd.Run(ctx, listenPort, metricsPort)
cancel()
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
command.Flags().BoolVar(&insecure, "insecure", false, "Run server without TLS")
command.Flags().StringVar(&staticAssetsDir, "staticassets", "", "Static assets directory path")
command.Flags().StringVar(&baseHRef, "basehref", "/", "Value for base href in index.html. Used if Argo CD is running behind reverse proxy under subpath different from /")
command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level")
command.Flags().StringVar(&repoServerAddress, "repo-server", common.DefaultRepoServerAddr, "Repo server address")
command.Flags().StringVar(&dexServerAddress, "dex-server", common.DefaultDexServerAddr, "Dex server address")
command.Flags().BoolVar(&disableAuth, "disable-auth", false, "Disable client authentication")
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.")
command.Flags().StringVar(&frameOptions, "x-frame-options", "sameorigin", "Set X-Frame-Options header in HTTP responses to `value`. To disable, set to \"\".")
tlsConfigCustomizerSrc = tls.AddTLSFlagsToCmd(command)
cacheSrc = servercache.AddCacheFlagsToCmd(command)
return command
}

View File

@@ -1,16 +0,0 @@
package main
import (
commands "github.com/argoproj/argo-cd/cmd/argocd-server/commands"
"github.com/argoproj/argo-cd/errors"
// load the gcp plugin (required to authenticate against GKE clusters).
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
// load the oidc plugin (required to authenticate with OpenID Connect).
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
)
func main() {
err := commands.NewCommand().Execute()
errors.CheckError(err)
}

View File

@@ -1,659 +0,0 @@
package main
import (
"bufio"
"context"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
"reflect"
"syscall"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
apiv1 "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/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/errors"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/db"
"github.com/argoproj/argo-cd/util/dex"
"github.com/argoproj/argo-cd/util/kube"
"github.com/argoproj/argo-cd/util/settings"
// load the gcp plugin (required to authenticate against GKE clusters).
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
// load the oidc plugin (required to authenticate with OpenID Connect).
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
)
const (
// CLIName is the name of the CLI
cliName = "argocd-util"
// YamlSeparator separates sections of a YAML file
yamlSeparator = "---\n"
)
var (
configMapResource = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "configmaps"}
secretResource = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "secrets"}
applicationsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "applications"}
appprojectsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "appprojects"}
)
// NewCommand returns a new instance of an argocd command
func NewCommand() *cobra.Command {
var (
logLevel string
)
var command = &cobra.Command{
Use: cliName,
Short: "argocd-util has internal tools used by Argo CD",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(cli.NewVersionCmd(cliName))
command.AddCommand(NewRunDexCommand())
command.AddCommand(NewGenDexConfigCommand())
command.AddCommand(NewImportCommand())
command.AddCommand(NewExportCommand())
command.AddCommand(NewClusterConfig())
command.AddCommand(NewProjectsCommand())
command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
return command
}
func NewRunDexCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
)
var command = cobra.Command{
Use: "rundex",
Short: "Runs dex generating a config using settings from the Argo CD configmap and secret",
RunE: func(c *cobra.Command, args []string) error {
_, err := exec.LookPath("dex")
errors.CheckError(err)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeClientset := kubernetes.NewForConfigOrDie(config)
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace)
prevSettings, err := settingsMgr.GetSettings()
errors.CheckError(err)
updateCh := make(chan *settings.ArgoCDSettings, 1)
settingsMgr.Subscribe(updateCh)
for {
var cmd *exec.Cmd
dexCfgBytes, err := dex.GenerateDexConfigYAML(prevSettings)
errors.CheckError(err)
if len(dexCfgBytes) == 0 {
log.Infof("dex is not configured")
} else {
err = ioutil.WriteFile("/tmp/dex.yaml", dexCfgBytes, 0644)
errors.CheckError(err)
log.Info(redactor(string(dexCfgBytes)))
cmd = exec.Command("dex", "serve", "/tmp/dex.yaml")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Start()
errors.CheckError(err)
}
// loop until the dex config changes
for {
newSettings := <-updateCh
newDexCfgBytes, err := dex.GenerateDexConfigYAML(newSettings)
errors.CheckError(err)
if string(newDexCfgBytes) != string(dexCfgBytes) {
prevSettings = newSettings
log.Infof("dex config modified. restarting dex")
if cmd != nil && cmd.Process != nil {
err = cmd.Process.Signal(syscall.SIGTERM)
errors.CheckError(err)
_, err = cmd.Process.Wait()
errors.CheckError(err)
}
break
} else {
log.Infof("dex config unmodified")
}
}
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
return &command
}
func NewGenDexConfigCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
out string
)
var command = cobra.Command{
Use: "gendexcfg",
Short: "Generates a dex config from Argo CD settings",
RunE: func(c *cobra.Command, args []string) error {
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeClientset := kubernetes.NewForConfigOrDie(config)
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace)
settings, err := settingsMgr.GetSettings()
errors.CheckError(err)
dexCfgBytes, err := dex.GenerateDexConfigYAML(settings)
errors.CheckError(err)
if len(dexCfgBytes) == 0 {
log.Infof("dex is not configured")
return nil
}
if out == "" {
dexCfg := make(map[string]interface{})
err := yaml.Unmarshal(dexCfgBytes, &dexCfg)
errors.CheckError(err)
if staticClientsInterface, ok := dexCfg["staticClients"]; ok {
if staticClients, ok := staticClientsInterface.([]interface{}); ok {
for i := range staticClients {
staticClient := staticClients[i]
if mappings, ok := staticClient.(map[string]interface{}); ok {
for key := range mappings {
if key == "secret" {
mappings[key] = "******"
}
}
staticClients[i] = mappings
}
}
dexCfg["staticClients"] = staticClients
}
}
errors.CheckError(err)
maskedDexCfgBytes, err := yaml.Marshal(dexCfg)
errors.CheckError(err)
fmt.Print(string(maskedDexCfgBytes))
} else {
err = ioutil.WriteFile(out, dexCfgBytes, 0644)
errors.CheckError(err)
}
return nil
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().StringVarP(&out, "out", "o", "", "Output to the specified file instead of stdout")
return &command
}
// NewImportCommand defines a new command for exporting Kubernetes and Argo CD resources.
func NewImportCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
prune bool
dryRun bool
)
var command = cobra.Command{
Use: "import SOURCE",
Short: "Import Argo CD data from stdin (specify `-') or a file",
Run: func(c *cobra.Command, args []string) {
if len(args) != 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
config.QPS = 100
config.Burst = 50
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
acdClients := newArgoCDClientsets(config, namespace)
var input []byte
if in := args[0]; in == "-" {
input, err = ioutil.ReadAll(os.Stdin)
} else {
input, err = ioutil.ReadFile(in)
}
errors.CheckError(err)
var dryRunMsg string
if dryRun {
dryRunMsg = " (dry run)"
}
// pruneObjects tracks live objects and it's current resource version. any remaining
// items in this map indicates the resource should be pruned since it no longer appears
// in the backup
pruneObjects := make(map[kube.ResourceKey]unstructured.Unstructured)
configMaps, err := acdClients.configMaps.List(metav1.ListOptions{})
errors.CheckError(err)
// referencedSecrets holds any secrets referenced in the argocd-cm configmap. These
// secrets need to be imported too
var referencedSecrets map[string]bool
for _, cm := range configMaps.Items {
if isArgoCDConfigMap(cm.GetName()) {
pruneObjects[kube.ResourceKey{Group: "", Kind: "ConfigMap", Name: cm.GetName()}] = cm
}
if cm.GetName() == common.ArgoCDConfigMapName {
referencedSecrets = getReferencedSecrets(cm)
}
}
secrets, err := acdClients.secrets.List(metav1.ListOptions{})
errors.CheckError(err)
for _, secret := range secrets.Items {
if isArgoCDSecret(referencedSecrets, secret) {
pruneObjects[kube.ResourceKey{Group: "", Kind: "Secret", Name: secret.GetName()}] = secret
}
}
applications, err := acdClients.applications.List(metav1.ListOptions{})
errors.CheckError(err)
for _, app := range applications.Items {
pruneObjects[kube.ResourceKey{Group: "argoproj.io", Kind: "Application", Name: app.GetName()}] = app
}
projects, err := acdClients.projects.List(metav1.ListOptions{})
errors.CheckError(err)
for _, proj := range projects.Items {
pruneObjects[kube.ResourceKey{Group: "argoproj.io", Kind: "AppProject", Name: proj.GetName()}] = proj
}
// Create or replace existing object
backupObjects, err := kube.SplitYAML(string(input))
errors.CheckError(err)
for _, bakObj := range backupObjects {
gvk := bakObj.GroupVersionKind()
key := kube.ResourceKey{Group: gvk.Group, Kind: gvk.Kind, Name: bakObj.GetName()}
liveObj, exists := pruneObjects[key]
delete(pruneObjects, key)
var dynClient dynamic.ResourceInterface
switch bakObj.GetKind() {
case "Secret":
dynClient = acdClients.secrets
case "ConfigMap":
dynClient = acdClients.configMaps
case "AppProject":
dynClient = acdClients.projects
case "Application":
dynClient = acdClients.applications
}
if !exists {
if !dryRun {
_, err = dynClient.Create(bakObj, metav1.CreateOptions{})
errors.CheckError(err)
}
fmt.Printf("%s/%s %s created%s\n", gvk.Group, gvk.Kind, bakObj.GetName(), dryRunMsg)
} else if specsEqual(*bakObj, liveObj) {
fmt.Printf("%s/%s %s unchanged%s\n", gvk.Group, gvk.Kind, bakObj.GetName(), dryRunMsg)
} else {
if !dryRun {
newLive := updateLive(bakObj, &liveObj)
_, err = dynClient.Update(newLive, metav1.UpdateOptions{})
errors.CheckError(err)
}
fmt.Printf("%s/%s %s updated%s\n", gvk.Group, gvk.Kind, bakObj.GetName(), dryRunMsg)
}
}
// Delete objects not in backup
for key := range pruneObjects {
if prune {
var dynClient dynamic.ResourceInterface
switch key.Kind {
case "Secret":
dynClient = acdClients.secrets
case "AppProject":
dynClient = acdClients.projects
case "Application":
dynClient = acdClients.applications
default:
log.Fatalf("Unexpected kind '%s' in prune list", key.Kind)
}
if !dryRun {
err = dynClient.Delete(key.Name, &metav1.DeleteOptions{})
errors.CheckError(err)
}
fmt.Printf("%s/%s %s pruned%s\n", key.Group, key.Kind, key.Name, dryRunMsg)
} else {
fmt.Printf("%s/%s %s needs pruning\n", key.Group, key.Kind, key.Name)
}
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().BoolVar(&dryRun, "dry-run", false, "Print what will be performed")
command.Flags().BoolVar(&prune, "prune", false, "Prune secrets, applications and projects which do not appear in the backup")
return &command
}
type argoCDClientsets struct {
configMaps dynamic.ResourceInterface
secrets dynamic.ResourceInterface
applications dynamic.ResourceInterface
projects dynamic.ResourceInterface
}
func newArgoCDClientsets(config *rest.Config, namespace string) *argoCDClientsets {
dynamicIf, err := dynamic.NewForConfig(config)
errors.CheckError(err)
return &argoCDClientsets{
configMaps: dynamicIf.Resource(configMapResource).Namespace(namespace),
secrets: dynamicIf.Resource(secretResource).Namespace(namespace),
applications: dynamicIf.Resource(applicationsResource).Namespace(namespace),
projects: dynamicIf.Resource(appprojectsResource).Namespace(namespace),
}
}
// NewExportCommand defines a new command for exporting Kubernetes and Argo CD resources.
func NewExportCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
out string
)
var command = cobra.Command{
Use: "export",
Short: "Export all Argo CD data to stdout (default) or a file",
Run: func(c *cobra.Command, args []string) {
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
var writer io.Writer
if out == "-" {
writer = os.Stdout
} else {
f, err := os.Create(out)
errors.CheckError(err)
defer util.Close(f)
writer = bufio.NewWriter(f)
}
acdClients := newArgoCDClientsets(config, namespace)
acdConfigMap, err := acdClients.configMaps.Get(common.ArgoCDConfigMapName, metav1.GetOptions{})
errors.CheckError(err)
export(writer, *acdConfigMap)
acdRBACConfigMap, err := acdClients.configMaps.Get(common.ArgoCDRBACConfigMapName, metav1.GetOptions{})
errors.CheckError(err)
export(writer, *acdRBACConfigMap)
acdKnownHostsConfigMap, err := acdClients.configMaps.Get(common.ArgoCDKnownHostsConfigMapName, metav1.GetOptions{})
errors.CheckError(err)
export(writer, *acdKnownHostsConfigMap)
acdTLSCertsConfigMap, err := acdClients.configMaps.Get(common.ArgoCDTLSCertsConfigMapName, metav1.GetOptions{})
errors.CheckError(err)
export(writer, *acdTLSCertsConfigMap)
referencedSecrets := getReferencedSecrets(*acdConfigMap)
secrets, err := acdClients.secrets.List(metav1.ListOptions{})
errors.CheckError(err)
for _, secret := range secrets.Items {
if isArgoCDSecret(referencedSecrets, secret) {
export(writer, secret)
}
}
projects, err := acdClients.projects.List(metav1.ListOptions{})
errors.CheckError(err)
for _, proj := range projects.Items {
export(writer, proj)
}
applications, err := acdClients.applications.List(metav1.ListOptions{})
errors.CheckError(err)
for _, app := range applications.Items {
export(writer, app)
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().StringVarP(&out, "out", "o", "-", "Output to the specified file instead of stdout")
return &command
}
// getReferencedSecrets examines the argocd-cm config for any referenced repo secrets and returns a
// map of all referenced secrets.
func getReferencedSecrets(un unstructured.Unstructured) map[string]bool {
var cm apiv1.ConfigMap
err := runtime.DefaultUnstructuredConverter.FromUnstructured(un.Object, &cm)
errors.CheckError(err)
referencedSecrets := make(map[string]bool)
// Referenced repository secrets
if reposRAW, ok := cm.Data["repositories"]; ok {
repos := make([]settings.Repository, 0)
err := yaml.Unmarshal([]byte(reposRAW), &repos)
errors.CheckError(err)
for _, cred := range repos {
if cred.PasswordSecret != nil {
referencedSecrets[cred.PasswordSecret.Name] = true
}
if cred.SSHPrivateKeySecret != nil {
referencedSecrets[cred.SSHPrivateKeySecret.Name] = true
}
if cred.UsernameSecret != nil {
referencedSecrets[cred.UsernameSecret.Name] = true
}
if cred.TLSClientCertDataSecret != nil {
referencedSecrets[cred.TLSClientCertDataSecret.Name] = true
}
if cred.TLSClientCertKeySecret != nil {
referencedSecrets[cred.TLSClientCertKeySecret.Name] = true
}
}
}
// Referenced repository credentials secrets
if reposRAW, ok := cm.Data["repository.credentials"]; ok {
creds := make([]settings.RepositoryCredentials, 0)
err := yaml.Unmarshal([]byte(reposRAW), &creds)
errors.CheckError(err)
for _, cred := range creds {
if cred.PasswordSecret != nil {
referencedSecrets[cred.PasswordSecret.Name] = true
}
if cred.SSHPrivateKeySecret != nil {
referencedSecrets[cred.SSHPrivateKeySecret.Name] = true
}
if cred.UsernameSecret != nil {
referencedSecrets[cred.UsernameSecret.Name] = true
}
if cred.TLSClientCertDataSecret != nil {
referencedSecrets[cred.TLSClientCertDataSecret.Name] = true
}
if cred.TLSClientCertKeySecret != nil {
referencedSecrets[cred.TLSClientCertKeySecret.Name] = true
}
}
}
return referencedSecrets
}
// isArgoCDSecret returns whether or not the given secret is a part of Argo CD configuration
// (e.g. argocd-secret, repo credentials, or cluster credentials)
func isArgoCDSecret(repoSecretRefs map[string]bool, un unstructured.Unstructured) bool {
secretName := un.GetName()
if secretName == common.ArgoCDSecretName {
return true
}
if repoSecretRefs != nil {
if _, ok := repoSecretRefs[secretName]; ok {
return true
}
}
if labels := un.GetLabels(); labels != nil {
if _, ok := labels[common.LabelKeySecretType]; ok {
return true
}
}
if annotations := un.GetAnnotations(); annotations != nil {
if annotations[common.AnnotationKeyManagedBy] == common.AnnotationValueManagedByArgoCD {
return true
}
}
return false
}
// isArgoCDConfigMap returns true if the configmap name is one of argo cd's well known configmaps
func isArgoCDConfigMap(name string) bool {
switch name {
case common.ArgoCDConfigMapName, common.ArgoCDRBACConfigMapName, common.ArgoCDKnownHostsConfigMapName, common.ArgoCDTLSCertsConfigMapName:
return true
}
return false
}
// specsEqual returns if the spec, data, labels, annotations, and finalizers of the two
// supplied objects are equal, indicating that no update is necessary during importing
func specsEqual(left, right unstructured.Unstructured) bool {
if !reflect.DeepEqual(left.GetAnnotations(), right.GetAnnotations()) {
return false
}
if !reflect.DeepEqual(left.GetLabels(), right.GetLabels()) {
return false
}
if !reflect.DeepEqual(left.GetFinalizers(), right.GetFinalizers()) {
return false
}
switch left.GetKind() {
case "Secret", "ConfigMap":
leftData, _, _ := unstructured.NestedMap(left.Object, "data")
rightData, _, _ := unstructured.NestedMap(right.Object, "data")
return reflect.DeepEqual(leftData, rightData)
case "AppProject", "Application":
leftSpec, _, _ := unstructured.NestedMap(left.Object, "spec")
rightSpec, _, _ := unstructured.NestedMap(right.Object, "spec")
return reflect.DeepEqual(leftSpec, rightSpec)
}
return false
}
// updateLive replaces the live object's finalizers, spec, annotations, labels, and data from the
// backup object but leaves all other fields intact (status, other metadata, etc...)
func updateLive(bak, live *unstructured.Unstructured) *unstructured.Unstructured {
newLive := live.DeepCopy()
newLive.SetAnnotations(bak.GetAnnotations())
newLive.SetLabels(bak.GetLabels())
newLive.SetFinalizers(bak.GetFinalizers())
switch live.GetKind() {
case "Secret", "ConfigMap":
newLive.Object["data"] = bak.Object["data"]
case "AppProject", "Application":
newLive.Object["spec"] = bak.Object["spec"]
}
return newLive
}
// export writes the unstructured object and removes extraneous cruft from output before writing
func export(w io.Writer, un unstructured.Unstructured) {
name := un.GetName()
finalizers := un.GetFinalizers()
apiVersion := un.GetAPIVersion()
kind := un.GetKind()
labels := un.GetLabels()
annotations := un.GetAnnotations()
unstructured.RemoveNestedField(un.Object, "metadata")
un.SetName(name)
un.SetFinalizers(finalizers)
un.SetAPIVersion(apiVersion)
un.SetKind(kind)
un.SetLabels(labels)
un.SetAnnotations(annotations)
data, err := yaml.Marshal(un.Object)
errors.CheckError(err)
_, err = w.Write(data)
errors.CheckError(err)
_, err = w.Write([]byte(yamlSeparator))
errors.CheckError(err)
}
// NewClusterConfig returns a new instance of `argocd-util kubeconfig` command
func NewClusterConfig() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
)
var command = &cobra.Command{
Use: "kubeconfig CLUSTER_URL OUTPUT_PATH",
Short: "Generates kubeconfig for the specified cluster",
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
serverUrl := args[0]
output := args[1]
conf, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeclientset, err := kubernetes.NewForConfig(conf)
errors.CheckError(err)
cluster, err := db.NewDB(namespace, settings.NewSettingsManager(context.Background(), kubeclientset, namespace), kubeclientset).GetCluster(context.Background(), serverUrl)
errors.CheckError(err)
err = kube.WriteKubeConfig(cluster.RESTConfig(), namespace, output)
errors.CheckError(err)
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
return command
}
func iterateStringFields(obj interface{}, callback func(name string, val string) string) {
if mapField, ok := obj.(map[string]interface{}); ok {
for field, val := range mapField {
if strVal, ok := val.(string); ok {
mapField[field] = callback(field, strVal)
} else {
iterateStringFields(val, callback)
}
}
} else if arrayField, ok := obj.([]interface{}); ok {
for i := range arrayField {
iterateStringFields(arrayField[i], callback)
}
}
}
func redactor(dirtyString string) string {
config := make(map[string]interface{})
err := yaml.Unmarshal([]byte(dirtyString), &config)
errors.CheckError(err)
iterateStringFields(config, func(name string, val string) string {
if name == "clientSecret" || name == "secret" {
return "********"
} else {
return val
}
})
data, err := yaml.Marshal(config)
errors.CheckError(err)
return string(data)
}
func main() {
if err := NewCommand().Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

View File

@@ -5,22 +5,26 @@ import (
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
"syscall"
"text/tabwriter"
"time"
timeutil "github.com/argoproj/pkg/time"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"golang.org/x/crypto/ssh/terminal"
"golang.org/x/term"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
accountpkg "github.com/argoproj/argo-cd/pkg/apiclient/account"
"github.com/argoproj/argo-cd/pkg/apiclient/session"
"github.com/argoproj/argo-cd/server/rbacpolicy"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/localconfig"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
accountpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/account"
"github.com/argoproj/argo-cd/v2/pkg/apiclient/session"
"github.com/argoproj/argo-cd/v2/server/rbacpolicy"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/argo-cd/v2/util/localconfig"
sessionutil "github.com/argoproj/argo-cd/v2/util/session"
)
func NewAccountCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
@@ -35,70 +39,97 @@ func NewAccountCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
command.AddCommand(NewAccountUpdatePasswordCommand(clientOpts))
command.AddCommand(NewAccountGetUserInfoCommand(clientOpts))
command.AddCommand(NewAccountCanICommand(clientOpts))
command.AddCommand(NewAccountListCommand(clientOpts))
command.AddCommand(NewAccountGenerateTokenCommand(clientOpts))
command.AddCommand(NewAccountGetCommand(clientOpts))
command.AddCommand(NewAccountDeleteTokenCommand(clientOpts))
return command
}
func NewAccountUpdatePasswordCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
account string
currentPassword string
newPassword string
)
var command = &cobra.Command{
Use: "update-password",
Short: "Update password",
Short: "Update an account's password",
Long: `
This command can be used to update the password of the currently logged on
user, or an arbitrary local user account when the currently logged on user
has appropriate RBAC permissions to change other accounts.
`,
Example: `
# Update the current user's password
argocd account update-password
# Update the password for user foobar
argocd account update-password --account foobar
`,
Run: func(c *cobra.Command, args []string) {
if len(args) != 0 {
c.HelpFunc()(c, args)
os.Exit(1)
}
acdClient := argocdclient.NewClientOrDie(clientOpts)
conn, usrIf := acdClient.NewAccountClientOrDie()
defer io.Close(conn)
if currentPassword == "" {
fmt.Print("*** Enter current password: ")
password, err := terminal.ReadPassword(syscall.Stdin)
userInfo := getCurrentAccount(acdClient)
if userInfo.Iss == sessionutil.SessionManagerClaimsIssuer && currentPassword == "" {
fmt.Printf("*** Enter password of currently logged in user (%s): ", userInfo.Username)
password, err := term.ReadPassword(int(os.Stdin.Fd()))
errors.CheckError(err)
currentPassword = string(password)
fmt.Print("\n")
}
if account == "" {
account = userInfo.Username
}
if newPassword == "" {
var err error
newPassword, err = cli.ReadAndConfirmPassword()
newPassword, err = cli.ReadAndConfirmPassword(account)
errors.CheckError(err)
}
updatePasswordRequest := accountpkg.UpdatePasswordRequest{
NewPassword: newPassword,
CurrentPassword: currentPassword,
Name: account,
}
acdClient := argocdclient.NewClientOrDie(clientOpts)
conn, usrIf := acdClient.NewAccountClientOrDie()
defer util.Close(conn)
ctx := context.Background()
_, err := usrIf.UpdatePassword(ctx, &updatePasswordRequest)
errors.CheckError(err)
fmt.Printf("Password updated\n")
// Get a new JWT token after updating the password
localCfg, err := localconfig.ReadLocalConfig(clientOpts.ConfigPath)
errors.CheckError(err)
configCtx, err := localCfg.ResolveContext(clientOpts.Context)
errors.CheckError(err)
claims, err := configCtx.User.Claims()
errors.CheckError(err)
tokenString := passwordLogin(acdClient, claims.Subject, newPassword)
localCfg.UpsertUser(localconfig.User{
Name: localCfg.CurrentContext,
AuthToken: tokenString,
})
err = localconfig.WriteLocalConfig(*localCfg, clientOpts.ConfigPath)
errors.CheckError(err)
fmt.Printf("Context '%s' updated\n", localCfg.CurrentContext)
if account == "" || account == userInfo.Username {
// Get a new JWT token after updating the password
localCfg, err := localconfig.ReadLocalConfig(clientOpts.ConfigPath)
errors.CheckError(err)
configCtx, err := localCfg.ResolveContext(clientOpts.Context)
errors.CheckError(err)
claims, err := configCtx.User.Claims()
errors.CheckError(err)
tokenString := passwordLogin(acdClient, localconfig.GetUsername(claims.Subject), newPassword)
localCfg.UpsertUser(localconfig.User{
Name: localCfg.CurrentContext,
AuthToken: tokenString,
})
err = localconfig.WriteLocalConfig(*localCfg, clientOpts.ConfigPath)
errors.CheckError(err)
fmt.Printf("Context '%s' updated\n", localCfg.CurrentContext)
}
},
}
command.Flags().StringVar(&currentPassword, "current-password", "", "current password you wish to change")
command.Flags().StringVar(&currentPassword, "current-password", "", "password of the currently logged on user")
command.Flags().StringVar(&newPassword, "new-password", "", "new password you want to update to")
command.Flags().StringVar(&account, "account", "", "an account name that should be updated. Defaults to current user account")
return command
}
@@ -116,7 +147,7 @@ func NewAccountGetUserInfoCommand(clientOpts *argocdclient.ClientOptions) *cobra
}
conn, client := argocdclient.NewClientOrDie(clientOpts).NewSessionClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
ctx := context.Background()
response, err := client.GetUserInfo(ctx, &session.GetUserInfoRequest{})
@@ -159,11 +190,11 @@ argocd account can-i sync applications '*'
argocd account can-i update projects 'default'
# Can I create a cluster?
argocd account can-i create cluster '*'
argocd account can-i create clusters '*'
Actions: %v
Resources: %v
`, rbacpolicy.Resources, rbacpolicy.Actions),
`, rbacpolicy.Actions, rbacpolicy.Resources),
Run: func(c *cobra.Command, args []string) {
if len(args) != 3 {
c.HelpFunc()(c, args)
@@ -171,7 +202,7 @@ Resources: %v
}
conn, client := argocdclient.NewClientOrDie(clientOpts).NewAccountClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
ctx := context.Background()
response, err := client.CanI(ctx, &accountpkg.CanIRequest{
@@ -184,3 +215,202 @@ Resources: %v
},
}
}
func printAccountNames(accounts []*accountpkg.Account) {
for _, p := range accounts {
fmt.Println(p.Name)
}
}
func printAccountsTable(items []*accountpkg.Account) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "NAME\tENABLED\tCAPABILITIES\n")
for _, a := range items {
fmt.Fprintf(w, "%s\t%v\t%s\n", a.Name, a.Enabled, strings.Join(a.Capabilities, ", "))
}
_ = w.Flush()
}
func NewAccountListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
)
cmd := &cobra.Command{
Use: "list",
Short: "List accounts",
Example: "argocd account list",
Run: func(c *cobra.Command, args []string) {
conn, client := argocdclient.NewClientOrDie(clientOpts).NewAccountClientOrDie()
defer io.Close(conn)
ctx := context.Background()
response, err := client.ListAccounts(ctx, &accountpkg.ListAccountRequest{})
errors.CheckError(err)
switch output {
case "yaml", "json":
err := PrintResourceList(response.Items, output, false)
errors.CheckError(err)
case "name":
printAccountNames(response.Items)
case "wide", "":
printAccountsTable(response.Items)
default:
errors.CheckError(fmt.Errorf("unknown output format: %s", output))
}
},
}
cmd.Flags().StringVarP(&output, "output", "o", "wide", "Output format. One of: json|yaml|wide|name")
return cmd
}
func getCurrentAccount(clientset argocdclient.Client) session.GetUserInfoResponse {
conn, client := clientset.NewSessionClientOrDie()
defer io.Close(conn)
userInfo, err := client.GetUserInfo(context.Background(), &session.GetUserInfoRequest{})
errors.CheckError(err)
return *userInfo
}
func NewAccountGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
account string
)
cmd := &cobra.Command{
Use: "get",
Short: "Get account details",
Example: `# Get the currently logged in account details
argocd account get
# Get details for an account by name
argocd account get --account <account-name>`,
Run: func(c *cobra.Command, args []string) {
clientset := argocdclient.NewClientOrDie(clientOpts)
if account == "" {
account = getCurrentAccount(clientset).Username
}
conn, client := clientset.NewAccountClientOrDie()
defer io.Close(conn)
acc, err := client.GetAccount(context.Background(), &accountpkg.GetAccountRequest{Name: account})
errors.CheckError(err)
switch output {
case "yaml", "json":
err := PrintResourceList(acc, output, true)
errors.CheckError(err)
case "name":
fmt.Println(acc.Name)
case "wide", "":
printAccountDetails(acc)
default:
errors.CheckError(fmt.Errorf("unknown output format: %s", output))
}
},
}
cmd.Flags().StringVarP(&output, "output", "o", "wide", "Output format. One of: json|yaml|wide|name")
cmd.Flags().StringVarP(&account, "account", "a", "", "Account name. Defaults to the current account.")
return cmd
}
func printAccountDetails(acc *accountpkg.Account) {
fmt.Printf(printOpFmtStr, "Name:", acc.Name)
fmt.Printf(printOpFmtStr, "Enabled:", strconv.FormatBool(acc.Enabled))
fmt.Printf(printOpFmtStr, "Capabilities:", strings.Join(acc.Capabilities, ", "))
fmt.Println("\nTokens:")
if len(acc.Tokens) == 0 {
fmt.Println("NONE")
} else {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "ID\tISSUED AT\tEXPIRING AT\n")
for _, t := range acc.Tokens {
expiresAtFormatted := "never"
if t.ExpiresAt > 0 {
expiresAt := time.Unix(t.ExpiresAt, 0)
expiresAtFormatted = expiresAt.Format(time.RFC3339)
if expiresAt.Before(time.Now()) {
expiresAtFormatted = fmt.Sprintf("%s (expired)", expiresAtFormatted)
}
}
fmt.Fprintf(w, "%s\t%s\t%s\n", t.Id, time.Unix(t.IssuedAt, 0).Format(time.RFC3339), expiresAtFormatted)
}
_ = w.Flush()
}
}
func NewAccountGenerateTokenCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
account string
expiresIn string
id string
)
cmd := &cobra.Command{
Use: "generate-token",
Short: "Generate account token",
Example: `# Generate token for the currently logged in account
argocd account generate-token
# Generate token for the account with the specified name
argocd account generate-token --account <account-name>`,
Run: func(c *cobra.Command, args []string) {
clientset := argocdclient.NewClientOrDie(clientOpts)
conn, client := clientset.NewAccountClientOrDie()
defer io.Close(conn)
if account == "" {
account = getCurrentAccount(clientset).Username
}
expiresIn, err := timeutil.ParseDuration(expiresIn)
errors.CheckError(err)
response, err := client.CreateToken(context.Background(), &accountpkg.CreateTokenRequest{
Name: account,
ExpiresIn: int64(expiresIn.Seconds()),
Id: id,
})
errors.CheckError(err)
fmt.Println(response.Token)
},
}
cmd.Flags().StringVarP(&account, "account", "a", "", "Account name. Defaults to the current account.")
cmd.Flags().StringVarP(&expiresIn, "expires-in", "e", "0s", "Duration before the token will expire. (Default: No expiration)")
cmd.Flags().StringVar(&id, "id", "", "Optional token id. Fall back to uuid if not value specified.")
return cmd
}
func NewAccountDeleteTokenCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
account string
)
cmd := &cobra.Command{
Use: "delete-token",
Short: "Deletes account token",
Example: `# Delete token of the currently logged in account
argocd account delete-token ID
# Delete token of the account with the specified name
argocd account delete-token --account <account-name> ID`,
Run: func(c *cobra.Command, args []string) {
if len(args) != 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
id := args[0]
clientset := argocdclient.NewClientOrDie(clientOpts)
conn, client := clientset.NewAccountClientOrDie()
defer io.Close(conn)
if account == "" {
account = getCurrentAccount(clientset).Username
}
_, err := client.DeleteToken(context.Background(), &accountpkg.DeleteTokenRequest{Name: account, Id: id})
errors.CheckError(err)
},
}
cmd.Flags().StringVarP(&account, "account", "a", "", "Account name. Defaults to the current account.")
return cmd
}

View File

@@ -0,0 +1,243 @@
package admin
import (
"reflect"
"github.com/ghodss/yaml"
"github.com/spf13/cobra"
apiv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/settings"
)
const (
// YamlSeparator separates sections of a YAML file
yamlSeparator = "---\n"
)
var (
configMapResource = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "configmaps"}
secretResource = schema.GroupVersionResource{Group: "", Version: "v1", Resource: "secrets"}
applicationsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "applications"}
appprojectsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "appprojects"}
appplicationSetResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "applicationsets"}
)
// NewAdminCommand returns a new instance of an argocd command
func NewAdminCommand() *cobra.Command {
var (
pathOpts = clientcmd.NewDefaultPathOptions()
)
var command = &cobra.Command{
Use: "admin",
Short: "Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access",
DisableAutoGenTag: true,
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewClusterCommand(pathOpts))
command.AddCommand(NewProjectsCommand())
command.AddCommand(NewSettingsCommand())
command.AddCommand(NewAppCommand())
command.AddCommand(NewRepoCommand())
command.AddCommand(NewImportCommand())
command.AddCommand(NewExportCommand())
command.AddCommand(NewDashboardCommand())
command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json")
command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error")
return command
}
type argoCDClientsets struct {
configMaps dynamic.ResourceInterface
secrets dynamic.ResourceInterface
applications dynamic.ResourceInterface
projects dynamic.ResourceInterface
applicationSets dynamic.ResourceInterface
}
func newArgoCDClientsets(config *rest.Config, namespace string) *argoCDClientsets {
dynamicIf, err := dynamic.NewForConfig(config)
errors.CheckError(err)
return &argoCDClientsets{
configMaps: dynamicIf.Resource(configMapResource).Namespace(namespace),
secrets: dynamicIf.Resource(secretResource).Namespace(namespace),
applications: dynamicIf.Resource(applicationsResource).Namespace(namespace),
projects: dynamicIf.Resource(appprojectsResource).Namespace(namespace),
applicationSets: dynamicIf.Resource(appplicationSetResource).Namespace(namespace),
}
}
// getReferencedSecrets examines the argocd-cm config for any referenced repo secrets and returns a
// map of all referenced secrets.
func getReferencedSecrets(un unstructured.Unstructured) map[string]bool {
var cm apiv1.ConfigMap
err := runtime.DefaultUnstructuredConverter.FromUnstructured(un.Object, &cm)
errors.CheckError(err)
referencedSecrets := make(map[string]bool)
// Referenced repository secrets
if reposRAW, ok := cm.Data["repositories"]; ok {
repos := make([]settings.Repository, 0)
err := yaml.Unmarshal([]byte(reposRAW), &repos)
errors.CheckError(err)
for _, cred := range repos {
if cred.PasswordSecret != nil {
referencedSecrets[cred.PasswordSecret.Name] = true
}
if cred.SSHPrivateKeySecret != nil {
referencedSecrets[cred.SSHPrivateKeySecret.Name] = true
}
if cred.UsernameSecret != nil {
referencedSecrets[cred.UsernameSecret.Name] = true
}
if cred.TLSClientCertDataSecret != nil {
referencedSecrets[cred.TLSClientCertDataSecret.Name] = true
}
if cred.TLSClientCertKeySecret != nil {
referencedSecrets[cred.TLSClientCertKeySecret.Name] = true
}
}
}
// Referenced repository credentials secrets
if reposRAW, ok := cm.Data["repository.credentials"]; ok {
creds := make([]settings.RepositoryCredentials, 0)
err := yaml.Unmarshal([]byte(reposRAW), &creds)
errors.CheckError(err)
for _, cred := range creds {
if cred.PasswordSecret != nil {
referencedSecrets[cred.PasswordSecret.Name] = true
}
if cred.SSHPrivateKeySecret != nil {
referencedSecrets[cred.SSHPrivateKeySecret.Name] = true
}
if cred.UsernameSecret != nil {
referencedSecrets[cred.UsernameSecret.Name] = true
}
if cred.TLSClientCertDataSecret != nil {
referencedSecrets[cred.TLSClientCertDataSecret.Name] = true
}
if cred.TLSClientCertKeySecret != nil {
referencedSecrets[cred.TLSClientCertKeySecret.Name] = true
}
}
}
return referencedSecrets
}
// isArgoCDSecret returns whether or not the given secret is a part of Argo CD configuration
// (e.g. argocd-secret, repo credentials, or cluster credentials)
func isArgoCDSecret(repoSecretRefs map[string]bool, un unstructured.Unstructured) bool {
secretName := un.GetName()
if secretName == common.ArgoCDSecretName {
return true
}
if repoSecretRefs != nil {
if _, ok := repoSecretRefs[secretName]; ok {
return true
}
}
if labels := un.GetLabels(); labels != nil {
if _, ok := labels[common.LabelKeySecretType]; ok {
return true
}
}
if annotations := un.GetAnnotations(); annotations != nil {
if annotations[common.AnnotationKeyManagedBy] == common.AnnotationValueManagedByArgoCD {
return true
}
}
return false
}
// isArgoCDConfigMap returns true if the configmap name is one of argo cd's well known configmaps
func isArgoCDConfigMap(name string) bool {
switch name {
case common.ArgoCDConfigMapName, common.ArgoCDRBACConfigMapName, common.ArgoCDKnownHostsConfigMapName, common.ArgoCDTLSCertsConfigMapName:
return true
}
return false
}
// specsEqual returns if the spec, data, labels, annotations, and finalizers of the two
// supplied objects are equal, indicating that no update is necessary during importing
func specsEqual(left, right unstructured.Unstructured) bool {
if !reflect.DeepEqual(left.GetAnnotations(), right.GetAnnotations()) {
return false
}
if !reflect.DeepEqual(left.GetLabels(), right.GetLabels()) {
return false
}
if !reflect.DeepEqual(left.GetFinalizers(), right.GetFinalizers()) {
return false
}
switch left.GetKind() {
case "Secret", "ConfigMap":
leftData, _, _ := unstructured.NestedMap(left.Object, "data")
rightData, _, _ := unstructured.NestedMap(right.Object, "data")
return reflect.DeepEqual(leftData, rightData)
case "AppProject":
leftSpec, _, _ := unstructured.NestedMap(left.Object, "spec")
rightSpec, _, _ := unstructured.NestedMap(right.Object, "spec")
return reflect.DeepEqual(leftSpec, rightSpec)
case "Application":
leftSpec, _, _ := unstructured.NestedMap(left.Object, "spec")
rightSpec, _, _ := unstructured.NestedMap(right.Object, "spec")
leftStatus, _, _ := unstructured.NestedMap(left.Object, "status")
rightStatus, _, _ := unstructured.NestedMap(right.Object, "status")
// reconciledAt and observedAt are constantly changing and we ignore any diff there
delete(leftStatus, "reconciledAt")
delete(rightStatus, "reconciledAt")
delete(leftStatus, "observedAt")
delete(rightStatus, "observedAt")
return reflect.DeepEqual(leftSpec, rightSpec) && reflect.DeepEqual(leftStatus, rightStatus)
}
return false
}
func iterateStringFields(obj interface{}, callback func(name string, val string) string) {
if mapField, ok := obj.(map[string]interface{}); ok {
for field, val := range mapField {
if strVal, ok := val.(string); ok {
mapField[field] = callback(field, strVal)
} else {
iterateStringFields(val, callback)
}
}
} else if arrayField, ok := obj.([]interface{}); ok {
for i := range arrayField {
iterateStringFields(arrayField[i], callback)
}
}
}
func redactor(dirtyString string) string {
config := make(map[string]interface{})
err := yaml.Unmarshal([]byte(dirtyString), &config)
errors.CheckError(err)
iterateStringFields(config, func(name string, val string) string {
if name == "clientSecret" || name == "secret" || name == "bindPW" {
return "********"
} else {
return val
}
})
data, err := yaml.Marshal(config)
errors.CheckError(err)
return string(data)
}

View File

@@ -0,0 +1,417 @@
package admin
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"sort"
"time"
"github.com/argoproj/argo-cd/v2/util/argo"
"github.com/ghodss/yaml"
"github.com/spf13/cobra"
apiv1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/kubernetes"
kubecache "k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/controller"
"github.com/argoproj/argo-cd/v2/controller/cache"
"github.com/argoproj/argo-cd/v2/controller/metrics"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
appinformers "github.com/argoproj/argo-cd/v2/pkg/client/informers/externalversions"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
cacheutil "github.com/argoproj/argo-cd/v2/util/cache"
appstatecache "github.com/argoproj/argo-cd/v2/util/cache/appstate"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/config"
"github.com/argoproj/argo-cd/v2/util/db"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
kubeutil "github.com/argoproj/argo-cd/v2/util/kube"
"github.com/argoproj/argo-cd/v2/util/settings"
)
func NewAppCommand() *cobra.Command {
var command = &cobra.Command{
Use: "app",
Short: "Manage applications configuration",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewGenAppSpecCommand())
command.AddCommand(NewReconcileCommand())
command.AddCommand(NewDiffReconcileResults())
return command
}
// NewGenAppSpecCommand generates declarative configuration file for given application
func NewGenAppSpecCommand() *cobra.Command {
var (
appOpts cmdutil.AppOptions
fileURL string
appName string
labels []string
outputFormat string
annotations []string
inline bool
)
var command = &cobra.Command{
Use: "generate-spec APPNAME",
Short: "Generate declarative config for an application",
Example: `
# Generate declarative config for a directory app
argocd admin app generate-spec guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --directory-recurse
# Generate declarative config for a Jsonnet app
argocd admin app generate-spec jsonnet-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path jsonnet-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --jsonnet-ext-str replicas=2
# Generate declarative config for a Helm app
argocd admin app generate-spec helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --helm-set replicaCount=2
# Generate declarative config for a Helm app from a Helm repo
argocd admin app generate-spec nginx-ingress --repo https://charts.helm.sh/stable --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc
# Generate declarative config for a Kustomize app
argocd admin app generate-spec kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1
# Generate declarative config for a app using a custom tool:
argocd admin app generate-spec ksane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane
`,
Run: func(c *cobra.Command, args []string) {
apps, err := cmdutil.ConstructApps(fileURL, appName, labels, annotations, args, appOpts, c.Flags())
errors.CheckError(err)
if len(apps) > 1 {
errors.CheckError(fmt.Errorf("failed to generate spec, more than one application is not supported"))
}
app := apps[0]
if app.Name == "" {
c.HelpFunc()(c, args)
os.Exit(1)
}
out, closer, err := getOutWriter(inline, fileURL)
errors.CheckError(err)
defer io.Close(closer)
errors.CheckError(PrintResources(outputFormat, out, app))
},
}
command.Flags().StringVar(&appName, "name", "", "A name for the app, ignored if a file is set (DEPRECATED)")
command.Flags().StringVarP(&fileURL, "file", "f", "", "Filename or URL to Kubernetes manifests for the app")
command.Flags().StringArrayVarP(&labels, "label", "l", []string{}, "Labels to apply to the app")
command.Flags().StringArrayVarP(&annotations, "annotations", "", []string{}, "Set metadata annotations (e.g. example=value)")
command.Flags().StringVarP(&outputFormat, "output", "o", "yaml", "Output format. One of: json|yaml")
command.Flags().BoolVarP(&inline, "inline", "i", false, "If set then generated resource is written back to the file specified in --file flag")
// Only complete files with appropriate extension.
err := command.Flags().SetAnnotation("file", cobra.BashCompFilenameExt, []string{"json", "yaml", "yml"})
errors.CheckError(err)
cmdutil.AddAppFlags(command, &appOpts)
return command
}
type appReconcileResult struct {
Name string `json:"name"`
Health *v1alpha1.HealthStatus `json:"health"`
Sync *v1alpha1.SyncStatus `json:"sync"`
Conditions []v1alpha1.ApplicationCondition `json:"conditions"`
}
type reconcileResults struct {
Applications []appReconcileResult `json:"applications"`
}
func (r *reconcileResults) getAppsMap() map[string]appReconcileResult {
res := map[string]appReconcileResult{}
for i := range r.Applications {
res[r.Applications[i].Name] = r.Applications[i]
}
return res
}
func printLine(format string, a ...interface{}) {
_, _ = fmt.Printf(format+"\n", a...)
}
func NewDiffReconcileResults() *cobra.Command {
var command = &cobra.Command{
Use: "diff-reconcile-results PATH1 PATH2",
Short: "Compare results of two reconciliations and print diff.",
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
path1 := args[0]
path2 := args[1]
var res1 reconcileResults
var res2 reconcileResults
errors.CheckError(config.UnmarshalLocalFile(path1, &res1))
errors.CheckError(config.UnmarshalLocalFile(path2, &res2))
errors.CheckError(diffReconcileResults(res1, res2))
},
}
return command
}
func toUnstructured(val interface{}) (*unstructured.Unstructured, error) {
data, err := json.Marshal(val)
if err != nil {
return nil, err
}
res := make(map[string]interface{})
err = json.Unmarshal(data, &res)
if err != nil {
return nil, err
}
return &unstructured.Unstructured{Object: res}, nil
}
type diffPair struct {
name string
first *unstructured.Unstructured
second *unstructured.Unstructured
}
func diffReconcileResults(res1 reconcileResults, res2 reconcileResults) error {
var pairs []diffPair
resMap1 := res1.getAppsMap()
resMap2 := res2.getAppsMap()
for k, v := range resMap1 {
firstUn, err := toUnstructured(v)
if err != nil {
return err
}
var secondUn *unstructured.Unstructured
second, ok := resMap2[k]
if ok {
secondUn, err = toUnstructured(second)
if err != nil {
return err
}
delete(resMap2, k)
}
pairs = append(pairs, diffPair{name: k, first: firstUn, second: secondUn})
}
for k, v := range resMap2 {
secondUn, err := toUnstructured(v)
if err != nil {
return err
}
pairs = append(pairs, diffPair{name: k, first: nil, second: secondUn})
}
sort.Slice(pairs, func(i, j int) bool {
return pairs[i].name < pairs[j].name
})
for _, item := range pairs {
printLine(item.name)
_ = cli.PrintDiff(item.name, item.first, item.second)
}
return nil
}
func NewReconcileCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
selector string
repoServerAddress string
outputFormat string
refresh bool
)
var command = &cobra.Command{
Use: "get-reconcile-results PATH",
Short: "Reconcile all applications and stores reconciliation summary in the specified file.",
Run: func(c *cobra.Command, args []string) {
// get rid of logging error handler
runtime.ErrorHandlers = runtime.ErrorHandlers[1:]
if len(args) != 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
outputPath := args[0]
errors.CheckError(os.Setenv(v1alpha1.EnvVarFakeInClusterConfig, "true"))
cfg, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
var result []appReconcileResult
if refresh {
if repoServerAddress == "" {
printLine("Repo server is not provided, trying to port-forward to argocd-repo-server pod.")
overrides := clientcmd.ConfigOverrides{}
repoServerPort, err := kubeutil.PortForward(8081, namespace, &overrides, "app.kubernetes.io/name=argocd-repo-server")
errors.CheckError(err)
repoServerAddress = fmt.Sprintf("localhost:%d", repoServerPort)
}
repoServerClient := apiclient.NewRepoServerClientset(repoServerAddress, 60, apiclient.TLSConfiguration{DisableTLS: false, StrictValidation: false})
appClientset := appclientset.NewForConfigOrDie(cfg)
kubeClientset := kubernetes.NewForConfigOrDie(cfg)
result, err = reconcileApplications(kubeClientset, appClientset, namespace, repoServerClient, selector, newLiveStateCache)
errors.CheckError(err)
} else {
appClientset := appclientset.NewForConfigOrDie(cfg)
result, err = getReconcileResults(appClientset, namespace, selector)
}
errors.CheckError(saveToFile(err, outputFormat, reconcileResults{Applications: result}, outputPath))
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
command.Flags().StringVar(&repoServerAddress, "repo-server", "", "Repo server address.")
command.Flags().StringVar(&selector, "l", "", "Label selector")
command.Flags().StringVar(&outputFormat, "o", "yaml", "Output format (yaml|json)")
command.Flags().BoolVar(&refresh, "refresh", false, "If set to true then recalculates apps reconciliation")
return command
}
func saveToFile(err error, outputFormat string, result reconcileResults, outputPath string) error {
errors.CheckError(err)
var data []byte
switch outputFormat {
case "yaml":
if data, err = yaml.Marshal(result); err != nil {
return err
}
case "json":
if data, err = json.Marshal(result); err != nil {
return err
}
default:
return fmt.Errorf("format %s is not supported", outputFormat)
}
return ioutil.WriteFile(outputPath, data, 0644)
}
func getReconcileResults(appClientset appclientset.Interface, namespace string, selector string) ([]appReconcileResult, error) {
appsList, err := appClientset.ArgoprojV1alpha1().Applications(namespace).List(context.Background(), v1.ListOptions{LabelSelector: selector})
if err != nil {
return nil, err
}
var items []appReconcileResult
for _, app := range appsList.Items {
items = append(items, appReconcileResult{
Name: app.Name,
Conditions: app.Status.Conditions,
Health: &app.Status.Health,
Sync: &app.Status.Sync,
})
}
return items, nil
}
func reconcileApplications(
kubeClientset kubernetes.Interface,
appClientset appclientset.Interface,
namespace string,
repoServerClient apiclient.Clientset,
selector string,
createLiveStateCache func(argoDB db.ArgoDB, appInformer kubecache.SharedIndexInformer, settingsMgr *settings.SettingsManager, server *metrics.MetricsServer) cache.LiveStateCache,
) ([]appReconcileResult, error) {
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace)
argoDB := db.NewDB(namespace, settingsMgr, kubeClientset)
appInformerFactory := appinformers.NewSharedInformerFactoryWithOptions(
appClientset,
1*time.Hour,
appinformers.WithNamespace(namespace),
appinformers.WithTweakListOptions(func(options *v1.ListOptions) {}),
)
appInformer := appInformerFactory.Argoproj().V1alpha1().Applications().Informer()
projInformer := appInformerFactory.Argoproj().V1alpha1().AppProjects().Informer()
go appInformer.Run(context.Background().Done())
go projInformer.Run(context.Background().Done())
if !kubecache.WaitForCacheSync(context.Background().Done(), appInformer.HasSynced, projInformer.HasSynced) {
return nil, fmt.Errorf("failed to sync cache")
}
appLister := appInformerFactory.Argoproj().V1alpha1().Applications().Lister()
projLister := appInformerFactory.Argoproj().V1alpha1().AppProjects().Lister()
server, err := metrics.NewMetricsServer("", appLister, func(obj interface{}) bool {
return true
}, func(r *http.Request) error {
return nil
}, []string{})
if err != nil {
return nil, err
}
stateCache := createLiveStateCache(argoDB, appInformer, settingsMgr, server)
if err := stateCache.Init(); err != nil {
return nil, err
}
cache := appstatecache.NewCache(
cacheutil.NewCache(cacheutil.NewInMemoryCache(1*time.Minute)),
1*time.Minute,
)
appStateManager := controller.NewAppStateManager(
argoDB, appClientset, repoServerClient, namespace, kubeutil.NewKubectl(), settingsMgr, stateCache, projInformer, server, cache, time.Second, argo.NewResourceTracking())
appsList, err := appClientset.ArgoprojV1alpha1().Applications(namespace).List(context.Background(), v1.ListOptions{LabelSelector: selector})
if err != nil {
return nil, err
}
sort.Slice(appsList.Items, func(i, j int) bool {
return appsList.Items[i].Spec.Destination.Server < appsList.Items[j].Spec.Destination.Server
})
var items []appReconcileResult
prevServer := ""
for _, app := range appsList.Items {
if prevServer != app.Spec.Destination.Server {
if prevServer != "" {
if clusterCache, err := stateCache.GetClusterCache(prevServer); err == nil {
clusterCache.Invalidate()
}
}
printLine("Reconciling apps of %s", app.Spec.Destination.Server)
prevServer = app.Spec.Destination.Server
}
printLine(app.Name)
proj, err := projLister.AppProjects(namespace).Get(app.Spec.Project)
if err != nil {
return nil, err
}
res := appStateManager.CompareAppState(&app, proj, app.Spec.Source.TargetRevision, app.Spec.Source, false, false, nil)
items = append(items, appReconcileResult{
Name: app.Name,
Conditions: app.Status.Conditions,
Health: res.GetHealthStatus(),
Sync: res.GetSyncStatus(),
})
}
return items, nil
}
func newLiveStateCache(argoDB db.ArgoDB, appInformer kubecache.SharedIndexInformer, settingsMgr *settings.SettingsManager, server *metrics.MetricsServer) cache.LiveStateCache {
return cache.NewLiveStateCache(argoDB, appInformer, settingsMgr, kubeutil.NewKubectl(), server, func(managedByApp map[string]bool, ref apiv1.ObjectReference) {}, nil, argo.NewResourceTracking())
}

View File

@@ -0,0 +1,181 @@
package admin
import (
"testing"
"github.com/argoproj/argo-cd/v2/test"
clustermocks "github.com/argoproj/gitops-engine/pkg/cache/mocks"
"github.com/argoproj/gitops-engine/pkg/health"
"github.com/argoproj/gitops-engine/pkg/utils/kube"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
kubefake "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/cache"
statecache "github.com/argoproj/argo-cd/v2/controller/cache"
cachemocks "github.com/argoproj/argo-cd/v2/controller/cache/mocks"
"github.com/argoproj/argo-cd/v2/controller/metrics"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
appfake "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned/fake"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient/mocks"
"github.com/argoproj/argo-cd/v2/util/db"
"github.com/argoproj/argo-cd/v2/util/settings"
)
func TestGetReconcileResults(t *testing.T) {
appClientset := appfake.NewSimpleClientset(&v1alpha1.Application{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
Namespace: "default",
},
Status: v1alpha1.ApplicationStatus{
Health: v1alpha1.HealthStatus{Status: health.HealthStatusHealthy},
Sync: v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
},
})
result, err := getReconcileResults(appClientset, "default", "")
if !assert.NoError(t, err) {
return
}
expectedResults := []appReconcileResult{{
Name: "test",
Health: &v1alpha1.HealthStatus{Status: health.HealthStatusHealthy},
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}}
assert.ElementsMatch(t, expectedResults, result)
}
func TestGetReconcileResults_Refresh(t *testing.T) {
cm := corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "argocd-cm",
Namespace: "default",
Labels: map[string]string{
"app.kubernetes.io/part-of": "argocd",
},
},
}
proj := &v1alpha1.AppProject{
ObjectMeta: metav1.ObjectMeta{
Name: "default",
Namespace: "default",
},
Spec: v1alpha1.AppProjectSpec{Destinations: []v1alpha1.ApplicationDestination{{Namespace: "*", Server: "*"}}},
}
app := &v1alpha1.Application{
ObjectMeta: metav1.ObjectMeta{
Name: "test",
Namespace: "default",
},
Spec: v1alpha1.ApplicationSpec{
Project: "default",
Destination: v1alpha1.ApplicationDestination{
Server: v1alpha1.KubernetesInternalAPIServerAddr,
Namespace: "default",
},
},
}
appClientset := appfake.NewSimpleClientset(app, proj)
deployment := test.NewDeployment()
kubeClientset := kubefake.NewSimpleClientset(deployment, &cm)
clusterCache := clustermocks.ClusterCache{}
clusterCache.On("IsNamespaced", mock.Anything).Return(true, nil)
repoServerClient := mocks.RepoServerServiceClient{}
repoServerClient.On("GenerateManifest", mock.Anything, mock.Anything).Return(&apiclient.ManifestResponse{
Manifests: []string{test.DeploymentManifest},
}, nil)
repoServerClientset := mocks.Clientset{RepoServerServiceClient: &repoServerClient}
liveStateCache := cachemocks.LiveStateCache{}
liveStateCache.On("GetManagedLiveObjs", mock.Anything, mock.Anything).Return(map[kube.ResourceKey]*unstructured.Unstructured{
kube.GetResourceKey(deployment): deployment,
}, nil)
liveStateCache.On("GetVersionsInfo", mock.Anything).Return("v1.2.3", nil, nil)
liveStateCache.On("Init").Return(nil, nil)
liveStateCache.On("GetClusterCache", mock.Anything).Return(&clusterCache, nil)
liveStateCache.On("IsNamespaced", mock.Anything, mock.Anything).Return(true, nil)
result, err := reconcileApplications(kubeClientset, appClientset, "default", &repoServerClientset, "",
func(argoDB db.ArgoDB, appInformer cache.SharedIndexInformer, settingsMgr *settings.SettingsManager, server *metrics.MetricsServer) statecache.LiveStateCache {
return &liveStateCache
},
)
if !assert.NoError(t, err) {
return
}
assert.Equal(t, result[0].Health.Status, health.HealthStatusMissing)
assert.Equal(t, result[0].Sync.Status, v1alpha1.SyncStatusCodeOutOfSync)
}
func TestDiffReconcileResults_NoDifferences(t *testing.T) {
logs, err := captureStdout(func() {
assert.NoError(t, diffReconcileResults(
reconcileResults{Applications: []appReconcileResult{{
Name: "app1",
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}}},
reconcileResults{Applications: []appReconcileResult{{
Name: "app1",
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}}},
))
})
assert.NoError(t, err)
assert.Equal(t, "app1\n", logs)
}
func TestDiffReconcileResults_DifferentApps(t *testing.T) {
logs, err := captureStdout(func() {
assert.NoError(t, diffReconcileResults(
reconcileResults{Applications: []appReconcileResult{{
Name: "app1",
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}, {
Name: "app2",
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}}},
reconcileResults{Applications: []appReconcileResult{{
Name: "app1",
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}, {
Name: "app3",
Sync: &v1alpha1.SyncStatus{Status: v1alpha1.SyncStatusCodeOutOfSync},
}}},
))
})
assert.NoError(t, err)
assert.Equal(t, `app1
app2
1,9d0
< conditions: null
< health: null
< name: app2
< sync:
< comparedTo:
< destination: {}
< source:
< repoURL: ""
< status: OutOfSync
app3
0a1,9
> conditions: null
> health: null
> name: app3
> sync:
> comparedTo:
> destination: {}
> source:
> repoURL: ""
> status: OutOfSync
`, logs)
}

View File

@@ -0,0 +1,351 @@
package admin
import (
"bufio"
"context"
"fmt"
"io"
"io/ioutil"
"os"
"github.com/argoproj/gitops-engine/pkg/utils/kube"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
apierr "k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
)
// NewExportCommand defines a new command for exporting Kubernetes and Argo CD resources.
func NewExportCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
out string
)
var command = cobra.Command{
Use: "export",
Short: "Export all Argo CD data to stdout (default) or a file",
Run: func(c *cobra.Command, args []string) {
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
var writer io.Writer
if out == "-" {
writer = os.Stdout
} else {
f, err := os.Create(out)
errors.CheckError(err)
bw := bufio.NewWriter(f)
writer = bw
defer func() {
err = bw.Flush()
errors.CheckError(err)
err = f.Close()
errors.CheckError(err)
}()
}
acdClients := newArgoCDClientsets(config, namespace)
acdConfigMap, err := acdClients.configMaps.Get(context.Background(), common.ArgoCDConfigMapName, v1.GetOptions{})
errors.CheckError(err)
export(writer, *acdConfigMap)
acdRBACConfigMap, err := acdClients.configMaps.Get(context.Background(), common.ArgoCDRBACConfigMapName, v1.GetOptions{})
errors.CheckError(err)
export(writer, *acdRBACConfigMap)
acdKnownHostsConfigMap, err := acdClients.configMaps.Get(context.Background(), common.ArgoCDKnownHostsConfigMapName, v1.GetOptions{})
errors.CheckError(err)
export(writer, *acdKnownHostsConfigMap)
acdTLSCertsConfigMap, err := acdClients.configMaps.Get(context.Background(), common.ArgoCDTLSCertsConfigMapName, v1.GetOptions{})
errors.CheckError(err)
export(writer, *acdTLSCertsConfigMap)
referencedSecrets := getReferencedSecrets(*acdConfigMap)
secrets, err := acdClients.secrets.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
for _, secret := range secrets.Items {
if isArgoCDSecret(referencedSecrets, secret) {
export(writer, secret)
}
}
projects, err := acdClients.projects.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
for _, proj := range projects.Items {
export(writer, proj)
}
applications, err := acdClients.applications.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
for _, app := range applications.Items {
export(writer, app)
}
applicationSets, err := acdClients.applicationSets.List(context.Background(), v1.ListOptions{})
if err != nil && !apierr.IsNotFound(err) {
if apierr.IsForbidden(err) {
log.Warn(err)
} else {
errors.CheckError(err)
}
}
if applicationSets != nil {
for _, appSet := range applicationSets.Items {
export(writer, appSet)
}
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().StringVarP(&out, "out", "o", "-", "Output to the specified file instead of stdout")
return &command
}
// NewImportCommand defines a new command for exporting Kubernetes and Argo CD resources.
func NewImportCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
prune bool
dryRun bool
verbose bool
)
var command = cobra.Command{
Use: "import SOURCE",
Short: "Import Argo CD data from stdin (specify `-') or a file",
Run: func(c *cobra.Command, args []string) {
if len(args) != 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
config.QPS = 100
config.Burst = 50
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
acdClients := newArgoCDClientsets(config, namespace)
var input []byte
if in := args[0]; in == "-" {
input, err = ioutil.ReadAll(os.Stdin)
} else {
input, err = ioutil.ReadFile(in)
}
errors.CheckError(err)
var dryRunMsg string
if dryRun {
dryRunMsg = " (dry run)"
}
// pruneObjects tracks live objects and it's current resource version. any remaining
// items in this map indicates the resource should be pruned since it no longer appears
// in the backup
pruneObjects := make(map[kube.ResourceKey]unstructured.Unstructured)
configMaps, err := acdClients.configMaps.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
// referencedSecrets holds any secrets referenced in the argocd-cm configmap. These
// secrets need to be imported too
var referencedSecrets map[string]bool
for _, cm := range configMaps.Items {
if isArgoCDConfigMap(cm.GetName()) {
pruneObjects[kube.ResourceKey{Group: "", Kind: "ConfigMap", Name: cm.GetName()}] = cm
}
if cm.GetName() == common.ArgoCDConfigMapName {
referencedSecrets = getReferencedSecrets(cm)
}
}
secrets, err := acdClients.secrets.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
for _, secret := range secrets.Items {
if isArgoCDSecret(referencedSecrets, secret) {
pruneObjects[kube.ResourceKey{Group: "", Kind: "Secret", Name: secret.GetName()}] = secret
}
}
applications, err := acdClients.applications.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
for _, app := range applications.Items {
pruneObjects[kube.ResourceKey{Group: "argoproj.io", Kind: "Application", Name: app.GetName()}] = app
}
projects, err := acdClients.projects.List(context.Background(), v1.ListOptions{})
errors.CheckError(err)
for _, proj := range projects.Items {
pruneObjects[kube.ResourceKey{Group: "argoproj.io", Kind: "AppProject", Name: proj.GetName()}] = proj
}
applicationSets, err := acdClients.applicationSets.List(context.Background(), v1.ListOptions{})
if apierr.IsForbidden(err) || apierr.IsNotFound(err) {
log.Warnf("argoproj.io/ApplicationSet: %v\n", err)
} else {
errors.CheckError(err)
}
if applicationSets != nil {
for _, appSet := range applicationSets.Items {
pruneObjects[kube.ResourceKey{Group: "argoproj.io", Kind: "ApplicationSet", Name: appSet.GetName()}] = appSet
}
}
// Create or replace existing object
backupObjects, err := kube.SplitYAML(input)
errors.CheckError(err)
for _, bakObj := range backupObjects {
gvk := bakObj.GroupVersionKind()
key := kube.ResourceKey{Group: gvk.Group, Kind: gvk.Kind, Name: bakObj.GetName()}
liveObj, exists := pruneObjects[key]
delete(pruneObjects, key)
var dynClient dynamic.ResourceInterface
switch bakObj.GetKind() {
case "Secret":
dynClient = acdClients.secrets
case "ConfigMap":
dynClient = acdClients.configMaps
case "AppProject":
dynClient = acdClients.projects
case "Application":
dynClient = acdClients.applications
case "ApplicationSet":
dynClient = acdClients.applicationSets
}
if !exists {
isForbidden := false
if !dryRun {
_, err = dynClient.Create(context.Background(), bakObj, v1.CreateOptions{})
if apierr.IsForbidden(err) || apierr.IsNotFound(err) {
isForbidden = true
log.Warnf("%s/%s %s: %v", gvk.Group, gvk.Kind, bakObj.GetName(), err)
} else {
errors.CheckError(err)
}
}
if !isForbidden {
fmt.Printf("%s/%s %s created%s\n", gvk.Group, gvk.Kind, bakObj.GetName(), dryRunMsg)
}
} else if specsEqual(*bakObj, liveObj) {
if verbose {
fmt.Printf("%s/%s %s unchanged%s\n", gvk.Group, gvk.Kind, bakObj.GetName(), dryRunMsg)
}
} else {
isForbidden := false
if !dryRun {
newLive := updateLive(bakObj, &liveObj)
_, err = dynClient.Update(context.Background(), newLive, v1.UpdateOptions{})
if apierr.IsForbidden(err) || apierr.IsNotFound(err) {
isForbidden = true
log.Warnf("%s/%s %s: %v", gvk.Group, gvk.Kind, bakObj.GetName(), err)
} else {
errors.CheckError(err)
}
}
if !isForbidden {
fmt.Printf("%s/%s %s updated%s\n", gvk.Group, gvk.Kind, bakObj.GetName(), dryRunMsg)
}
}
}
// Delete objects not in backup
for key, liveObj := range pruneObjects {
if prune {
var dynClient dynamic.ResourceInterface
switch key.Kind {
case "Secret":
dynClient = acdClients.secrets
case "AppProject":
dynClient = acdClients.projects
case "Application":
dynClient = acdClients.applications
if !dryRun {
if finalizers := liveObj.GetFinalizers(); len(finalizers) > 0 {
newLive := liveObj.DeepCopy()
newLive.SetFinalizers(nil)
_, err = dynClient.Update(context.Background(), newLive, v1.UpdateOptions{})
if err != nil && !apierr.IsNotFound(err) {
errors.CheckError(err)
}
}
}
case "ApplicationSet":
dynClient = acdClients.applicationSets
default:
log.Fatalf("Unexpected kind '%s' in prune list", key.Kind)
}
isForbidden := false
if !dryRun {
err = dynClient.Delete(context.Background(), key.Name, v1.DeleteOptions{})
if apierr.IsForbidden(err) || apierr.IsNotFound(err) {
isForbidden = true
log.Warnf("%s/%s %s: %v\n", key.Group, key.Kind, key.Name, err)
} else {
errors.CheckError(err)
}
}
if !isForbidden {
fmt.Printf("%s/%s %s pruned%s\n", key.Group, key.Kind, key.Name, dryRunMsg)
}
} else {
fmt.Printf("%s/%s %s needs pruning\n", key.Group, key.Kind, key.Name)
}
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().BoolVar(&dryRun, "dry-run", false, "Print what will be performed")
command.Flags().BoolVar(&prune, "prune", false, "Prune secrets, applications and projects which do not appear in the backup")
command.Flags().BoolVar(&verbose, "verbose", false, "Verbose output (versus only changed output)")
return &command
}
// export writes the unstructured object and removes extraneous cruft from output before writing
func export(w io.Writer, un unstructured.Unstructured) {
name := un.GetName()
finalizers := un.GetFinalizers()
apiVersion := un.GetAPIVersion()
kind := un.GetKind()
labels := un.GetLabels()
annotations := un.GetAnnotations()
unstructured.RemoveNestedField(un.Object, "metadata")
un.SetName(name)
un.SetFinalizers(finalizers)
un.SetAPIVersion(apiVersion)
un.SetKind(kind)
un.SetLabels(labels)
un.SetAnnotations(annotations)
data, err := yaml.Marshal(un.Object)
errors.CheckError(err)
_, err = w.Write(data)
errors.CheckError(err)
_, err = w.Write([]byte(yamlSeparator))
errors.CheckError(err)
}
// updateLive replaces the live object's finalizers, spec, annotations, labels, and data from the
// backup object but leaves all other fields intact (status, other metadata, etc...)
func updateLive(bak, live *unstructured.Unstructured) *unstructured.Unstructured {
newLive := live.DeepCopy()
newLive.SetAnnotations(bak.GetAnnotations())
newLive.SetLabels(bak.GetLabels())
newLive.SetFinalizers(bak.GetFinalizers())
switch live.GetKind() {
case "Secret", "ConfigMap":
newLive.Object["data"] = bak.Object["data"]
case "AppProject":
newLive.Object["spec"] = bak.Object["spec"]
case "Application":
newLive.Object["spec"] = bak.Object["spec"]
if _, ok := bak.Object["status"]; ok {
newLive.Object["status"] = bak.Object["status"]
}
case "ApplicationSet":
newLive.Object["spec"] = bak.Object["spec"]
}
return newLive
}

View File

@@ -0,0 +1,617 @@
package admin
import (
"context"
"fmt"
"math"
"os"
"sort"
"strings"
"text/tabwriter"
"time"
"github.com/argoproj/gitops-engine/pkg/utils/kube"
"github.com/go-redis/redis/v8"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/controller/sharding"
argoappv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
"github.com/argoproj/argo-cd/v2/util/argo"
cacheutil "github.com/argoproj/argo-cd/v2/util/cache"
appstatecache "github.com/argoproj/argo-cd/v2/util/cache/appstate"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/clusterauth"
"github.com/argoproj/argo-cd/v2/util/db"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/glob"
kubeutil "github.com/argoproj/argo-cd/v2/util/kube"
"github.com/argoproj/argo-cd/v2/util/settings"
"github.com/argoproj/argo-cd/v2/util/text/label"
)
func NewClusterCommand(pathOpts *clientcmd.PathOptions) *cobra.Command {
var command = &cobra.Command{
Use: "cluster",
Short: "Manage clusters configuration",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewClusterConfig())
command.AddCommand(NewGenClusterConfigCommand(pathOpts))
command.AddCommand(NewClusterStatsCommand())
command.AddCommand(NewClusterShardsCommand())
namespacesCommand := NewClusterNamespacesCommand()
namespacesCommand.AddCommand(NewClusterEnableNamespacedMode())
namespacesCommand.AddCommand(NewClusterDisableNamespacedMode())
command.AddCommand(namespacesCommand)
return command
}
type ClusterWithInfo struct {
argoappv1.Cluster
// Shard holds controller shard number that handles the cluster
Shard int
// Namespaces holds list of namespaces managed by Argo CD in the cluster
Namespaces []string
}
func loadClusters(kubeClient *kubernetes.Clientset, appClient *versioned.Clientset, replicas int, namespace string, portForwardRedis bool, cacheSrc func() (*appstatecache.Cache, error), shard int) ([]ClusterWithInfo, error) {
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClient, namespace)
argoDB := db.NewDB(namespace, settingsMgr, kubeClient)
clustersList, err := argoDB.ListClusters(context.Background())
if err != nil {
return nil, err
}
var cache *appstatecache.Cache
if portForwardRedis {
overrides := clientcmd.ConfigOverrides{}
port, err := kubeutil.PortForward(6379, namespace, &overrides,
"app.kubernetes.io/name=argocd-redis-ha-haproxy", "app.kubernetes.io/name=argocd-redis")
if err != nil {
return nil, err
}
client := redis.NewClient(&redis.Options{Addr: fmt.Sprintf("localhost:%d", port)})
cache = appstatecache.NewCache(cacheutil.NewCache(cacheutil.NewRedisCache(client, time.Hour)), time.Hour)
} else {
cache, err = cacheSrc()
if err != nil {
return nil, err
}
}
appItems, err := appClient.ArgoprojV1alpha1().Applications(namespace).List(context.Background(), v1.ListOptions{})
if err != nil {
return nil, err
}
apps := appItems.Items
for i, app := range apps {
err := argo.ValidateDestination(context.Background(), &app.Spec.Destination, argoDB)
if err != nil {
return nil, err
}
apps[i] = app
}
clusters := make([]ClusterWithInfo, len(clustersList.Items))
batchSize := 10
batchesCount := int(math.Ceil(float64(len(clusters)) / float64(batchSize)))
for batchNum := 0; batchNum < batchesCount; batchNum++ {
batchStart := batchSize * batchNum
batchEnd := batchSize * (batchNum + 1)
if batchEnd > len(clustersList.Items) {
batchEnd = len(clustersList.Items)
}
batch := clustersList.Items[batchStart:batchEnd]
_ = kube.RunAllAsync(len(batch), func(i int) error {
cluster := batch[i]
clusterShard := 0
if replicas > 0 {
clusterShard = sharding.GetShardByID(cluster.ID, replicas)
}
if shard != -1 && clusterShard != shard {
return nil
}
nsSet := map[string]bool{}
for _, app := range apps {
if app.Spec.Destination.Server == cluster.Server {
nsSet[app.Spec.Destination.Namespace] = true
}
}
var namespaces []string
for ns := range nsSet {
namespaces = append(namespaces, ns)
}
_ = cache.GetClusterInfo(cluster.Server, &cluster.Info)
clusters[batchStart+i] = ClusterWithInfo{cluster, clusterShard, namespaces}
return nil
})
}
return clusters, nil
}
func getControllerReplicas(kubeClient *kubernetes.Clientset, namespace string) (int, error) {
controllerPods, err := kubeClient.CoreV1().Pods(namespace).List(context.Background(), v1.ListOptions{
LabelSelector: "app.kubernetes.io/name=argocd-application-controller"})
if err != nil {
return 0, err
}
return len(controllerPods.Items), nil
}
func NewClusterShardsCommand() *cobra.Command {
var (
shard int
replicas int
clientConfig clientcmd.ClientConfig
cacheSrc func() (*appstatecache.Cache, error)
portForwardRedis bool
)
var command = cobra.Command{
Use: "shards",
Short: "Print information about each controller shard and portion of Kubernetes resources it is responsible for.",
Run: func(cmd *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
clientCfg, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeClient := kubernetes.NewForConfigOrDie(clientCfg)
appClient := versioned.NewForConfigOrDie(clientCfg)
if replicas == 0 {
replicas, err = getControllerReplicas(kubeClient, namespace)
errors.CheckError(err)
}
if replicas == 0 {
return
}
clusters, err := loadClusters(kubeClient, appClient, replicas, namespace, portForwardRedis, cacheSrc, shard)
errors.CheckError(err)
if len(clusters) == 0 {
return
}
printStatsSummary(clusters)
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().IntVar(&shard, "shard", -1, "Cluster shard filter")
command.Flags().IntVar(&replicas, "replicas", 0, "Application controller replicas count. Inferred from number of running controller pods if not specified")
command.Flags().BoolVar(&portForwardRedis, "port-forward-redis", true, "Automatically port-forward ha proxy redis from current namespace?")
cacheSrc = appstatecache.AddCacheFlagsToCmd(&command)
return &command
}
func printStatsSummary(clusters []ClusterWithInfo) {
totalResourcesCount := int64(0)
resourcesCountByShard := map[int]int64{}
for _, c := range clusters {
totalResourcesCount += c.Info.CacheInfo.ResourcesCount
resourcesCountByShard[c.Shard] += c.Info.CacheInfo.ResourcesCount
}
avgResourcesByShard := totalResourcesCount / int64(len(resourcesCountByShard))
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
_, _ = fmt.Fprintf(w, "SHARD\tRESOURCES COUNT\n")
for shard := 0; shard < len(resourcesCountByShard); shard++ {
cnt := resourcesCountByShard[shard]
percent := (float64(cnt) / float64(avgResourcesByShard)) * 100.0
_, _ = fmt.Fprintf(w, "%d\t%s\n", shard, fmt.Sprintf("%d (%.0f%%)", cnt, percent))
}
_ = w.Flush()
}
func runClusterNamespacesCommand(clientConfig clientcmd.ClientConfig, action func(appClient *versioned.Clientset, argoDB db.ArgoDB, clusters map[string][]string) error) error {
clientCfg, err := clientConfig.ClientConfig()
if err != nil {
return err
}
namespace, _, err := clientConfig.Namespace()
if err != nil {
return err
}
kubeClient := kubernetes.NewForConfigOrDie(clientCfg)
appClient := versioned.NewForConfigOrDie(clientCfg)
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClient, namespace)
argoDB := db.NewDB(namespace, settingsMgr, kubeClient)
clustersList, err := argoDB.ListClusters(context.Background())
if err != nil {
return err
}
appItems, err := appClient.ArgoprojV1alpha1().Applications(namespace).List(context.Background(), v1.ListOptions{})
if err != nil {
return err
}
apps := appItems.Items
for i, app := range apps {
err := argo.ValidateDestination(context.Background(), &app.Spec.Destination, argoDB)
if err != nil {
return err
}
apps[i] = app
}
clusters := map[string][]string{}
for _, cluster := range clustersList.Items {
nsSet := map[string]bool{}
for _, app := range apps {
if app.Spec.Destination.Server != cluster.Server {
continue
}
// Use namespaces of actually deployed resources, since some application use dummy target namespace
// If resources list is empty then use target namespace
if len(app.Status.Resources) != 0 {
for _, res := range app.Status.Resources {
if res.Namespace != "" {
nsSet[res.Namespace] = true
}
}
} else {
if app.Spec.Destination.Server == cluster.Server {
nsSet[app.Spec.Destination.Namespace] = true
}
}
}
var namespaces []string
for ns := range nsSet {
namespaces = append(namespaces, ns)
}
clusters[cluster.Server] = namespaces
}
return action(appClient, argoDB, clusters)
}
func NewClusterNamespacesCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
)
var command = cobra.Command{
Use: "namespaces",
Short: "Print information namespaces which Argo CD manages in each cluster.",
Run: func(cmd *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
err := runClusterNamespacesCommand(clientConfig, func(appClient *versioned.Clientset, _ db.ArgoDB, clusters map[string][]string) error {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
_, _ = fmt.Fprintf(w, "CLUSTER\tNAMESPACES\n")
for cluster, namespaces := range clusters {
// print shortest namespace names first
sort.Slice(namespaces, func(i, j int) bool {
return len(namespaces[j]) > len(namespaces[i])
})
namespacesStr := ""
if len(namespaces) > 4 {
namespacesStr = fmt.Sprintf("%s (total %d)", strings.Join(namespaces[:4], ","), len(namespaces))
} else {
namespacesStr = strings.Join(namespaces, ",")
}
_, _ = fmt.Fprintf(w, "%s\t%s\n", cluster, namespacesStr)
}
_ = w.Flush()
return nil
})
errors.CheckError(err)
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
return &command
}
func NewClusterEnableNamespacedMode() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
dryRun bool
clusterResources bool
namespacesCount int
)
var command = cobra.Command{
Use: "enable-namespaced-mode PATTERN",
Short: "Enable namespaced mode for clusters which name matches to the specified pattern.",
Run: func(cmd *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
if len(args) == 0 {
cmd.HelpFunc()(cmd, args)
os.Exit(1)
}
pattern := args[0]
errors.CheckError(runClusterNamespacesCommand(clientConfig, func(_ *versioned.Clientset, argoDB db.ArgoDB, clusters map[string][]string) error {
for server, namespaces := range clusters {
if len(namespaces) == 0 || len(namespaces) > namespacesCount || !glob.Match(pattern, server) {
continue
}
cluster, err := argoDB.GetCluster(context.Background(), server)
if err != nil {
return err
}
cluster.Namespaces = namespaces
cluster.ClusterResources = clusterResources
fmt.Printf("Setting cluster %s namespaces to %v...", server, namespaces)
if !dryRun {
_, err = argoDB.UpdateCluster(context.Background(), cluster)
if err != nil {
return err
}
fmt.Println("done")
} else {
fmt.Println("done (dry run)")
}
}
return nil
}))
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().BoolVar(&dryRun, "dry-run", true, "Print what will be performed")
command.Flags().BoolVar(&clusterResources, "cluster-resources", false, "Indicates if cluster level resources should be managed.")
command.Flags().IntVar(&namespacesCount, "max-namespace-count", 0, "Max number of namespaces that cluster should managed managed namespaces is less or equal to specified count")
return &command
}
func NewClusterDisableNamespacedMode() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
dryRun bool
)
var command = cobra.Command{
Use: "disable-namespaced-mode PATTERN",
Short: "Disable namespaced mode for clusters which name matches to the specified pattern.",
Run: func(cmd *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
if len(args) == 0 {
cmd.HelpFunc()(cmd, args)
os.Exit(1)
}
pattern := args[0]
errors.CheckError(runClusterNamespacesCommand(clientConfig, func(_ *versioned.Clientset, argoDB db.ArgoDB, clusters map[string][]string) error {
for server := range clusters {
if !glob.Match(pattern, server) {
continue
}
cluster, err := argoDB.GetCluster(context.Background(), server)
if err != nil {
return err
}
if len(cluster.Namespaces) == 0 {
continue
}
cluster.Namespaces = nil
fmt.Printf("Disabling namespaced mode for cluster %s...", server)
if !dryRun {
_, err = argoDB.UpdateCluster(context.Background(), cluster)
if err != nil {
return err
}
fmt.Println("done")
} else {
fmt.Println("done (dry run)")
}
}
return nil
}))
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().BoolVar(&dryRun, "dry-run", true, "Print what will be performed")
return &command
}
func NewClusterStatsCommand() *cobra.Command {
var (
shard int
replicas int
clientConfig clientcmd.ClientConfig
cacheSrc func() (*appstatecache.Cache, error)
portForwardRedis bool
)
var command = cobra.Command{
Use: "stats",
Short: "Prints information cluster statistics and inferred shard number",
Run: func(cmd *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
clientCfg, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeClient := kubernetes.NewForConfigOrDie(clientCfg)
appClient := versioned.NewForConfigOrDie(clientCfg)
if replicas == 0 {
replicas, err = getControllerReplicas(kubeClient, namespace)
errors.CheckError(err)
}
clusters, err := loadClusters(kubeClient, appClient, replicas, namespace, portForwardRedis, cacheSrc, shard)
errors.CheckError(err)
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
_, _ = fmt.Fprintf(w, "SERVER\tSHARD\tCONNECTION\tNAMESPACES COUNT\tAPPS COUNT\tRESOURCES COUNT\n")
for _, cluster := range clusters {
_, _ = fmt.Fprintf(w, "%s\t%d\t%s\t%d\t%d\t%d\n", cluster.Server, cluster.Shard, cluster.Info.ConnectionState.Status, len(cluster.Namespaces), cluster.Info.ApplicationsCount, cluster.Info.CacheInfo.ResourcesCount)
}
_ = w.Flush()
},
}
clientConfig = cli.AddKubectlFlagsToCmd(&command)
command.Flags().IntVar(&shard, "shard", -1, "Cluster shard filter")
command.Flags().IntVar(&replicas, "replicas", 0, "Application controller replicas count. Inferred from number of running controller pods if not specified")
command.Flags().BoolVar(&portForwardRedis, "port-forward-redis", true, "Automatically port-forward ha proxy redis from current namespace?")
cacheSrc = appstatecache.AddCacheFlagsToCmd(&command)
return &command
}
// NewClusterConfig returns a new instance of `argocd admin kubeconfig` command
func NewClusterConfig() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
)
var command = &cobra.Command{
Use: "kubeconfig CLUSTER_URL OUTPUT_PATH",
Short: "Generates kubeconfig for the specified cluster",
DisableAutoGenTag: true,
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
serverUrl := args[0]
output := args[1]
conf, err := clientConfig.ClientConfig()
errors.CheckError(err)
namespace, _, err := clientConfig.Namespace()
errors.CheckError(err)
kubeclientset, err := kubernetes.NewForConfig(conf)
errors.CheckError(err)
cluster, err := db.NewDB(namespace, settings.NewSettingsManager(context.Background(), kubeclientset, namespace), kubeclientset).GetCluster(context.Background(), serverUrl)
errors.CheckError(err)
err = kube.WriteKubeConfig(cluster.RawRestConfig(), namespace, output)
errors.CheckError(err)
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
return command
}
func NewGenClusterConfigCommand(pathOpts *clientcmd.PathOptions) *cobra.Command {
var (
clusterOpts cmdutil.ClusterOptions
bearerToken string
generateToken bool
outputFormat string
labels []string
annotations []string
)
var command = &cobra.Command{
Use: "generate-spec CONTEXT",
Short: "Generate declarative config for a cluster",
Run: func(c *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
var configAccess clientcmd.ConfigAccess = pathOpts
if len(args) == 0 {
log.Error("Choose a context name from:")
cmdutil.PrintKubeContexts(configAccess)
os.Exit(1)
}
cfgAccess, err := configAccess.GetStartingConfig()
errors.CheckError(err)
contextName := args[0]
clstContext := cfgAccess.Contexts[contextName]
if clstContext == nil {
log.Fatalf("Context %s does not exist in kubeconfig", contextName)
return
}
overrides := clientcmd.ConfigOverrides{
Context: *clstContext,
}
clientConfig := clientcmd.NewDefaultClientConfig(*cfgAccess, &overrides)
conf, err := clientConfig.ClientConfig()
errors.CheckError(err)
kubeClientset := fake.NewSimpleClientset()
var awsAuthConf *argoappv1.AWSAuthConfig
var execProviderConf *argoappv1.ExecProviderConfig
if clusterOpts.AwsClusterName != "" {
awsAuthConf = &argoappv1.AWSAuthConfig{
ClusterName: clusterOpts.AwsClusterName,
RoleARN: clusterOpts.AwsRoleArn,
}
} else if clusterOpts.ExecProviderCommand != "" {
execProviderConf = &argoappv1.ExecProviderConfig{
Command: clusterOpts.ExecProviderCommand,
Args: clusterOpts.ExecProviderArgs,
Env: clusterOpts.ExecProviderEnv,
APIVersion: clusterOpts.ExecProviderAPIVersion,
InstallHint: clusterOpts.ExecProviderInstallHint,
}
} else if generateToken {
bearerToken, err = GenerateToken(clusterOpts, conf)
errors.CheckError(err)
} else if bearerToken == "" {
bearerToken = "bearer-token"
}
if clusterOpts.Name != "" {
contextName = clusterOpts.Name
}
labelsMap, err := label.Parse(labels)
errors.CheckError(err)
annotationsMap, err := label.Parse(annotations)
errors.CheckError(err)
clst := cmdutil.NewCluster(contextName, clusterOpts.Namespaces, clusterOpts.ClusterResources, conf, bearerToken, awsAuthConf, execProviderConf, labelsMap, annotationsMap)
if clusterOpts.InCluster {
clst.Server = argoappv1.KubernetesInternalAPIServerAddr
}
if clusterOpts.Shard >= 0 {
clst.Shard = &clusterOpts.Shard
}
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, ArgoCDNamespace)
argoDB := db.NewDB(ArgoCDNamespace, settingsMgr, kubeClientset)
_, err = argoDB.CreateCluster(context.Background(), clst)
errors.CheckError(err)
secName, err := db.URIToSecretName("cluster", clst.Server)
errors.CheckError(err)
secret, err := kubeClientset.CoreV1().Secrets(ArgoCDNamespace).Get(context.Background(), secName, v1.GetOptions{})
errors.CheckError(err)
errors.CheckError(PrintResources(outputFormat, os.Stdout, secret))
},
}
command.PersistentFlags().StringVar(&pathOpts.LoadingRules.ExplicitPath, pathOpts.ExplicitFileFlag, pathOpts.LoadingRules.ExplicitPath, "use a particular kubeconfig file")
command.Flags().StringVar(&bearerToken, "bearer-token", "", "Authentication token that should be used to access K8S API server")
command.Flags().BoolVar(&generateToken, "generate-bearer-token", false, "Generate authentication token that should be used to access K8S API server")
command.Flags().StringVar(&clusterOpts.ServiceAccount, "service-account", "argocd-manager", fmt.Sprintf("System namespace service account to use for kubernetes resource management. If not set then default \"%s\" SA will be used", clusterauth.ArgoCDManagerServiceAccount))
command.Flags().StringVar(&clusterOpts.SystemNamespace, "system-namespace", common.DefaultSystemNamespace, "Use different system namespace")
command.Flags().StringVarP(&outputFormat, "output", "o", "yaml", "Output format. One of: json|yaml")
command.Flags().StringArrayVar(&labels, "label", nil, "Set metadata labels (e.g. --label key=value)")
command.Flags().StringArrayVar(&annotations, "annotation", nil, "Set metadata annotations (e.g. --annotation key=value)")
cmdutil.AddClusterFlags(command, &clusterOpts)
return command
}
func GenerateToken(clusterOpts cmdutil.ClusterOptions, conf *rest.Config) (string, error) {
clientset, err := kubernetes.NewForConfig(conf)
errors.CheckError(err)
bearerToken, err := clusterauth.GetServiceAccountBearerToken(clientset, clusterOpts.SystemNamespace, clusterOpts.ServiceAccount)
if err != nil {
return "", err
}
return bearerToken, nil
}

View File

@@ -0,0 +1,30 @@
package admin
import (
"context"
"fmt"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/v2/cmd/argocd/commands/headless"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/pkg/apiclient"
)
func NewDashboardCommand() *cobra.Command {
var (
port int
)
cmd := &cobra.Command{
Use: "dashboard",
Short: "Starts Argo CD Web UI locally",
Run: func(cmd *cobra.Command, args []string) {
println(fmt.Sprintf("Argo CD UI is available at http://localhost:%d", port))
<-context.Background().Done()
},
}
clientOpts := &apiclient.ClientOptions{Core: true}
headless.InitCommand(cmd, clientOpts, &port)
cmd.Flags().IntVar(&port, "port", common.DefaultPortAPIServer, "Listen on given port")
return cmd
}

View File

@@ -0,0 +1,108 @@
package admin
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"github.com/argoproj/gitops-engine/pkg/utils/kube"
"github.com/ghodss/yaml"
v1 "k8s.io/api/core/v1"
ioutil "github.com/argoproj/argo-cd/v2/util/io"
)
func getOutWriter(inline bool, filePath string) (io.Writer, io.Closer, error) {
if !inline {
return os.Stdout, ioutil.NopCloser, nil
}
if filePath == "" {
return nil, nil, errors.New("The file path must be specified using flag '--file'")
}
err := os.Rename(filePath, fmt.Sprintf("%s.back", filePath))
if err != nil {
return nil, nil, err
}
fileOut, err := os.Create(filePath)
if err != nil {
return nil, nil, err
}
return fileOut, fileOut, nil
}
// PrintResources prints a single resource in YAML or JSON format to stdout according to the output format
func PrintResources(output string, out io.Writer, resources ...interface{}) error {
for i, resource := range resources {
if secret, ok := resource.(*v1.Secret); ok {
convertSecretData(secret)
}
filteredResource, err := omitFields(resource)
if err != nil {
return err
}
resources[i] = filteredResource
}
var obj interface{} = resources
if len(resources) == 1 {
obj = resources[0]
}
switch output {
case "json":
jsonBytes, err := json.MarshalIndent(obj, "", " ")
if err != nil {
return err
}
_, _ = fmt.Fprintln(out, string(jsonBytes))
case "yaml":
yamlBytes, err := yaml.Marshal(obj)
if err != nil {
return err
}
// marshaled YAML already ends with the new line character
_, _ = fmt.Fprint(out, string(yamlBytes))
default:
return fmt.Errorf("unknown output format: %s", output)
}
return nil
}
// omit fields such as status, creationTimestamp and metadata.namespace in k8s objects
func omitFields(resource interface{}) (interface{}, error) {
jsonBytes, err := json.Marshal(resource)
if err != nil {
return nil, err
}
toMap := make(map[string]interface{})
err = json.Unmarshal(jsonBytes, &toMap)
if err != nil {
return nil, err
}
delete(toMap, "status")
if v, ok := toMap["metadata"]; ok {
if metadata, ok := v.(map[string]interface{}); ok {
delete(metadata, "creationTimestamp")
delete(metadata, "namespace")
}
}
return toMap, nil
}
// convertSecretData converts kubernetes secret's data to stringData
func convertSecretData(secret *v1.Secret) {
secret.Kind = kube.SecretKind
secret.APIVersion = "v1"
secret.StringData = map[string]string{}
for k, v := range secret.Data {
secret.StringData[k] = string(v)
}
secret.Data = map[string][]byte{}
}

View File

@@ -0,0 +1,58 @@
package admin
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/argoproj/argo-cd/v2/util/io"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func TestGetOutWriter_InlineOff(t *testing.T) {
out, closer, err := getOutWriter(false, "")
require.NoError(t, err)
defer io.Close(closer)
assert.Equal(t, os.Stdout, out)
}
func TestGetOutWriter_InlineOn(t *testing.T) {
tmpFile, err := ioutil.TempFile("", "")
require.NoError(t, err)
defer func() {
_ = os.Remove(tmpFile.Name())
_ = os.Remove(fmt.Sprintf("%s.back", tmpFile.Name()))
}()
out, closer, err := getOutWriter(true, tmpFile.Name())
require.NoError(t, err)
defer io.Close(closer)
assert.Equal(t, tmpFile.Name(), out.(*os.File).Name())
_, err = os.Stat(fmt.Sprintf("%s.back", tmpFile.Name()))
assert.NoError(t, err, "Back file must be created")
}
func TestPrintResources_Secret_YAML(t *testing.T) {
out := bytes.Buffer{}
err := PrintResources("yaml", &out, &v1.Secret{
ObjectMeta: metav1.ObjectMeta{Name: "my-secret"},
Data: map[string][]byte{"my-secret-key": []byte("my-secret-data")},
})
assert.NoError(t, err)
assert.Equal(t, `apiVersion: v1
kind: Secret
metadata:
name: my-secret
stringData:
my-secret-key: my-secret-data
`, out.String())
}

View File

@@ -1,19 +1,21 @@
package main
package admin
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/argoproj/argo-cd/errors"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
appclientset "github.com/argoproj/argo-cd/pkg/client/clientset/versioned"
appclient "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/typed/application/v1alpha1"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/diff"
"github.com/argoproj/argo-cd/util/kube"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
appclient "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned/typed/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/gitops-engine/pkg/utils/kube"
"github.com/spf13/cobra"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/tools/clientcmd"
@@ -21,13 +23,50 @@ import (
func NewProjectsCommand() *cobra.Command {
var command = &cobra.Command{
Use: "projects",
Use: "proj",
Short: "Manage projects configuration",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewGenProjectSpecCommand())
command.AddCommand(NewUpdatePolicyRuleCommand())
command.AddCommand(NewProjectAllowListGenCommand())
return command
}
// NewGenProjectSpecCommand generates declarative configuration file for given project
func NewGenProjectSpecCommand() *cobra.Command {
var (
opts cmdutil.ProjectOpts
fileURL string
outputFormat string
inline bool
)
var command = &cobra.Command{
Use: "generate-spec PROJECT",
Short: "Generate declarative config for a project",
Run: func(c *cobra.Command, args []string) {
proj, err := cmdutil.ConstructAppProj(fileURL, args, opts, c)
errors.CheckError(err)
out, closer, err := getOutWriter(inline, fileURL)
errors.CheckError(err)
defer io.Close(closer)
errors.CheckError(PrintResources(outputFormat, out, proj))
},
}
command.Flags().StringVarP(&outputFormat, "output", "o", "yaml", "Output format. One of: json|yaml")
command.Flags().StringVarP(&fileURL, "file", "f", "", "Filename or URL to Kubernetes manifests for the project")
command.Flags().BoolVarP(&inline, "inline", "i", false, "If set then generated resource is written back to the file specified in --file flag")
// Only complete files with appropriate extension.
err := command.Flags().SetAnnotation("file", cobra.BashCompFilenameExt, []string{"json", "yaml", "yml"})
errors.CheckError(err)
cmdutil.AddProjFlags(command, &opts)
return command
}
@@ -69,9 +108,9 @@ func saveProject(updated v1alpha1.AppProject, orig v1alpha1.AppProject, projects
if err != nil {
return err
}
_ = diff.PrintDiff(updated.Name, target, live)
_ = cli.PrintDiff(updated.Name, target, live)
if !dryRun {
_, err = projectsIf.Update(&updated)
_, err = projectsIf.Update(context.Background(), &updated, v1.UpdateOptions{})
if err != nil {
return err
}
@@ -104,10 +143,10 @@ func NewUpdatePolicyRuleCommand() *cobra.Command {
Use: "update-role-policy PROJECT_GLOB MODIFICATION ACTION",
Short: "Implement bulk project role update. Useful to back-fill existing project policies or remove obsolete actions.",
Example: ` # Add policy that allows executing any action (action/*) to roles which name matches to *deployer* in all projects
argocd-util projects update-role-policy '*' set 'action/*' --role '*deployer*' --resource applications --scope '*' --permission allow
argocd admin projects update-role-policy '*' set 'action/*' --role '*deployer*' --resource applications --scope '*' --permission allow
# Remove policy that which manages running (action/*) from all roles which name matches *deployer* in all projects
argocd-util projects update-role-policy '*' remove override --role '*deployer*'
argocd admin projects update-role-policy '*' remove override --role '*deployer*'
`,
Run: func(c *cobra.Command, args []string) {
if len(args) != 3 {
@@ -145,7 +184,7 @@ func NewUpdatePolicyRuleCommand() *cobra.Command {
}
func updateProjects(projIf appclient.AppProjectInterface, projectGlob string, rolePattern string, action string, modification func(string, string) string, dryRun bool) error {
projects, err := projIf.List(v1.ListOptions{})
projects, err := projIf.List(context.Background(), v1.ListOptions{})
if err != nil {
return err
}

View File

@@ -0,0 +1,144 @@
package admin
import (
"bufio"
"io"
"io/ioutil"
"os"
"strings"
"github.com/ghodss/yaml"
"github.com/spf13/cobra"
rbacv1 "k8s.io/api/rbac/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/cli"
// load the gcp plugin (required to authenticate against GKE clusters).
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
// load the oidc plugin (required to authenticate with OpenID Connect).
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
// load the azure plugin (required to authenticate with AKS clusters).
_ "k8s.io/client-go/plugin/pkg/client/auth/azure"
)
// NewProjectAllowListGenCommand generates a project from clusterRole
func NewProjectAllowListGenCommand() *cobra.Command {
var (
clientConfig clientcmd.ClientConfig
out string
)
var command = &cobra.Command{
Use: "generate-allow-list CLUSTERROLE_PATH PROJ_NAME",
Short: "Generates project allow list from the specified clusterRole file",
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
clusterRoleFileName := args[0]
projName := args[1]
var writer io.Writer
if out == "-" {
writer = os.Stdout
} else {
f, err := os.Create(out)
errors.CheckError(err)
bw := bufio.NewWriter(f)
writer = bw
defer func() {
err = bw.Flush()
errors.CheckError(err)
err = f.Close()
errors.CheckError(err)
}()
}
globalProj := generateProjectAllowList(clientConfig, clusterRoleFileName, projName)
yamlBytes, err := yaml.Marshal(globalProj)
errors.CheckError(err)
_, err = writer.Write(yamlBytes)
errors.CheckError(err)
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
command.Flags().StringVarP(&out, "out", "o", "-", "Output to the specified file instead of stdout")
return command
}
func generateProjectAllowList(clientConfig clientcmd.ClientConfig, clusterRoleFileName string, projName string) v1alpha1.AppProject {
yamlBytes, err := ioutil.ReadFile(clusterRoleFileName)
errors.CheckError(err)
var obj unstructured.Unstructured
err = yaml.Unmarshal(yamlBytes, &obj)
errors.CheckError(err)
clusterRole := &rbacv1.ClusterRole{}
err = scheme.Scheme.Convert(&obj, clusterRole, nil)
errors.CheckError(err)
config, err := clientConfig.ClientConfig()
errors.CheckError(err)
disco, err := discovery.NewDiscoveryClientForConfig(config)
errors.CheckError(err)
serverResources, err := disco.ServerPreferredResources()
errors.CheckError(err)
resourceList := make([]metav1.GroupKind, 0)
for _, rule := range clusterRole.Rules {
if len(rule.APIGroups) <= 0 {
continue
}
canCreate := false
for _, verb := range rule.Verbs {
if strings.EqualFold(verb, "Create") {
canCreate = true
break
}
}
if !canCreate {
continue
}
ruleApiGroup := rule.APIGroups[0]
for _, ruleResource := range rule.Resources {
for _, apiResourcesList := range serverResources {
gv, err := schema.ParseGroupVersion(apiResourcesList.GroupVersion)
if err != nil {
gv = schema.GroupVersion{}
}
if ruleApiGroup == gv.Group {
for _, apiResource := range apiResourcesList.APIResources {
if apiResource.Name == ruleResource {
resourceList = append(resourceList, metav1.GroupKind{Group: ruleApiGroup, Kind: apiResource.Kind})
}
}
}
}
}
}
globalProj := v1alpha1.AppProject{
TypeMeta: metav1.TypeMeta{
Kind: "AppProject",
APIVersion: "argoproj.io/v1alpha1",
},
ObjectMeta: metav1.ObjectMeta{Name: projName},
Spec: v1alpha1.AppProjectSpec{},
}
globalProj.Spec.NamespaceResourceWhitelist = resourceList
return globalProj
}

View File

@@ -0,0 +1,57 @@
package admin
import (
"reflect"
"testing"
"github.com/stretchr/testify/assert"
"github.com/undefinedlabs/go-mpatch"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/discovery"
restclient "k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func TestProjectAllowListGen(t *testing.T) {
useMock := true
rules := clientcmd.NewDefaultClientConfigLoadingRules()
overrides := &clientcmd.ConfigOverrides{}
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides)
if useMock {
var patchClientConfig *mpatch.Patch
patchClientConfig, err := mpatch.PatchInstanceMethodByName(reflect.TypeOf(clientConfig), "ClientConfig", func(*clientcmd.DeferredLoadingClientConfig) (*restclient.Config, error) {
return nil, nil
})
assert.NoError(t, err)
patch, err := mpatch.PatchMethod(discovery.NewDiscoveryClientForConfig, func(c *restclient.Config) (*discovery.DiscoveryClient, error) {
return &discovery.DiscoveryClient{LegacyPrefix: "/api"}, nil
})
assert.NoError(t, err)
var patchSeverPreferredResources *mpatch.Patch
discoClient := &discovery.DiscoveryClient{}
patchSeverPreferredResources, err = mpatch.PatchInstanceMethodByName(reflect.TypeOf(discoClient), "ServerPreferredResources", func(*discovery.DiscoveryClient) ([]*metav1.APIResourceList, error) {
res := metav1.APIResource{
Name: "services",
Kind: "Service",
}
resourceList := []*metav1.APIResourceList{{APIResources: []metav1.APIResource{res}}}
return resourceList, nil
})
assert.NoError(t, err)
defer func() {
err = patchClientConfig.Unpatch()
assert.NoError(t, err)
err = patch.Unpatch()
assert.NoError(t, err)
err = patchSeverPreferredResources.Unpatch()
err = patch.Unpatch()
}()
}
globalProj := generateProjectAllowList(clientConfig, "testdata/test_clusterrole.yaml", "testproj")
assert.True(t, len(globalProj.Spec.NamespaceResourceWhitelist) > 0)
}

View File

@@ -1,13 +1,14 @@
package main
package admin
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/pkg/client/clientset/versioned/fake"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned/fake"
)
const (
@@ -35,11 +36,11 @@ func TestUpdateProjects_FindMatchingProject(t *testing.T) {
err = updateProjects(clientset.ArgoprojV1alpha1().AppProjects(namespace), "ba*", "*", "set", modification, false)
assert.NoError(t, err)
fooProj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get("foo", v1.GetOptions{})
fooProj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get(context.Background(), "foo", v1.GetOptions{})
assert.NoError(t, err)
assert.Len(t, fooProj.Spec.Roles[0].Policies, 0)
barProj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get("bar", v1.GetOptions{})
barProj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get(context.Background(), "bar", v1.GetOptions{})
assert.NoError(t, err)
assert.EqualValues(t, barProj.Spec.Roles[0].Policies, []string{"p, proj:bar:test, *, set, bar/*, allow"})
}
@@ -52,7 +53,7 @@ func TestUpdateProjects_FindMatchingRole(t *testing.T) {
err = updateProjects(clientset.ArgoprojV1alpha1().AppProjects(namespace), "*", "fo*", "set", modification, false)
assert.NoError(t, err)
proj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get("proj", v1.GetOptions{})
proj, err := clientset.ArgoprojV1alpha1().AppProjects(namespace).Get(context.Background(), "proj", v1.GetOptions{})
assert.NoError(t, err)
assert.EqualValues(t, proj.Spec.Roles[0].Policies, []string{"p, proj:proj:foo, *, set, proj/*, allow"})
assert.Len(t, proj.Spec.Roles[1].Policies, 0)

View File

@@ -0,0 +1,169 @@
package admin
import (
"context"
"fmt"
"io/ioutil"
"os"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
apiv1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/db"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/git"
"github.com/argoproj/argo-cd/v2/util/settings"
)
const (
ArgoCDNamespace = "argocd"
repoSecretPrefix = "repo"
)
func NewRepoCommand() *cobra.Command {
var command = &cobra.Command{
Use: "repo",
Short: "Manage repositories configuration",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewGenRepoSpecCommand())
return command
}
func NewGenRepoSpecCommand() *cobra.Command {
var (
repoOpts cmdutil.RepoOptions
outputFormat string
)
// For better readability and easier formatting
var repoAddExamples = `
# Add a Git repository via SSH using a private key for authentication, ignoring the server's host key:
argocd admin repo generate-spec git@git.example.com:repos/repo --insecure-ignore-host-key --ssh-private-key-path ~/id_rsa
# Add a Git repository via SSH on a non-default port - need to use ssh:// style URLs here
argocd admin repo generate-spec ssh://git@git.example.com:2222/repos/repo --ssh-private-key-path ~/id_rsa
# Add a private Git repository via HTTPS using username/password and TLS client certificates:
argocd admin repo generate-spec https://git.example.com/repos/repo --username git --password secret --tls-client-cert-path ~/mycert.crt --tls-client-cert-key-path ~/mycert.key
# Add a private Git repository via HTTPS using username/password without verifying the server's TLS certificate
argocd admin repo generate-spec https://git.example.com/repos/repo --username git --password secret --insecure-skip-server-verification
# Add a public Helm repository named 'stable' via HTTPS
argocd admin repo generate-spec https://charts.helm.sh/stable --type helm --name stable
# Add a private Helm repository named 'stable' via HTTPS
argocd admin repo generate-spec https://charts.helm.sh/stable --type helm --name stable --username test --password test
# Add a private Helm OCI-based repository named 'stable' via HTTPS
argocd admin repo generate-spec helm-oci-registry.cn-zhangjiakou.cr.aliyuncs.com --type helm --name stable --enable-oci --username test --password test
`
var command = &cobra.Command{
Use: "generate-spec REPOURL",
Short: "Generate declarative config for a repo",
Example: repoAddExamples,
Run: func(c *cobra.Command, args []string) {
log.SetLevel(log.WarnLevel)
if len(args) != 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
// Repository URL
repoOpts.Repo.Repo = args[0]
// Specifying ssh-private-key-path is only valid for SSH repositories
if repoOpts.SshPrivateKeyPath != "" {
if ok, _ := git.IsSSHURL(repoOpts.Repo.Repo); ok {
keyData, err := ioutil.ReadFile(repoOpts.SshPrivateKeyPath)
if err != nil {
log.Fatal(err)
}
repoOpts.Repo.SSHPrivateKey = string(keyData)
} else {
err := fmt.Errorf("--ssh-private-key-path is only supported for SSH repositories.")
errors.CheckError(err)
}
}
// tls-client-cert-path and tls-client-cert-key-key-path must always be
// specified together
if (repoOpts.TlsClientCertPath != "" && repoOpts.TlsClientCertKeyPath == "") || (repoOpts.TlsClientCertPath == "" && repoOpts.TlsClientCertKeyPath != "") {
err := fmt.Errorf("--tls-client-cert-path and --tls-client-cert-key-path must be specified together")
errors.CheckError(err)
}
// Specifying tls-client-cert-path is only valid for HTTPS repositories
if repoOpts.TlsClientCertPath != "" {
if git.IsHTTPSURL(repoOpts.Repo.Repo) {
tlsCertData, err := ioutil.ReadFile(repoOpts.TlsClientCertPath)
errors.CheckError(err)
tlsCertKey, err := ioutil.ReadFile(repoOpts.TlsClientCertKeyPath)
errors.CheckError(err)
repoOpts.Repo.TLSClientCertData = string(tlsCertData)
repoOpts.Repo.TLSClientCertKey = string(tlsCertKey)
} else {
err := fmt.Errorf("--tls-client-cert-path is only supported for HTTPS repositories")
errors.CheckError(err)
}
}
// Set repository connection properties only when creating repository, not
// when creating repository credentials.
// InsecureIgnoreHostKey is deprecated and only here for backwards compat
repoOpts.Repo.InsecureIgnoreHostKey = repoOpts.InsecureIgnoreHostKey
repoOpts.Repo.Insecure = repoOpts.InsecureSkipServerVerification
repoOpts.Repo.EnableLFS = repoOpts.EnableLfs
repoOpts.Repo.EnableOCI = repoOpts.EnableOci
if repoOpts.Repo.Type == "helm" && repoOpts.Repo.Name == "" {
errors.CheckError(fmt.Errorf("must specify --name for repos of type 'helm'"))
}
// If the user set a username, but didn't supply password via --password,
// then we prompt for it
if repoOpts.Repo.Username != "" && repoOpts.Repo.Password == "" {
repoOpts.Repo.Password = cli.PromptPassword(repoOpts.Repo.Password)
}
argoCDCM := &apiv1.ConfigMap{
TypeMeta: v1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: v1.ObjectMeta{
Name: common.ArgoCDConfigMapName,
Namespace: ArgoCDNamespace,
Labels: map[string]string{
"app.kubernetes.io/part-of": "argocd",
},
},
}
kubeClientset := fake.NewSimpleClientset(argoCDCM)
settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, ArgoCDNamespace)
argoDB := db.NewDB(ArgoCDNamespace, settingsMgr, kubeClientset)
_, err := argoDB.CreateRepository(context.Background(), &repoOpts.Repo)
errors.CheckError(err)
secret, err := kubeClientset.CoreV1().Secrets(ArgoCDNamespace).Get(context.Background(), db.RepoURLToSecretName(repoSecretPrefix, repoOpts.Repo.Repo), v1.GetOptions{})
errors.CheckError(err)
errors.CheckError(PrintResources(outputFormat, os.Stdout, secret))
},
}
command.Flags().StringVarP(&outputFormat, "output", "o", "yaml", "Output format. One of: json|yaml")
cmdutil.AddRepoFlags(command, &repoOpts)
return command
}

View File

@@ -1,4 +1,4 @@
package main
package admin
import (
"testing"
@@ -18,8 +18,17 @@ connectors:
id: github
name: GitHub
type: github
- config:
bindDN: uid=serviceaccount,cn=users,dc=example,dc=com
bindPW: theSecret
host: ldap.example.com:636
id: ldap
name: LDAP
type: ldap
grpc:
addr: 0.0.0.0:5557
telemetry:
http: 0.0.0.0:5558
issuer: https://argocd.example.com/api/dex
oauth2:
skipApprovalScreen: true
@@ -49,6 +58,13 @@ var expectedRedaction = `connectors:
id: github
name: GitHub
type: github
- config:
bindDN: uid=serviceaccount,cn=users,dc=example,dc=com
bindPW: '********'
host: ldap.example.com:636
id: ldap
name: LDAP
type: ldap
grpc:
addr: 0.0.0.0:5557
issuer: https://argocd.example.com/api/dex
@@ -67,6 +83,8 @@ staticClients:
- http://localhost
storage:
type: memory
telemetry:
http: 0.0.0.0:5558
web:
http: 0.0.0.0:5556
`

View File

@@ -0,0 +1,546 @@
package admin
import (
"bytes"
"context"
"fmt"
"io/ioutil"
"os"
"reflect"
"sort"
"strconv"
"strings"
"text/tabwriter"
healthutil "github.com/argoproj/gitops-engine/pkg/health"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/argo/normalizers"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/lua"
"github.com/argoproj/argo-cd/v2/util/settings"
)
type settingsOpts struct {
argocdCMPath string
argocdSecretPath string
loadClusterSettings bool
clientConfig clientcmd.ClientConfig
}
type commandContext interface {
createSettingsManager() (*settings.SettingsManager, error)
}
func collectLogs(callback func()) string {
log.SetLevel(log.DebugLevel)
out := bytes.Buffer{}
log.SetOutput(&out)
defer log.SetLevel(log.FatalLevel)
callback()
return out.String()
}
func setSettingsMeta(obj v1.Object) {
obj.SetNamespace("default")
labels := obj.GetLabels()
if labels == nil {
labels = make(map[string]string)
}
labels["app.kubernetes.io/part-of"] = "argocd"
obj.SetLabels(labels)
}
func (opts *settingsOpts) createSettingsManager() (*settings.SettingsManager, error) {
var argocdCM *corev1.ConfigMap
if opts.argocdCMPath == "" && !opts.loadClusterSettings {
return nil, fmt.Errorf("either --argocd-cm-path must be provided or --load-cluster-settings must be set to true")
} else if opts.argocdCMPath == "" {
realClientset, ns, err := opts.getK8sClient()
if err != nil {
return nil, err
}
argocdCM, err = realClientset.CoreV1().ConfigMaps(ns).Get(context.Background(), common.ArgoCDConfigMapName, v1.GetOptions{})
if err != nil {
return nil, err
}
} else {
data, err := ioutil.ReadFile(opts.argocdCMPath)
if err != nil {
return nil, err
}
err = yaml.Unmarshal(data, &argocdCM)
if err != nil {
return nil, err
}
}
setSettingsMeta(argocdCM)
var argocdSecret *corev1.Secret
if opts.argocdSecretPath != "" {
data, err := ioutil.ReadFile(opts.argocdSecretPath)
if err != nil {
return nil, err
}
err = yaml.Unmarshal(data, &argocdSecret)
if err != nil {
return nil, err
}
setSettingsMeta(argocdSecret)
} else if opts.loadClusterSettings {
realClientset, ns, err := opts.getK8sClient()
if err != nil {
return nil, err
}
argocdSecret, err = realClientset.CoreV1().Secrets(ns).Get(context.Background(), common.ArgoCDSecretName, v1.GetOptions{})
if err != nil {
return nil, err
}
} else {
argocdSecret = &corev1.Secret{
ObjectMeta: v1.ObjectMeta{
Name: common.ArgoCDSecretName,
},
Data: map[string][]byte{
"admin.password": []byte("test"),
"server.secretkey": []byte("test"),
},
}
}
setSettingsMeta(argocdSecret)
clientset := fake.NewSimpleClientset(argocdSecret, argocdCM)
manager := settings.NewSettingsManager(context.Background(), clientset, "default")
errors.CheckError(manager.ResyncInformers())
return manager, nil
}
func (opts *settingsOpts) getK8sClient() (*kubernetes.Clientset, string, error) {
namespace, _, err := opts.clientConfig.Namespace()
if err != nil {
return nil, "", err
}
restConfig, err := opts.clientConfig.ClientConfig()
if err != nil {
return nil, "", err
}
realClientset, err := kubernetes.NewForConfig(restConfig)
if err != nil {
return nil, "", err
}
return realClientset, namespace, nil
}
func NewSettingsCommand() *cobra.Command {
var (
opts settingsOpts
)
var command = &cobra.Command{
Use: "settings",
Short: "Provides set of commands for settings validation and troubleshooting",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
log.SetLevel(log.FatalLevel)
command.AddCommand(NewValidateSettingsCommand(&opts))
command.AddCommand(NewResourceOverridesCommand(&opts))
command.AddCommand(NewRBACCommand())
opts.clientConfig = cli.AddKubectlFlagsToCmd(command)
command.PersistentFlags().StringVar(&opts.argocdCMPath, "argocd-cm-path", "", "Path to local argocd-cm.yaml file")
command.PersistentFlags().StringVar(&opts.argocdSecretPath, "argocd-secret-path", "", "Path to local argocd-secret.yaml file")
command.PersistentFlags().BoolVar(&opts.loadClusterSettings, "load-cluster-settings", false,
"Indicates that config map and secret should be loaded from cluster unless local file path is provided")
return command
}
type settingValidator func(manager *settings.SettingsManager) (string, error)
func joinValidators(validators ...settingValidator) settingValidator {
return func(manager *settings.SettingsManager) (string, error) {
var errorStrs []string
var summaries []string
for i := range validators {
summary, err := validators[i](manager)
if err != nil {
errorStrs = append(errorStrs, err.Error())
}
if summary != "" {
summaries = append(summaries, summary)
}
}
if len(errorStrs) > 0 {
return "", fmt.Errorf("%s", strings.Join(errorStrs, "\n"))
}
return strings.Join(summaries, "\n"), nil
}
}
var validatorsByGroup = map[string]settingValidator{
"general": joinValidators(func(manager *settings.SettingsManager) (string, error) {
general, err := manager.GetSettings()
if err != nil {
return "", err
}
ssoProvider := ""
if general.DexConfig != "" {
if _, err := settings.UnmarshalDexConfig(general.DexConfig); err != nil {
return "", fmt.Errorf("invalid dex.config: %v", err)
}
ssoProvider = "Dex"
} else if general.OIDCConfigRAW != "" {
if _, err := settings.UnmarshalOIDCConfig(general.OIDCConfigRAW); err != nil {
return "", fmt.Errorf("invalid oidc.config: %v", err)
}
ssoProvider = "OIDC"
}
var summary string
if ssoProvider != "" {
summary = fmt.Sprintf("%s is configured", ssoProvider)
if general.URL == "" {
summary = summary + " ('url' field is missing)"
}
} else if ssoProvider != "" && general.URL != "" {
} else {
summary = "SSO is not configured"
}
return summary, nil
}, func(manager *settings.SettingsManager) (string, error) {
_, err := manager.GetAppInstanceLabelKey()
return "", err
}, func(manager *settings.SettingsManager) (string, error) {
_, err := manager.GetHelp()
return "", err
}, func(manager *settings.SettingsManager) (string, error) {
_, err := manager.GetGoogleAnalytics()
return "", err
}),
"plugins": func(manager *settings.SettingsManager) (string, error) {
plugins, err := manager.GetConfigManagementPlugins()
if err != nil {
return "", err
}
return fmt.Sprintf("%d plugins", len(plugins)), nil
},
"kustomize": func(manager *settings.SettingsManager) (string, error) {
opts, err := manager.GetKustomizeSettings()
if err != nil {
return "", err
}
summary := "default options"
if opts.BuildOptions != "" {
summary = opts.BuildOptions
}
if len(opts.Versions) > 0 {
summary = fmt.Sprintf("%s (%d versions)", summary, len(opts.Versions))
}
return summary, err
},
"repositories": joinValidators(func(manager *settings.SettingsManager) (string, error) {
repos, err := manager.GetRepositories()
if err != nil {
return "", err
}
return fmt.Sprintf("%d repositories", len(repos)), nil
}, func(manager *settings.SettingsManager) (string, error) {
creds, err := manager.GetRepositoryCredentials()
if err != nil {
return "", err
}
return fmt.Sprintf("%d repository credentials", len(creds)), nil
}),
"accounts": func(manager *settings.SettingsManager) (string, error) {
accounts, err := manager.GetAccounts()
if err != nil {
return "", err
}
return fmt.Sprintf("%d accounts", len(accounts)), nil
},
"resource-overrides": func(manager *settings.SettingsManager) (string, error) {
overrides, err := manager.GetResourceOverrides()
if err != nil {
return "", err
}
return fmt.Sprintf("%d resource overrides", len(overrides)), nil
},
}
func NewValidateSettingsCommand(cmdCtx commandContext) *cobra.Command {
var (
groups []string
)
var allGroups []string
for k := range validatorsByGroup {
allGroups = append(allGroups, k)
}
sort.Slice(allGroups, func(i, j int) bool {
return allGroups[i] < allGroups[j]
})
var command = &cobra.Command{
Use: "validate",
Short: "Validate settings",
Long: "Validates settings specified in 'argocd-cm' ConfigMap and 'argocd-secret' Secret",
Example: `
#Validates all settings in the specified YAML file
argocd admin settings validate --argocd-cm-path ./argocd-cm.yaml
#Validates accounts and plugins settings in Kubernetes cluster of current kubeconfig context
argocd admin settings validate --group accounts --group plugins --load-cluster-settings`,
Run: func(c *cobra.Command, args []string) {
settingsManager, err := cmdCtx.createSettingsManager()
errors.CheckError(err)
if len(groups) == 0 {
groups = allGroups
}
for i, group := range groups {
validator := validatorsByGroup[group]
logs := collectLogs(func() {
summary, err := validator(settingsManager)
if err != nil {
_, _ = fmt.Fprintf(os.Stdout, "❌ %s\n", group)
_, _ = fmt.Fprintf(os.Stdout, "%s\n", err.Error())
} else {
_, _ = fmt.Fprintf(os.Stdout, "✅ %s\n", group)
if summary != "" {
_, _ = fmt.Fprintf(os.Stdout, "%s\n", summary)
}
}
})
if logs != "" {
_, _ = fmt.Fprintf(os.Stdout, "%s\n", logs)
}
if i != len(groups)-1 {
_, _ = fmt.Fprintf(os.Stdout, "\n")
}
}
},
}
command.Flags().StringArrayVar(&groups, "group", nil, fmt.Sprintf(
"Optional list of setting groups that have to be validated ( one of: %s)", strings.Join(allGroups, ", ")))
return command
}
func NewResourceOverridesCommand(cmdCtx commandContext) *cobra.Command {
var command = &cobra.Command{
Use: "resource-overrides",
Short: "Troubleshoot resource overrides",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewResourceIgnoreDifferencesCommand(cmdCtx))
command.AddCommand(NewResourceActionListCommand(cmdCtx))
command.AddCommand(NewResourceActionRunCommand(cmdCtx))
command.AddCommand(NewResourceHealthCommand(cmdCtx))
return command
}
func executeResourceOverrideCommand(cmdCtx commandContext, args []string, callback func(res unstructured.Unstructured, override v1alpha1.ResourceOverride, overrides map[string]v1alpha1.ResourceOverride)) {
data, err := ioutil.ReadFile(args[0])
errors.CheckError(err)
res := unstructured.Unstructured{}
errors.CheckError(yaml.Unmarshal(data, &res))
settingsManager, err := cmdCtx.createSettingsManager()
errors.CheckError(err)
overrides, err := settingsManager.GetResourceOverrides()
errors.CheckError(err)
gvk := res.GroupVersionKind()
key := gvk.Kind
if gvk.Group != "" {
key = fmt.Sprintf("%s/%s", gvk.Group, gvk.Kind)
}
override, hasOverride := overrides[key]
if !hasOverride {
_, _ = fmt.Printf("No overrides configured for '%s/%s'\n", gvk.Group, gvk.Kind)
return
}
callback(res, override, overrides)
}
func NewResourceIgnoreDifferencesCommand(cmdCtx commandContext) *cobra.Command {
var command = &cobra.Command{
Use: "ignore-differences RESOURCE_YAML_PATH",
Short: "Renders fields excluded from diffing",
Long: "Renders ignored fields using the 'ignoreDifferences' setting specified in the 'resource.customizations' field of 'argocd-cm' ConfigMap",
Example: `
argocd admin settings resource-overrides ignore-differences ./deploy.yaml --argocd-cm-path ./argocd-cm.yaml`,
Run: func(c *cobra.Command, args []string) {
if len(args) < 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
executeResourceOverrideCommand(cmdCtx, args, func(res unstructured.Unstructured, override v1alpha1.ResourceOverride, overrides map[string]v1alpha1.ResourceOverride) {
gvk := res.GroupVersionKind()
if len(override.IgnoreDifferences.JSONPointers) == 0 && len(override.IgnoreDifferences.JQPathExpressions) == 0 {
_, _ = fmt.Printf("Ignore differences are not configured for '%s/%s'\n", gvk.Group, gvk.Kind)
return
}
normalizer, err := normalizers.NewIgnoreNormalizer(nil, overrides)
errors.CheckError(err)
normalizedRes := res.DeepCopy()
logs := collectLogs(func() {
errors.CheckError(normalizer.Normalize(normalizedRes))
})
if logs != "" {
_, _ = fmt.Println(logs)
}
if reflect.DeepEqual(&res, normalizedRes) {
_, _ = fmt.Printf("No fields are ignored by ignoreDifferences settings: \n%s\n", override.IgnoreDifferences)
return
}
_, _ = fmt.Printf("Following fields are ignored:\n\n")
_ = cli.PrintDiff(res.GetName(), &res, normalizedRes)
})
},
}
return command
}
func NewResourceHealthCommand(cmdCtx commandContext) *cobra.Command {
var command = &cobra.Command{
Use: "health RESOURCE_YAML_PATH",
Short: "Assess resource health",
Long: "Assess resource health using the lua script configured in the 'resource.customizations' field of 'argocd-cm' ConfigMap",
Example: `
argocd admin settings resource-overrides health ./deploy.yaml --argocd-cm-path ./argocd-cm.yaml`,
Run: func(c *cobra.Command, args []string) {
if len(args) < 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
executeResourceOverrideCommand(cmdCtx, args, func(res unstructured.Unstructured, override v1alpha1.ResourceOverride, overrides map[string]v1alpha1.ResourceOverride) {
gvk := res.GroupVersionKind()
if override.HealthLua == "" {
_, _ = fmt.Printf("Health script is not configured for '%s/%s'\n", gvk.Group, gvk.Kind)
return
}
resHealth, err := healthutil.GetResourceHealth(&res, lua.ResourceHealthOverrides(overrides))
errors.CheckError(err)
_, _ = fmt.Printf("STATUS: %s\n", resHealth.Status)
_, _ = fmt.Printf("MESSAGE: %s\n", resHealth.Message)
})
},
}
return command
}
func NewResourceActionListCommand(cmdCtx commandContext) *cobra.Command {
var command = &cobra.Command{
Use: "list-actions RESOURCE_YAML_PATH",
Short: "List available resource actions",
Long: "List actions available for given resource action using the lua scripts configured in the 'resource.customizations' field of 'argocd-cm' ConfigMap and outputs updated fields",
Example: `
argocd admin settings resource-overrides action list /tmp/deploy.yaml --argocd-cm-path ./argocd-cm.yaml`,
Run: func(c *cobra.Command, args []string) {
if len(args) < 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
executeResourceOverrideCommand(cmdCtx, args, func(res unstructured.Unstructured, override v1alpha1.ResourceOverride, overrides map[string]v1alpha1.ResourceOverride) {
gvk := res.GroupVersionKind()
if override.Actions == "" {
_, _ = fmt.Printf("Actions are not configured for '%s/%s'\n", gvk.Group, gvk.Kind)
return
}
luaVM := lua.VM{ResourceOverrides: overrides}
discoveryScript, err := luaVM.GetResourceActionDiscovery(&res)
errors.CheckError(err)
availableActions, err := luaVM.ExecuteResourceActionDiscovery(&res, discoveryScript)
errors.CheckError(err)
sort.Slice(availableActions, func(i, j int) bool {
return availableActions[i].Name < availableActions[j].Name
})
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
_, _ = fmt.Fprintf(w, "NAME\tENABLED\n")
for _, action := range availableActions {
_, _ = fmt.Fprintf(w, "%s\t%s\n", action.Name, strconv.FormatBool(action.Disabled))
}
_ = w.Flush()
})
},
}
return command
}
func NewResourceActionRunCommand(cmdCtx commandContext) *cobra.Command {
var command = &cobra.Command{
Use: "run-action RESOURCE_YAML_PATH ACTION",
Aliases: []string{"action"},
Short: "Executes resource action",
Long: "Executes resource action using the lua script configured in the 'resource.customizations' field of 'argocd-cm' ConfigMap and outputs updated fields",
Example: `
argocd admin settings resource-overrides action run /tmp/deploy.yaml restart --argocd-cm-path ./argocd-cm.yaml`,
Run: func(c *cobra.Command, args []string) {
if len(args) < 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
action := args[1]
executeResourceOverrideCommand(cmdCtx, args, func(res unstructured.Unstructured, override v1alpha1.ResourceOverride, overrides map[string]v1alpha1.ResourceOverride) {
gvk := res.GroupVersionKind()
if override.Actions == "" {
_, _ = fmt.Printf("Actions are not configured for '%s/%s'\n", gvk.Group, gvk.Kind)
return
}
luaVM := lua.VM{ResourceOverrides: overrides}
action, err := luaVM.GetResourceAction(&res, action)
errors.CheckError(err)
modifiedRes, err := luaVM.ExecuteResourceAction(&res, action.ActionLua)
errors.CheckError(err)
if reflect.DeepEqual(&res, modifiedRes) {
_, _ = fmt.Printf("No fields had been changed by action: \n%s\n", action.Name)
return
}
_, _ = fmt.Printf("Following fields have been changed:\n\n")
_ = cli.PrintDiff(res.GetName(), &res, modifiedRes)
})
},
}
return command
}

View File

@@ -0,0 +1,374 @@
package admin
import (
"context"
"fmt"
"io/ioutil"
"os"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/v2/common"
"github.com/argoproj/argo-cd/v2/server/rbacpolicy"
"github.com/argoproj/argo-cd/v2/util/assets"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/rbac"
)
// Provide a mapping of short-hand resource names to their RBAC counterparts
var resourceMap map[string]string = map[string]string{
"account": rbacpolicy.ResourceAccounts,
"app": rbacpolicy.ResourceApplications,
"apps": rbacpolicy.ResourceApplications,
"application": rbacpolicy.ResourceApplications,
"cert": rbacpolicy.ResourceCertificates,
"certs": rbacpolicy.ResourceCertificates,
"certificate": rbacpolicy.ResourceCertificates,
"cluster": rbacpolicy.ResourceClusters,
"gpgkey": rbacpolicy.ResourceGPGKeys,
"key": rbacpolicy.ResourceGPGKeys,
"proj": rbacpolicy.ResourceProjects,
"projs": rbacpolicy.ResourceProjects,
"project": rbacpolicy.ResourceProjects,
"repo": rbacpolicy.ResourceRepositories,
"repos": rbacpolicy.ResourceRepositories,
"repository": rbacpolicy.ResourceRepositories,
}
// List of allowed RBAC resources
var validRBACResources map[string]bool = map[string]bool{
rbacpolicy.ResourceAccounts: true,
rbacpolicy.ResourceApplications: true,
rbacpolicy.ResourceCertificates: true,
rbacpolicy.ResourceClusters: true,
rbacpolicy.ResourceGPGKeys: true,
rbacpolicy.ResourceProjects: true,
rbacpolicy.ResourceRepositories: true,
}
// List of allowed RBAC actions
var validRBACActions map[string]bool = map[string]bool{
rbacpolicy.ActionAction: true,
rbacpolicy.ActionCreate: true,
rbacpolicy.ActionDelete: true,
rbacpolicy.ActionGet: true,
rbacpolicy.ActionOverride: true,
rbacpolicy.ActionSync: true,
rbacpolicy.ActionUpdate: true,
}
// NewRBACCommand is the command for 'rbac'
func NewRBACCommand() *cobra.Command {
var command = &cobra.Command{
Use: "rbac",
Short: "Validate and test RBAC configuration",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
}
command.AddCommand(NewRBACCanCommand())
command.AddCommand(NewRBACValidateCommand())
return command
}
// NewRBACCanRoleCommand is the command for 'rbac can-role'
func NewRBACCanCommand() *cobra.Command {
var (
policyFile string
defaultRole string
useBuiltin bool
strict bool
quiet bool
subject string
action string
resource string
subResource string
clientConfig clientcmd.ClientConfig
)
var command = &cobra.Command{
Use: "can ROLE/SUBJECT ACTION RESOURCE [SUB-RESOURCE]",
Short: "Check RBAC permissions for a role or subject",
Long: `
Check whether a given role or subject has appropriate RBAC permissions to do
something.
`,
Example: `
# Check whether role some:role has permissions to create an application in the
# 'default' project, using a local policy.csv file
argocd admin settings rbac can some:role create application 'default/app' --policy-file policy.csv
# Policy file can also be K8s config map with data keys like argocd-rbac-cm,
# i.e. 'policy.csv' and (optionally) 'policy.default'
argocd admin settings rbac can some:role create application 'default/app' --policy-file argocd-rbac-cm.yaml
# If --policy-file is not given, the ConfigMap 'argocd-rbac-cm' from K8s is
# used. You need to specify the argocd namespace, and make sure that your
# current Kubernetes context is pointing to the cluster Argo CD is running in
argocd admin settings rbac can some:role create application 'default/app' --namespace argocd
# You can override a possibly configured default role
argocd admin settings rbac can someuser create application 'default/app' --default-role role:readonly
`,
Run: func(c *cobra.Command, args []string) {
if len(args) < 3 || len(args) > 4 {
c.HelpFunc()(c, args)
os.Exit(1)
}
subject = args[0]
action = args[1]
resource = args[2]
if len(args) > 3 {
subResource = args[3]
}
userPolicy := ""
builtinPolicy := ""
var newDefaultRole string
namespace, nsOverride, err := clientConfig.Namespace()
if err != nil {
log.Fatalf("could not create k8s client: %v", err)
}
// Exactly one of --namespace or --policy-file must be given.
if (!nsOverride && policyFile == "") || (nsOverride && policyFile != "") {
c.HelpFunc()(c, args)
log.Fatalf("please provide exactly one of --policy-file or --namespace")
}
restConfig, err := clientConfig.ClientConfig()
if err != nil {
log.Fatalf("could not create k8s client: %v", err)
}
realClientset, err := kubernetes.NewForConfig(restConfig)
if err != nil {
log.Fatalf("could not create k8s client: %v", err)
}
userPolicy, newDefaultRole = getPolicy(policyFile, realClientset, namespace)
// Use built-in policy as augmentation if requested
if useBuiltin {
builtinPolicy = assets.BuiltinPolicyCSV
}
// If no explicit default role was given, but we have one defined from
// a policy, use this to check for enforce.
if newDefaultRole != "" && defaultRole == "" {
defaultRole = newDefaultRole
}
res := checkPolicy(subject, action, resource, subResource, builtinPolicy, userPolicy, defaultRole, strict)
if res {
if !quiet {
fmt.Println("Yes")
}
os.Exit(0)
} else {
if !quiet {
fmt.Println("No")
}
os.Exit(1)
}
},
}
clientConfig = cli.AddKubectlFlagsToCmd(command)
command.Flags().StringVar(&policyFile, "policy-file", "", "path to the policy file to use")
command.Flags().StringVar(&defaultRole, "default-role", "", "name of the default role to use")
command.Flags().BoolVar(&useBuiltin, "use-builtin-policy", true, "whether to also use builtin-policy")
command.Flags().BoolVar(&strict, "strict", true, "whether to perform strict check on action and resource names")
command.Flags().BoolVarP(&quiet, "quiet", "q", false, "quiet mode - do not print results to stdout")
return command
}
// NewRBACValidateCommand returns a new rbac validate command
func NewRBACValidateCommand() *cobra.Command {
var (
policyFile string
)
var command = &cobra.Command{
Use: "validate --policy-file=POLICYFILE",
Short: "Validate RBAC policy",
Long: `
Validates an RBAC policy for being syntactically correct. The policy must be
a local file, and in either CSV or K8s ConfigMap format.
`,
Run: func(c *cobra.Command, args []string) {
if policyFile == "" {
c.HelpFunc()(c, args)
log.Fatalf("Please specify policy to validate using --policy-file")
}
userPolicy, _ := getPolicy(policyFile, nil, "")
if userPolicy != "" {
if err := rbac.ValidatePolicy(userPolicy); err == nil {
fmt.Printf("Policy is valid.\n")
os.Exit(0)
} else {
fmt.Printf("Policy is invalid: %v\n", err)
os.Exit(1)
}
}
},
}
command.Flags().StringVar(&policyFile, "policy-file", "", "path to the policy file to use")
return command
}
// Load user policy file if requested or use Kubernetes client to get the
// appropriate ConfigMap from the current context
func getPolicy(policyFile string, kubeClient kubernetes.Interface, namespace string) (userPolicy string, defaultRole string) {
var err error
if policyFile != "" {
// load from file
userPolicy, defaultRole, err = getPolicyFromFile(policyFile)
if err != nil {
log.Fatalf("could not read policy file: %v", err)
}
} else {
cm, err := getPolicyConfigMap(kubeClient, namespace)
if err != nil {
log.Fatalf("could not get configmap: %v", err)
}
userPolicy, defaultRole = getPolicyFromConfigMap(cm)
}
return userPolicy, defaultRole
}
// getPolicyFromFile loads a RBAC policy from given path
func getPolicyFromFile(policyFile string) (string, string, error) {
var (
userPolicy string
defaultRole string
)
upol, err := ioutil.ReadFile(policyFile)
if err != nil {
log.Fatalf("error opening policy file: %v", err)
return "", "", err
}
// Try to unmarshal the input file as ConfigMap first. If it succeeds, we
// assume config map input. Otherwise, we treat it as
var upolCM *corev1.ConfigMap
err = yaml.Unmarshal(upol, &upolCM)
if err != nil {
userPolicy = string(upol)
} else {
userPolicy, defaultRole = getPolicyFromConfigMap(upolCM)
}
return userPolicy, defaultRole, nil
}
// Retrieve policy information from a ConfigMap
func getPolicyFromConfigMap(cm *corev1.ConfigMap) (string, string) {
var (
userPolicy string
defaultRole string
ok bool
)
userPolicy, ok = cm.Data[rbac.ConfigMapPolicyCSVKey]
if !ok {
userPolicy = ""
}
if defaultRole == "" {
defaultRole, ok = cm.Data[rbac.ConfigMapPolicyDefaultKey]
if !ok {
defaultRole = ""
}
}
return userPolicy, defaultRole
}
// getPolicyConfigMap fetches the RBAC config map from K8s cluster
func getPolicyConfigMap(client kubernetes.Interface, namespace string) (*corev1.ConfigMap, error) {
cm, err := client.CoreV1().ConfigMaps(namespace).Get(context.Background(), common.ArgoCDRBACConfigMapName, v1.GetOptions{})
if err != nil {
return nil, err
}
return cm, nil
}
// checkPolicy checks whether given subject is allowed to execute specified
// action against specified resource
func checkPolicy(subject, action, resource, subResource, builtinPolicy, userPolicy, defaultRole string, strict bool) bool {
enf := rbac.NewEnforcer(nil, "argocd", "argocd-rbac-cm", nil)
enf.SetDefaultRole(defaultRole)
if builtinPolicy != "" {
if err := enf.SetBuiltinPolicy(builtinPolicy); err != nil {
log.Fatalf("could not set built-in policy: %v", err)
return false
}
}
if userPolicy != "" {
if err := rbac.ValidatePolicy(userPolicy); err != nil {
log.Fatalf("invalid user policy: %v", err)
return false
}
if err := enf.SetUserPolicy(userPolicy); err != nil {
log.Fatalf("could not set user policy: %v", err)
return false
}
}
// User could have used a mutation of the resource name (i.e. 'cert' for
// 'certificate') - let's resolve it to the valid resource.
realResource := resolveRBACResourceName(resource)
// If in strict mode, validate that given RBAC resource and action are
// actually valid tokens.
if strict {
if !isValidRBACResource(realResource) {
log.Fatalf("error in RBAC request: '%s' is not a valid resource name", realResource)
}
if !isValidRBACAction(action) {
log.Fatalf("error in RBAC request: '%s' is not a valid action name", action)
}
}
// Application resources have a special notation - for simplicity's sake,
// if user gives no sub-resource (or specifies simple '*'), we construct
// the required notation by setting subresource to '*/*'.
if realResource == rbacpolicy.ResourceApplications {
if subResource == "*" || subResource == "" {
subResource = "*/*"
}
}
return enf.Enforce(subject, realResource, action, subResource)
}
// resolveRBACResourceName resolves a user supplied value to a valid RBAC
// resource name. If no mapping is found, returns the value verbatim.
func resolveRBACResourceName(name string) string {
if res, ok := resourceMap[name]; ok {
return res
} else {
return name
}
}
// isValidRBACAction checks whether a given action is a valid RBAC action
func isValidRBACAction(action string) bool {
_, ok := validRBACActions[action]
return ok
}
// isValidRBACResource checks whether a given resource is a valid RBAC resource
func isValidRBACResource(resource string) bool {
_, ok := validRBACResources[resource]
return ok
}

View File

@@ -0,0 +1,91 @@
package admin
import (
"io/ioutil"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"
"github.com/argoproj/argo-cd/v2/util/assets"
)
func Test_isValidRBACAction(t *testing.T) {
for k := range validRBACActions {
t.Run(k, func(t *testing.T) {
ok := isValidRBACAction(k)
assert.True(t, ok)
})
}
t.Run("invalid", func(t *testing.T) {
ok := isValidRBACAction("invalid")
assert.False(t, ok)
})
}
func Test_isValidRBACResource(t *testing.T) {
for k := range validRBACResources {
t.Run(k, func(t *testing.T) {
ok := isValidRBACResource(k)
assert.True(t, ok)
})
}
t.Run("invalid", func(t *testing.T) {
ok := isValidRBACResource("invalid")
assert.False(t, ok)
})
}
func Test_PolicyFromCSV(t *testing.T) {
uPol, dRole := getPolicy("testdata/rbac/policy.csv", nil, "")
require.NotEmpty(t, uPol)
require.Empty(t, dRole)
}
func Test_PolicyFromYAML(t *testing.T) {
uPol, dRole := getPolicy("testdata/rbac/argocd-rbac-cm.yaml", nil, "")
require.NotEmpty(t, uPol)
require.Equal(t, "role:unknown", dRole)
}
func Test_PolicyFromK8s(t *testing.T) {
data, err := ioutil.ReadFile("testdata/rbac/policy.csv")
require.NoError(t, err)
kubeclientset := fake.NewSimpleClientset(&v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "argocd-rbac-cm",
Namespace: "argocd",
},
Data: map[string]string{
"policy.csv": string(data),
"policy.default": "role:unknown",
},
})
uPol, dRole := getPolicy("", kubeclientset, "argocd")
require.NotEmpty(t, uPol)
require.Equal(t, "role:unknown", dRole)
t.Run("get applications", func(t *testing.T) {
ok := checkPolicy("role:user", "get", "applications", "*/*", assets.BuiltinPolicyCSV, uPol, dRole, true)
require.True(t, ok)
})
t.Run("get clusters", func(t *testing.T) {
ok := checkPolicy("role:user", "get", "clusters", "*", assets.BuiltinPolicyCSV, uPol, dRole, true)
require.True(t, ok)
})
t.Run("get certificates", func(t *testing.T) {
ok := checkPolicy("role:user", "get", "certificates", "*", assets.BuiltinPolicyCSV, uPol, dRole, true)
require.False(t, ok)
})
t.Run("get certificates by default role", func(t *testing.T) {
ok := checkPolicy("role:user", "get", "certificates", "*", assets.BuiltinPolicyCSV, uPol, "role:readonly", true)
require.True(t, ok)
})
t.Run("get certificates by default role without builtin policy", func(t *testing.T) {
ok := checkPolicy("role:user", "get", "certificates", "*", "", uPol, "role:readonly", true)
require.False(t, ok)
})
}

View File

@@ -0,0 +1,384 @@
package admin
import (
"bytes"
"context"
"fmt"
"io"
"io/ioutil"
"os"
"testing"
"github.com/argoproj/argo-cd/v2/common"
utils "github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/argo-cd/v2/util/settings"
"github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"
)
func captureStdout(callback func()) (string, error) {
oldStdout := os.Stdout
oldStderr := os.Stderr
r, w, err := os.Pipe()
if err != nil {
return "", err
}
os.Stdout = w
defer func() {
os.Stdout = oldStdout
os.Stderr = oldStderr
}()
callback()
utils.Close(w)
data, err := ioutil.ReadAll(r)
if err != nil {
return "", err
}
return string(data), err
}
func newSettingsManager(data map[string]string) *settings.SettingsManager {
clientset := fake.NewSimpleClientset(&v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Namespace: "default",
Name: common.ArgoCDConfigMapName,
Labels: map[string]string{
"app.kubernetes.io/part-of": "argocd",
},
},
Data: data,
}, &v1.Secret{
ObjectMeta: metav1.ObjectMeta{
Namespace: "default",
Name: common.ArgoCDSecretName,
},
Data: map[string][]byte{
"admin.password": []byte("test"),
"server.secretkey": []byte("test"),
},
})
return settings.NewSettingsManager(context.Background(), clientset, "default")
}
type fakeCmdContext struct {
mgr *settings.SettingsManager
// nolint:unused,structcheck
out bytes.Buffer
}
func newCmdContext(data map[string]string) *fakeCmdContext {
return &fakeCmdContext{mgr: newSettingsManager(data)}
}
func (ctx *fakeCmdContext) createSettingsManager() (*settings.SettingsManager, error) {
return ctx.mgr, nil
}
type validatorTestCase struct {
validator string
data map[string]string
containsSummary string
containsError string
}
func TestCreateSettingsManager(t *testing.T) {
f, closer, err := tempFile(`apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
data:
url: https://myargocd.com`)
if !assert.NoError(t, err) {
return
}
defer utils.Close(closer)
opts := settingsOpts{argocdCMPath: f}
settingsManager, err := opts.createSettingsManager()
if !assert.NoError(t, err) {
return
}
argoCDSettings, err := settingsManager.GetSettings()
if !assert.NoError(t, err) {
return
}
assert.Equal(t, "https://myargocd.com", argoCDSettings.URL)
}
func TestValidator(t *testing.T) {
testCases := map[string]validatorTestCase{
"General_SSOIsNotConfigured": {
validator: "general", containsSummary: "SSO is not configured",
},
"General_DexInvalidConfig": {
validator: "general",
data: map[string]string{"dex.config": "abcdefg"},
containsError: "invalid dex.config",
},
"General_OIDCConfigured": {
validator: "general",
data: map[string]string{
"url": "https://myargocd.com",
"oidc.config": `
name: Okta
issuer: https://dev-123456.oktapreview.com
clientID: aaaabbbbccccddddeee
clientSecret: aaaabbbbccccddddeee`,
},
containsSummary: "OIDC is configured",
},
"General_DexConfiguredMissingURL": {
validator: "general",
data: map[string]string{
"dex.config": `connectors:
- type: github
name: GitHub
config:
clientID: aabbccddeeff00112233
clientSecret: aabbccddeeff00112233`,
},
containsSummary: "Dex is configured ('url' field is missing)",
},
"Plugins_ValidConfig": {
validator: "plugins",
data: map[string]string{
"configManagementPlugins": `[{"name": "test1"}, {"name": "test2"}]`,
},
containsSummary: "2 plugins",
},
"Kustomize_ModifiedOptions": {
validator: "kustomize",
containsSummary: "default options",
},
"Kustomize_DefaultOptions": {
validator: "kustomize",
data: map[string]string{
"kustomize.buildOptions": "updated-options (2 versions)",
"kustomize.versions.v123": "binary-123",
"kustomize.versions.v321": "binary-321",
},
containsSummary: "updated-options",
},
"Repositories": {
validator: "repositories",
data: map[string]string{
"repositories": `
- url: https://github.com/argoproj/my-private-repository1
- url: https://github.com/argoproj/my-private-repository2`,
},
containsSummary: "2 repositories",
},
"Accounts": {
validator: "accounts",
data: map[string]string{
"accounts.user1": "apiKey, login",
"accounts.user2": "login",
"accounts.user3": "apiKey",
},
containsSummary: "4 accounts",
},
"ResourceOverrides": {
validator: "resource-overrides",
data: map[string]string{
"resource.customizations": `
admissionregistration.k8s.io/MutatingWebhookConfiguration:
ignoreDifferences: |
jsonPointers:
- /webhooks/0/clientConfig/caBundle`,
},
containsSummary: "2 resource overrides",
},
}
for name := range testCases {
tc := testCases[name]
t.Run(name, func(t *testing.T) {
validator, ok := validatorsByGroup[tc.validator]
if !assert.True(t, ok) {
return
}
summary, err := validator(newSettingsManager(tc.data))
if tc.containsSummary != "" {
assert.NoError(t, err)
assert.Contains(t, summary, tc.containsSummary)
} else if tc.containsError != "" {
if assert.Error(t, err) {
assert.Contains(t, err.Error(), tc.containsError)
}
}
})
}
}
const (
testDeploymentYAML = `apiVersion: v1
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 0`
)
func tempFile(content string) (string, io.Closer, error) {
f, err := ioutil.TempFile("", "*.yaml")
if err != nil {
return "", nil, err
}
_, err = f.Write([]byte(content))
if err != nil {
_ = os.Remove(f.Name())
return "", nil, err
}
defer f.Close()
return f.Name(), utils.NewCloser(func() error {
return os.Remove(f.Name())
}), nil
}
func TestValidateSettingsCommand_NoErrors(t *testing.T) {
cmd := NewValidateSettingsCommand(newCmdContext(map[string]string{}))
out, err := captureStdout(func() {
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
for k := range validatorsByGroup {
assert.Contains(t, out, fmt.Sprintf("✅ %s", k))
}
}
func TestResourceOverrideIgnoreDifferences(t *testing.T) {
f, closer, err := tempFile(testDeploymentYAML)
if !assert.NoError(t, err) {
return
}
defer utils.Close(closer)
t.Run("NoOverridesConfigured", func(t *testing.T) {
cmd := NewResourceOverridesCommand(newCmdContext(map[string]string{}))
out, err := captureStdout(func() {
cmd.SetArgs([]string{"ignore-differences", f})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, "No overrides configured")
})
t.Run("DataIgnored", func(t *testing.T) {
cmd := NewResourceOverridesCommand(newCmdContext(map[string]string{
"resource.customizations": `apps/Deployment:
ignoreDifferences: |
jsonPointers:
- /spec`}))
out, err := captureStdout(func() {
cmd.SetArgs([]string{"ignore-differences", f})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, "< spec:")
})
}
func TestResourceOverrideHealth(t *testing.T) {
f, closer, err := tempFile(testDeploymentYAML)
if !assert.NoError(t, err) {
return
}
defer utils.Close(closer)
t.Run("NoHealthAssessment", func(t *testing.T) {
cmd := NewResourceOverridesCommand(newCmdContext(map[string]string{
"resource.customizations": `apps/Deployment: {}`}))
out, err := captureStdout(func() {
cmd.SetArgs([]string{"health", f})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, "Health script is not configured")
})
t.Run("HealthAssessmentConfigured", func(t *testing.T) {
cmd := NewResourceOverridesCommand(newCmdContext(map[string]string{
"resource.customizations": `apps/Deployment:
health.lua: |
return { status = "Progressing" }
`}))
out, err := captureStdout(func() {
cmd.SetArgs([]string{"health", f})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, "Progressing")
})
}
func TestResourceOverrideAction(t *testing.T) {
f, closer, err := tempFile(testDeploymentYAML)
if !assert.NoError(t, err) {
return
}
defer utils.Close(closer)
t.Run("NoActions", func(t *testing.T) {
cmd := NewResourceOverridesCommand(newCmdContext(map[string]string{
"resource.customizations": `apps/Deployment: {}`}))
out, err := captureStdout(func() {
cmd.SetArgs([]string{"run-action", f, "test"})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, "Actions are not configured")
})
t.Run("ActionConfigured", func(t *testing.T) {
cmd := NewResourceOverridesCommand(newCmdContext(map[string]string{
"resource.customizations": `apps/Deployment:
actions: |
discovery.lua: |
actions = {}
actions["resume"] = {["disabled"] = false}
actions["restart"] = {["disabled"] = false}
return actions
definitions:
- name: test
action.lua: |
obj.metadata.labels["test"] = 'updated'
return obj
`}))
out, err := captureStdout(func() {
cmd.SetArgs([]string{"run-action", f, "test"})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, "test: updated")
out, err = captureStdout(func() {
cmd.SetArgs([]string{"list-actions", f})
err := cmd.Execute()
assert.NoError(t, err)
})
assert.NoError(t, err)
assert.Contains(t, out, `NAME ENABLED
restart false
resume false
`)
})
}

View File

@@ -0,0 +1,19 @@
apiVersion: v1
data:
policy.csv: |
p, role:user, clusters, get, *, allow
p, role:user, clusters, get, https://kubernetes*, deny
p, role:user, projects, get, *, allow
p, role:user, applications, get, *, allow
p, role:user, applications, create, */*, allow
p, role:user, applications, delete, *, allow
p, role:user, applications, delete, */guestbook, deny
g, test, role:user
policy.default: role:unknown
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/name: argocd-rbac-cm
app.kubernetes.io/part-of: argocd
name: argocd-rbac-cm
namespace: argocd

View File

@@ -0,0 +1,9 @@
p, role:user, clusters, get, *, allow
p, role:user, clusters, get, https://kubernetes*, deny
p, role:user, projects, get, *, allow
p, role:user, applications, get, *, allow
p, role:user, applications, create, */*, allow
p, role:user, applications, delete, *, allow
p, role:user, applications, delete, */guestbook, deny
p, role:test, certificates, get, *, allow
g, test, role:user
1 p, role:user, clusters, get, *, allow
2 p, role:user, clusters, get, https://kubernetes*, deny
3 p, role:user, projects, get, *, allow
4 p, role:user, applications, get, *, allow
5 p, role:user, applications, create, */*, allow
6 p, role:user, applications, delete, *, allow
7 p, role:user, applications, delete, */guestbook, deny
8 p, role:test, certificates, get, *, allow
9 g, test, role:user

View File

@@ -0,0 +1,787 @@
aggregationRule:
clusterRoleSelectors:
- matchLabels:
rbac.authorization.k8s.io/aggregate-to-admin: "true"
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: admin
rules:
- apiGroups:
- argoproj.io
resources:
- workflows
- workflows/finalizers
- workflowtemplates
- workflowtemplates/finalizers
- cronworkflows
- cronworkflows/finalizers
- clusterworkflowtemplates
- clusterworkflowtemplates/finalizers
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- argoproj.io
resources:
- gateways
- gateways/finalizers
- sensors
- sensors/finalizers
- eventsources
- eventsources/finalizers
- eventbuses
- eventbuses/finalizers
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- argoproj.io
resources:
- rollouts
- rollouts/scale
- experiments
- analysistemplates
- clusteranalysistemplates
- analysisruns
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- metrics.k8s.io
resources:
- pods
verbs:
- get
- list
- watch
- apiGroups:
- iammanager.keikoproj.io
resources:
- iamroles
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods/attach
- pods/exec
- pods/portforward
- pods/proxy
- secrets
- services/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- impersonate
- apiGroups:
- ""
resources:
- pods
- pods/attach
- pods/exec
- pods/portforward
- pods/proxy
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- persistentvolumeclaims
- replicationcontrollers
- replicationcontrollers/scale
- secrets
- serviceaccounts
- services
- services/proxy
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- apps
resources:
- daemonsets
- deployments
- deployments/rollback
- deployments/scale
- replicasets
- replicasets/scale
- statefulsets
- statefulsets/scale
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- batch
resources:
- cronjobs
- jobs
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- deployments/rollback
- deployments/scale
- ingresses
- networkpolicies
- replicasets
- replicasets/scale
- replicationcontrollers/scale
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- policy
resources:
- poddisruptionbudgets
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- networking.k8s.io
resources:
- networkpolicies
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- create
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- delete
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- deletecollection
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- patch
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- update
- apiGroups:
- argoproj.io
resources:
- workflows
- workflows/finalizers
- workflowtemplates
- workflowtemplates/finalizers
- cronworkflows
- cronworkflows/finalizers
- clusterworkflowtemplates
- clusterworkflowtemplates/finalizers
verbs:
- get
- list
- watch
- apiGroups:
- argoproj.io
resources:
- gateways
- gateways/finalizers
- sensors
- sensors/finalizers
- eventsources
- eventsources/finalizers
- eventbuses
- eventbuses/finalizers
verbs:
- get
- list
- watch
- apiGroups:
- argoproj.io
resources:
- rollouts
- rollouts/scale
- experiments
- analysistemplates
- clusteranalysistemplates
- analysisruns
verbs:
- get
- list
- watch
- apiGroups:
- ""
resourceNames:
- prometheus-k8s-prometheus-1
- prometheus-k8s-prometheus-0
resources:
- pods/portforward
verbs:
- create
- apiGroups:
- networking.istio.io
resources:
- virtualservices
- destinationrules
- serviceentries
- envoyfilters
- gateways
- sidecars
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- persistentvolumeclaims
- pods
- replicationcontrollers
- replicationcontrollers/scale
- serviceaccounts
- services
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- bindings
- events
- limitranges
- namespaces/status
- pods/log
- pods/status
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- daemonsets
- deployments
- deployments/scale
- replicasets
- replicasets/scale
- statefulsets
- statefulsets/scale
verbs:
- get
- list
- watch
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- get
- list
- watch
- apiGroups:
- batch
resources:
- cronjobs
- jobs
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- deployments/scale
- ingresses
- networkpolicies
- replicasets
- replicasets/scale
- replicationcontrollers/scale
verbs:
- get
- list
- watch
- apiGroups:
- policy
resources:
- poddisruptionbudgets
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- networkpolicies
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- controllerrevisions
verbs:
- get
- apiGroups:
- apps
resources:
- controllerrevisions
verbs:
- list
- apiGroups:
- apps
resources:
- controllerrevisions
verbs:
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- list
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- watch
- apiGroups:
- ""
resources:
- persistentvolumeclaims/status
verbs:
- get
- apiGroups:
- ""
resources:
- persistentvolumeclaims/status
verbs:
- list
- apiGroups:
- ""
resources:
- persistentvolumeclaims/status
verbs:
- watch
- apiGroups:
- ""
resources:
- services/status
verbs:
- get
- apiGroups:
- ""
resources:
- services/status
verbs:
- list
- apiGroups:
- ""
resources:
- services/status
verbs:
- watch
- apiGroups:
- apps
resources:
- daemonsets/status
verbs:
- get
- apiGroups:
- apps
resources:
- daemonsets/status
verbs:
- list
- apiGroups:
- apps
resources:
- daemonsets/status
verbs:
- watch
- apiGroups:
- apps
resources:
- deployments/status
verbs:
- get
- apiGroups:
- apps
resources:
- deployments/status
verbs:
- list
- apiGroups:
- apps
resources:
- deployments/status
verbs:
- watch
- apiGroups:
- apps
resources:
- replicasets/status
verbs:
- get
- apiGroups:
- apps
resources:
- replicasets/status
verbs:
- list
- apiGroups:
- apps
resources:
- replicasets/status
verbs:
- watch
- apiGroups:
- apps
resources:
- statefulsets/status
verbs:
- get
- apiGroups:
- apps
resources:
- statefulsets/status
verbs:
- list
- apiGroups:
- apps
resources:
- statefulsets/status
verbs:
- watch
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers/status
verbs:
- get
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers/status
verbs:
- list
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers/status
verbs:
- watch
- apiGroups:
- batch
resources:
- cronjobs/status
verbs:
- get
- apiGroups:
- batch
resources:
- cronjobs/status
verbs:
- list
- apiGroups:
- batch
resources:
- cronjobs/status
verbs:
- watch
- apiGroups:
- batch
resources:
- jobs/status
verbs:
- get
- apiGroups:
- batch
resources:
- jobs/status
verbs:
- list
- apiGroups:
- batch
resources:
- jobs/status
verbs:
- watch
- apiGroups:
- extensions
resources:
- daemonsets/status
verbs:
- get
- apiGroups:
- extensions
resources:
- daemonsets/status
verbs:
- list
- apiGroups:
- extensions
resources:
- daemonsets/status
verbs:
- watch
- apiGroups:
- extensions
resources:
- deployments/status
verbs:
- get
- apiGroups:
- extensions
resources:
- deployments/status
verbs:
- list
- apiGroups:
- extensions
resources:
- deployments/status
verbs:
- watch
- apiGroups:
- extensions
resources:
- ingresses/status
verbs:
- get
- apiGroups:
- extensions
resources:
- ingresses/status
verbs:
- list
- apiGroups:
- extensions
resources:
- ingresses/status
verbs:
- watch
- apiGroups:
- extensions
resources:
- replicasets/status
verbs:
- get
- apiGroups:
- extensions
resources:
- replicasets/status
verbs:
- list
- apiGroups:
- extensions
resources:
- replicasets/status
verbs:
- watch
- apiGroups:
- policy
resources:
- poddisruptionbudgets/status
verbs:
- get
- apiGroups:
- policy
resources:
- poddisruptionbudgets/status
verbs:
- list
- apiGroups:
- policy
resources:
- poddisruptionbudgets/status
verbs:
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses/status
verbs:
- get
- apiGroups:
- networking.k8s.io
resources:
- ingresses/status
verbs:
- list
- apiGroups:
- networking.k8s.io
resources:
- ingresses/status
verbs:
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- monitoring.coreos.com
resources:
- prometheusrules
verbs:
- get
- watch
- list
- update
- delete
- create
- apiGroups:
- hpa.orkaproj.io
resources:
- hpaalgoes
verbs:
- get
- watch
- list
- update
- delete
- create
- apiGroups:
- networking.istio.io
resources:
- virtualservices
- destinationrules
- serviceentries
- envoyfilters
- gateways
- sidecars
verbs:
- get
- list
- create
- update
- delete
- patch
- watch
- apiGroups:
- authorization.k8s.io
resources:
- localsubjectaccessreviews
verbs:
- create
- apiGroups:
- rbac.authorization.k8s.io
resources:
- rolebindings
- roles
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch

File diff suppressed because it is too large Load Diff

View File

@@ -4,18 +4,18 @@ import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"strconv"
"text/tabwriter"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
applicationpkg "github.com/argoproj/argo-cd/pkg/apiclient/application"
"github.com/argoproj/argo-cd/util"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
applicationpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/application"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
)
type DisplayedAction struct {
@@ -59,7 +59,7 @@ func NewApplicationResourceActionsListCommand(clientOpts *argocdclient.ClientOpt
}
appName := args[0]
conn, appIf := argocdclient.NewClientOrDie(clientOpts).NewApplicationClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
ctx := context.Background()
resources, err := appIf.ManagedResources(ctx, &applicationpkg.ResourcesQuery{ApplicationName: &appName})
errors.CheckError(err)
@@ -100,7 +100,6 @@ func NewApplicationResourceActionsListCommand(clientOpts *argocdclient.ClientOpt
case "":
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "GROUP\tKIND\tNAME\tACTION\tDISABLED\n")
fmt.Println()
for _, action := range availableActions {
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n", action.Group, action.Kind, action.Name, action.Action, strconv.FormatBool(action.Disabled))
}
@@ -144,7 +143,7 @@ func NewApplicationResourceActionsRunCommand(clientOpts *argocdclient.ClientOpti
actionName := args[1]
conn, appIf := argocdclient.NewClientOrDie(clientOpts).NewApplicationClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
ctx := context.Background()
resources, err := appIf.ManagedResources(ctx, &applicationpkg.ResourcesQuery{ApplicationName: &appName})
errors.CheckError(err)

View File

@@ -3,35 +3,161 @@ package commands
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
)
func Test_setHelmOpt(t *testing.T) {
t.Run("Zero", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{})
assert.Nil(t, src.Helm)
})
t.Run("ValueFiles", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{valueFiles: []string{"foo"}})
assert.Equal(t, []string{"foo"}, src.Helm.ValueFiles)
})
t.Run("ReleaseName", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{releaseName: "foo"})
assert.Equal(t, "foo", src.Helm.ReleaseName)
})
t.Run("HelmSets", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{helmSets: []string{"foo=bar"}})
assert.Equal(t, []v1alpha1.HelmParameter{{Name: "foo", Value: "bar"}}, src.Helm.Parameters)
})
t.Run("HelmSetStrings", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{helmSetStrings: []string{"foo=bar"}})
assert.Equal(t, []v1alpha1.HelmParameter{{Name: "foo", Value: "bar", ForceString: true}}, src.Helm.Parameters)
})
func TestFindRevisionHistoryWithoutPassedId(t *testing.T) {
histories := v1alpha1.RevisionHistories{}
histories = append(histories, v1alpha1.RevisionHistory{ID: 1})
histories = append(histories, v1alpha1.RevisionHistory{ID: 2})
histories = append(histories, v1alpha1.RevisionHistory{ID: 3})
status := v1alpha1.ApplicationStatus{
Resources: nil,
Sync: v1alpha1.SyncStatus{},
Health: v1alpha1.HealthStatus{},
History: histories,
Conditions: nil,
ReconciledAt: nil,
OperationState: nil,
ObservedAt: nil,
SourceType: "",
Summary: v1alpha1.ApplicationSummary{},
}
application := v1alpha1.Application{
Status: status,
}
history, err := findRevisionHistory(&application, -1)
if err != nil {
t.Fatal("Find revision history should fail without errors")
}
if history == nil {
t.Fatal("History should be found")
}
}
func TestFindRevisionHistoryWithoutPassedIdAndEmptyHistoryList(t *testing.T) {
histories := v1alpha1.RevisionHistories{}
status := v1alpha1.ApplicationStatus{
Resources: nil,
Sync: v1alpha1.SyncStatus{},
Health: v1alpha1.HealthStatus{},
History: histories,
Conditions: nil,
ReconciledAt: nil,
OperationState: nil,
ObservedAt: nil,
SourceType: "",
Summary: v1alpha1.ApplicationSummary{},
}
application := v1alpha1.Application{
Status: status,
}
history, err := findRevisionHistory(&application, -1)
if err == nil {
t.Fatal("Find revision history should fail with errors")
}
if history != nil {
t.Fatal("History should be empty")
}
if err.Error() != "Application '' should have at least two successful deployments" {
t.Fatal("Find revision history should fail with correct error message")
}
}
func TestFindRevisionHistoryWithPassedId(t *testing.T) {
histories := v1alpha1.RevisionHistories{}
histories = append(histories, v1alpha1.RevisionHistory{ID: 1})
histories = append(histories, v1alpha1.RevisionHistory{ID: 2})
histories = append(histories, v1alpha1.RevisionHistory{ID: 3, Revision: "123"})
status := v1alpha1.ApplicationStatus{
Resources: nil,
Sync: v1alpha1.SyncStatus{},
Health: v1alpha1.HealthStatus{},
History: histories,
Conditions: nil,
ReconciledAt: nil,
OperationState: nil,
ObservedAt: nil,
SourceType: "",
Summary: v1alpha1.ApplicationSummary{},
}
application := v1alpha1.Application{
Status: status,
}
history, err := findRevisionHistory(&application, 3)
if err != nil {
t.Fatal("Find revision history should fail without errors")
}
if history == nil {
t.Fatal("History should be found")
}
if history.Revision != "123" {
t.Fatal("Failed to find correct history with correct revision")
}
}
func TestFindRevisionHistoryWithPassedIdThatNotExist(t *testing.T) {
histories := v1alpha1.RevisionHistories{}
histories = append(histories, v1alpha1.RevisionHistory{ID: 1})
histories = append(histories, v1alpha1.RevisionHistory{ID: 2})
histories = append(histories, v1alpha1.RevisionHistory{ID: 3, Revision: "123"})
status := v1alpha1.ApplicationStatus{
Resources: nil,
Sync: v1alpha1.SyncStatus{},
Health: v1alpha1.HealthStatus{},
History: histories,
Conditions: nil,
ReconciledAt: nil,
OperationState: nil,
ObservedAt: nil,
SourceType: "",
Summary: v1alpha1.ApplicationSummary{},
}
application := v1alpha1.Application{
Status: status,
}
history, err := findRevisionHistory(&application, 4)
if err == nil {
t.Fatal("Find revision history should fail with errors")
}
if history != nil {
t.Fatal("History should be not found")
}
if err.Error() != "Application '' does not have deployment id '4' in history\n" {
t.Fatal("Find revision history should fail with correct error message")
}
}

View File

@@ -2,6 +2,7 @@ package commands
import (
"context"
"crypto/x509"
"fmt"
"os"
"sort"
@@ -10,14 +11,12 @@ import (
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
certificatepkg "github.com/argoproj/argo-cd/pkg/apiclient/certificate"
appsv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/util"
certutil "github.com/argoproj/argo-cd/util/cert"
"crypto/x509"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
certificatepkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/certificate"
appsv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
certutil "github.com/argoproj/argo-cd/v2/util/cert"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
)
// NewCertCommand returns a new instance of an `argocd repo` command
@@ -66,7 +65,7 @@ func NewCertAddTLSCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
Short: "Add TLS certificate data for connecting to repository server SERVERNAME",
Run: func(c *cobra.Command, args []string) {
conn, certIf := argocdclient.NewClientOrDie(clientOpts).NewCertClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
if len(args) != 1 {
c.HelpFunc()(c, args)
@@ -149,7 +148,7 @@ func NewCertAddSSHCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
Run: func(c *cobra.Command, args []string) {
conn, certIf := argocdclient.NewClientOrDie(clientOpts).NewCertClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
var sshKnownHostsLists []string
var err error
@@ -174,18 +173,20 @@ func NewCertAddSSHCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
}
for _, knownHostsEntry := range sshKnownHostsLists {
hostname, certSubType, certData, err := certutil.TokenizeSSHKnownHostsEntry(knownHostsEntry)
_, certSubType, certData, err := certutil.TokenizeSSHKnownHostsEntry(knownHostsEntry)
errors.CheckError(err)
_, _, err = certutil.KnownHostsLineToPublicKey(knownHostsEntry)
hostnameList, _, err := certutil.KnownHostsLineToPublicKey(knownHostsEntry)
errors.CheckError(err)
certificate := appsv1.RepositoryCertificate{
ServerName: hostname,
CertType: "ssh",
CertSubType: certSubType,
CertData: certData,
// Each key could be valid for multiple hostnames
for _, hostname := range hostnameList {
certificate := appsv1.RepositoryCertificate{
ServerName: hostname,
CertType: "ssh",
CertSubType: certSubType,
CertData: certData,
}
certificates = append(certificates, certificate)
}
certificates = append(certificates, certificate)
}
certList := &appsv1.RepositoryCertificateList{Items: certificates}
@@ -219,7 +220,7 @@ func NewCertRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
os.Exit(1)
}
conn, certIf := argocdclient.NewClientOrDie(clientOpts).NewCertClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
hostNamePattern := args[0]
// Prevent the user from specifying a wildcard as hostname as precaution
@@ -274,7 +275,7 @@ func NewCertListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
}
conn, certIf := argocdclient.NewClientOrDie(clientOpts).NewCertClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
certificates, err := certIf.ListCertificates(context.Background(), &certificatepkg.RepositoryCertificateQuery{HostNamePattern: hostNamePattern, CertType: certType})
errors.CheckError(err)

View File

@@ -3,25 +3,29 @@ package commands
import (
"context"
"fmt"
"io/ioutil"
"os"
"sort"
"regexp"
"strings"
"text/tabwriter"
"github.com/mattn/go-isatty"
"k8s.io/client-go/kubernetes"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/text/label"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
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"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
"github.com/argoproj/argo-cd/v2/common"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
clusterpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster"
argoappv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/clusterauth"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
)
// NewClusterCommand returns a new instance of an `argocd cluster` command
@@ -58,12 +62,10 @@ func NewClusterCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clientc
// NewClusterAddCommand returns a new instance of an `argocd cluster add` command
func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clientcmd.PathOptions) *cobra.Command {
var (
inCluster bool
upsert bool
awsRoleArn string
awsClusterName string
systemNamespace string
namespaces []string
clusterOpts cmdutil.ClusterOptions
skipConfirmation bool
labels []string
annotations []string
)
var command = &cobra.Command{
Use: "add CONTEXT",
@@ -72,7 +74,7 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
var configAccess clientcmd.ConfigAccess = pathOpts
if len(args) == 0 {
log.Error("Choose a context name from:")
printKubeContexts(configAccess)
cmdutil.PrintKubeContexts(configAccess)
os.Exit(1)
}
config, err := configAccess.GetStartingConfig()
@@ -83,6 +85,15 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
log.Fatalf("Context %s does not exist in kubeconfig", contextName)
}
isTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd())
if isTerminal && !skipConfirmation {
message := fmt.Sprintf("WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `%s` with full cluster level admin privileges. Do you want to continue [y/N]? ", contextName)
if !cli.AskToProceed(message) {
os.Exit(1)
}
}
overrides := clientcmd.ConfigOverrides{
Context: *clstContext,
}
@@ -92,27 +103,55 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
managerBearerToken := ""
var awsAuthConf *argoappv1.AWSAuthConfig
if awsClusterName != "" {
var execProviderConf *argoappv1.ExecProviderConfig
if clusterOpts.AwsClusterName != "" {
awsAuthConf = &argoappv1.AWSAuthConfig{
ClusterName: awsClusterName,
RoleARN: awsRoleArn,
ClusterName: clusterOpts.AwsClusterName,
RoleARN: clusterOpts.AwsRoleArn,
}
} else if clusterOpts.ExecProviderCommand != "" {
execProviderConf = &argoappv1.ExecProviderConfig{
Command: clusterOpts.ExecProviderCommand,
Args: clusterOpts.ExecProviderArgs,
Env: clusterOpts.ExecProviderEnv,
APIVersion: clusterOpts.ExecProviderAPIVersion,
InstallHint: clusterOpts.ExecProviderInstallHint,
}
} else {
// Install RBAC resources for managing the cluster
clientset, err := kubernetes.NewForConfig(conf)
errors.CheckError(err)
managerBearerToken, err = clusterauth.InstallClusterManagerRBAC(clientset, systemNamespace, namespaces)
if clusterOpts.ServiceAccount != "" {
managerBearerToken, err = clusterauth.GetServiceAccountBearerToken(clientset, clusterOpts.SystemNamespace, clusterOpts.ServiceAccount)
} else {
managerBearerToken, err = clusterauth.InstallClusterManagerRBAC(clientset, clusterOpts.SystemNamespace, clusterOpts.Namespaces)
}
errors.CheckError(err)
}
labelsMap, err := label.Parse(labels)
errors.CheckError(err)
annotationsMap, err := label.Parse(annotations)
errors.CheckError(err)
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
defer util.Close(conn)
clst := newCluster(contextName, namespaces, conf, managerBearerToken, awsAuthConf)
if inCluster {
clst.Server = common.KubernetesInternalAPIServerAddr
defer io.Close(conn)
if clusterOpts.Name != "" {
contextName = clusterOpts.Name
}
clst := cmdutil.NewCluster(contextName, clusterOpts.Namespaces, clusterOpts.ClusterResources, conf, managerBearerToken, awsAuthConf, execProviderConf, labelsMap, annotationsMap)
if clusterOpts.InCluster {
clst.Server = argoappv1.KubernetesInternalAPIServerAddr
}
if clusterOpts.Shard >= 0 {
clst.Shard = &clusterOpts.Shard
}
if clusterOpts.Project != "" {
clst.Project = clusterOpts.Project
}
clstCreateReq := clusterpkg.ClusterCreateRequest{
Cluster: clst,
Upsert: upsert,
Upsert: clusterOpts.Upsert,
}
_, err = clusterIf.Create(context.Background(), &clstCreateReq)
errors.CheckError(err)
@@ -120,97 +159,36 @@ func NewClusterAddCommand(clientOpts *argocdclient.ClientOptions, pathOpts *clie
},
}
command.PersistentFlags().StringVar(&pathOpts.LoadingRules.ExplicitPath, pathOpts.ExplicitFileFlag, pathOpts.LoadingRules.ExplicitPath, "use a particular kubeconfig file")
command.Flags().BoolVar(&inCluster, "in-cluster", false, "Indicates Argo CD resides inside this cluster and should connect using the internal k8s hostname (kubernetes.default.svc)")
command.Flags().BoolVar(&upsert, "upsert", false, "Override an existing cluster with the same name even if the spec differs")
command.Flags().StringVar(&awsClusterName, "aws-cluster-name", "", "AWS Cluster name if set then aws-iam-authenticator will be used to access cluster")
command.Flags().StringVar(&awsRoleArn, "aws-role-arn", "", "Optional AWS role arn. If set then AWS IAM Authenticator assume a role to perform cluster operations instead of the default AWS credential provider chain.")
command.Flags().StringVar(&systemNamespace, "system-namespace", common.DefaultSystemNamespace, "Use different system namespace")
command.Flags().StringArrayVar(&namespaces, "namespace", nil, "List of namespaces which are allowed to manage")
command.Flags().BoolVar(&clusterOpts.Upsert, "upsert", false, "Override an existing cluster with the same name even if the spec differs")
command.Flags().StringVar(&clusterOpts.ServiceAccount, "service-account", "", fmt.Sprintf("System namespace service account to use for kubernetes resource management. If not set then default \"%s\" SA will be created", clusterauth.ArgoCDManagerServiceAccount))
command.Flags().StringVar(&clusterOpts.SystemNamespace, "system-namespace", common.DefaultSystemNamespace, "Use different system namespace")
command.Flags().BoolVarP(&skipConfirmation, "yes", "y", false, "Skip explicit confirmation")
command.Flags().StringArrayVar(&labels, "label", nil, "Set metadata labels (e.g. --label key=value)")
command.Flags().StringArrayVar(&annotations, "annotation", nil, "Set metadata annotations (e.g. --annotation key=value)")
cmdutil.AddClusterFlags(command, &clusterOpts)
return command
}
func printKubeContexts(ca clientcmd.ConfigAccess) {
config, err := ca.GetStartingConfig()
errors.CheckError(err)
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
defer func() { _ = w.Flush() }()
columnNames := []string{"CURRENT", "NAME", "CLUSTER", "SERVER"}
_, err = fmt.Fprintf(w, "%s\n", strings.Join(columnNames, "\t"))
errors.CheckError(err)
// sort names so output is deterministic
contextNames := make([]string, 0)
for name := range config.Contexts {
contextNames = append(contextNames, name)
}
sort.Strings(contextNames)
if config.Clusters == nil {
return
}
for _, name := range contextNames {
// ignore malformed kube config entries
context := config.Contexts[name]
if context == nil {
continue
}
cluster := config.Clusters[context.Cluster]
if cluster == nil {
continue
}
prefix := " "
if config.CurrentContext == name {
prefix = "*"
}
_, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", prefix, name, context.Cluster, cluster.Server)
errors.CheckError(err)
}
}
func newCluster(name string, namespaces []string, conf *rest.Config, managerBearerToken string, awsAuthConf *argoappv1.AWSAuthConfig) *argoappv1.Cluster {
tlsClientConfig := argoappv1.TLSClientConfig{
Insecure: conf.TLSClientConfig.Insecure,
ServerName: conf.TLSClientConfig.ServerName,
CAData: conf.TLSClientConfig.CAData,
}
if len(conf.TLSClientConfig.CAData) == 0 && conf.TLSClientConfig.CAFile != "" {
data, err := ioutil.ReadFile(conf.TLSClientConfig.CAFile)
errors.CheckError(err)
tlsClientConfig.CAData = data
}
clst := argoappv1.Cluster{
Server: conf.Host,
Name: name,
Namespaces: namespaces,
Config: argoappv1.ClusterConfig{
BearerToken: managerBearerToken,
TLSClientConfig: tlsClientConfig,
AWSAuthConfig: awsAuthConf,
},
}
return &clst
}
// NewClusterGetCommand returns a new instance of an `argocd cluster get` command
func NewClusterGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
)
var command = &cobra.Command{
Use: "get SERVER",
Short: "Get cluster information",
Example: `argocd cluster get https://12.34.567.89`,
Use: "get SERVER/NAME",
Short: "Get cluster information",
Example: `argocd cluster get https://12.34.567.89
argocd cluster get in-cluster`,
Run: func(c *cobra.Command, args []string) {
if len(args) == 0 {
c.HelpFunc()(c, args)
os.Exit(1)
}
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
clusters := make([]argoappv1.Cluster, 0)
for _, clusterName := range args {
clst, err := clusterIf.Get(context.Background(), &clusterpkg.ClusterQuery{Server: clusterName})
for _, clusterSelector := range args {
clst, err := clusterIf.Get(context.Background(), getQueryBySelector(clusterSelector))
errors.CheckError(err)
clusters = append(clusters, *clst)
}
@@ -276,7 +254,7 @@ func NewClusterRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
os.Exit(1)
}
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
// clientset, err := kubernetes.NewForConfig(conf)
// errors.CheckError(err)
@@ -287,6 +265,7 @@ func NewClusterRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
// errors.CheckError(err)
_, err := clusterIf.Delete(context.Background(), &clusterpkg.ClusterQuery{Server: clusterName})
errors.CheckError(err)
fmt.Printf("Cluster '%s' removed\n", clusterName)
}
},
}
@@ -296,17 +275,29 @@ func NewClusterRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
// Print table of cluster information
func printClusterTable(clusters []argoappv1.Cluster) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
_, _ = fmt.Fprintf(w, "SERVER\tNAME\tVERSION\tSTATUS\tMESSAGE\n")
_, _ = fmt.Fprintf(w, "SERVER\tNAME\tVERSION\tSTATUS\tMESSAGE\tPROJECT\n")
for _, c := range clusters {
server := c.Server
if len(c.Namespaces) > 0 {
server = fmt.Sprintf("%s (%d namespaces)", c.Server, len(c.Namespaces))
}
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n", server, c.Name, c.ServerVersion, c.ConnectionState.Status, c.ConnectionState.Message)
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\n", server, c.Name, c.ServerVersion, c.ConnectionState.Status, c.ConnectionState.Message, c.Project)
}
_ = w.Flush()
}
// Returns cluster query for getting cluster depending on the cluster selector
func getQueryBySelector(clusterSelector string) *clusterpkg.ClusterQuery {
var query clusterpkg.ClusterQuery
isServer, err := regexp.MatchString(`^https?://`, clusterSelector)
if isServer || err != nil {
query.Server = clusterSelector
} else {
query.Name = clusterSelector
}
return &query
}
// Print list of cluster servers
func printClusterServers(clusters []argoappv1.Cluster) {
for _, c := range clusters {
@@ -324,7 +315,7 @@ func NewClusterListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman
Short: "List configured clusters",
Run: func(c *cobra.Command, args []string) {
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
clusters, err := clusterIf.List(context.Background(), &clusterpkg.ClusterQuery{})
errors.CheckError(err)
switch output {
@@ -356,7 +347,7 @@ func NewClusterRotateAuthCommand(clientOpts *argocdclient.ClientOptions) *cobra.
os.Exit(1)
}
conn, clusterIf := argocdclient.NewClientOrDie(clientOpts).NewClusterClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
clusterQuery := clusterpkg.ClusterQuery{
Server: args[0],
}

View File

@@ -5,9 +5,25 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/stretchr/testify/assert"
)
func Test_getQueryBySelector(t *testing.T) {
query := getQueryBySelector("my-cluster")
assert.Equal(t, query.Name, "my-cluster")
assert.Equal(t, query.Server, "")
query = getQueryBySelector("http://my-server")
assert.Equal(t, query.Name, "")
assert.Equal(t, query.Server, "http://my-server")
query = getQueryBySelector("https://my-server")
assert.Equal(t, query.Name, "")
assert.Equal(t, query.Server, "https://my-server")
}
func Test_printClusterTable(t *testing.T) {
printClusterTable([]v1alpha1.Cluster{
{

View File

@@ -3,9 +3,9 @@ package commands
import (
"fmt"
"io"
"log"
"os"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

View File

@@ -11,9 +11,9 @@ import (
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
"github.com/argoproj/argo-cd/util/localconfig"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/localconfig"
)
// NewContextCommand returns a new instance of an `argocd ctx` command

View File

@@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/argoproj/argo-cd/util/localconfig"
"github.com/argoproj/argo-cd/v2/util/localconfig"
)
const testConfig = `contexts:

162
cmd/argocd/commands/gpg.go Normal file
View File

@@ -0,0 +1,162 @@
package commands
import (
"context"
"fmt"
"io/ioutil"
"os"
"strings"
"text/tabwriter"
"github.com/spf13/cobra"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
gpgkeypkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/gpgkey"
appsv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/errors"
argoio "github.com/argoproj/argo-cd/v2/util/io"
)
// NewGPGCommand returns a new instance of an `argocd repo` command
func NewGPGCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "gpg",
Short: "Manage GPG keys used for signature verification",
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
os.Exit(1)
},
Example: ``,
}
command.AddCommand(NewGPGListCommand(clientOpts))
command.AddCommand(NewGPGGetCommand(clientOpts))
command.AddCommand(NewGPGAddCommand(clientOpts))
command.AddCommand(NewGPGDeleteCommand(clientOpts))
return command
}
// NewGPGListCommand lists all configured public keys from the server
func NewGPGListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
)
var command = &cobra.Command{
Use: "list",
Short: "List configured GPG public keys",
Run: func(c *cobra.Command, args []string) {
conn, gpgIf := argocdclient.NewClientOrDie(clientOpts).NewGPGKeyClientOrDie()
defer argoio.Close(conn)
keys, err := gpgIf.List(context.Background(), &gpgkeypkg.GnuPGPublicKeyQuery{})
errors.CheckError(err)
switch output {
case "yaml", "json":
err := PrintResourceList(keys.Items, output, false)
errors.CheckError(err)
case "wide", "":
printKeyTable(keys.Items)
default:
errors.CheckError(fmt.Errorf("unknown output format: %s", output))
}
},
}
command.Flags().StringVarP(&output, "output", "o", "wide", "Output format. One of: json|yaml|wide")
return command
}
// NewGPGGetCommand retrieves a single public key from the server
func NewGPGGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
)
var command = &cobra.Command{
Use: "get KEYID",
Short: "Get the GPG public key with ID <KEYID> from the server",
Run: func(c *cobra.Command, args []string) {
if len(args) != 1 {
errors.CheckError(fmt.Errorf("Missing KEYID argument"))
}
conn, gpgIf := argocdclient.NewClientOrDie(clientOpts).NewGPGKeyClientOrDie()
defer argoio.Close(conn)
key, err := gpgIf.Get(context.Background(), &gpgkeypkg.GnuPGPublicKeyQuery{KeyID: args[0]})
errors.CheckError(err)
switch output {
case "yaml", "json":
err := PrintResourceList(key, output, false)
errors.CheckError(err)
case "wide", "":
fmt.Printf("Key ID: %s\n", key.KeyID)
fmt.Printf("Key fingerprint: %s\n", key.Fingerprint)
fmt.Printf("Key subtype: %s\n", strings.ToUpper(key.SubType))
fmt.Printf("Key owner: %s\n", key.Owner)
fmt.Printf("Key data follows until EOF:\n%s\n", key.KeyData)
default:
errors.CheckError(fmt.Errorf("unknown output format: %s", output))
}
},
}
command.Flags().StringVarP(&output, "output", "o", "wide", "Output format. One of: json|yaml|wide")
return command
}
// NewGPGAddCommand adds a public key to the server's configuration
func NewGPGAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
fromFile string
)
var command = &cobra.Command{
Use: "add",
Short: "Adds a GPG public key to the server's keyring",
Run: func(c *cobra.Command, args []string) {
if fromFile == "" {
errors.CheckError(fmt.Errorf("--from is mandatory"))
}
keyData, err := ioutil.ReadFile(fromFile)
if err != nil {
errors.CheckError(err)
}
conn, gpgIf := argocdclient.NewClientOrDie(clientOpts).NewGPGKeyClientOrDie()
defer argoio.Close(conn)
resp, err := gpgIf.Create(context.Background(), &gpgkeypkg.GnuPGPublicKeyCreateRequest{Publickey: &appsv1.GnuPGPublicKey{KeyData: string(keyData)}})
errors.CheckError(err)
fmt.Printf("Created %d key(s) from input file", len(resp.Created.Items))
if len(resp.Skipped) > 0 {
fmt.Printf(", and %d key(s) were skipped because they exist already", len(resp.Skipped))
}
fmt.Printf(".\n")
},
}
command.Flags().StringVarP(&fromFile, "from", "f", "", "Path to the file that contains the GPG public key to import")
return command
}
// NewGPGDeleteCommand removes a key from the server's keyring
func NewGPGDeleteCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "rm KEYID",
Short: "Removes a GPG public key from the server's keyring",
Run: func(c *cobra.Command, args []string) {
if len(args) != 1 {
errors.CheckError(fmt.Errorf("Missing KEYID argument"))
}
conn, gpgIf := argocdclient.NewClientOrDie(clientOpts).NewGPGKeyClientOrDie()
defer argoio.Close(conn)
_, err := gpgIf.Delete(context.Background(), &gpgkeypkg.GnuPGPublicKeyQuery{KeyID: args[0]})
errors.CheckError(err)
fmt.Printf("Deleted key with key ID %s\n", args[0])
},
}
return command
}
// Print table of certificate info
func printKeyTable(keys []appsv1.GnuPGPublicKey) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "KEYID\tTYPE\tIDENTITY\n")
for _, k := range keys {
fmt.Fprintf(w, "%s\t%s\t%s\n", k.KeyID, strings.ToUpper(k.SubType), k.Owner)
}
_ = w.Flush()
}

View File

@@ -0,0 +1,103 @@
package headless
import (
"context"
"fmt"
"sync"
"time"
"github.com/go-redis/redis/v8"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
repoapiclient "github.com/argoproj/argo-cd/v2/reposerver/apiclient"
"github.com/argoproj/argo-cd/v2/util/cache"
"github.com/argoproj/argo-cd/v2/util/io"
kubeutil "github.com/argoproj/argo-cd/v2/util/kube"
)
type forwardCacheClient struct {
namespace string
context string
init sync.Once
client cache.CacheClient
err error
}
func (c *forwardCacheClient) doLazy(action func(client cache.CacheClient) error) error {
c.init.Do(func() {
overrides := clientcmd.ConfigOverrides{
CurrentContext: c.context,
}
redisPort, err := kubeutil.PortForward(6379, c.namespace, &overrides,
"app.kubernetes.io/name=argocd-redis-ha-haproxy", "app.kubernetes.io/name=argocd-redis")
if err != nil {
c.err = err
return
}
redisClient := redis.NewClient(&redis.Options{Addr: fmt.Sprintf("localhost:%d", redisPort)})
c.client = cache.NewRedisCache(redisClient, time.Hour)
})
if c.err != nil {
return c.err
}
return action(c.client)
}
func (c *forwardCacheClient) Set(item *cache.Item) error {
return c.doLazy(func(client cache.CacheClient) error {
return client.Set(item)
})
}
func (c *forwardCacheClient) Get(key string, obj interface{}) error {
return c.doLazy(func(client cache.CacheClient) error {
return client.Get(key, obj)
})
}
func (c *forwardCacheClient) Delete(key string) error {
return c.doLazy(func(client cache.CacheClient) error {
return client.Delete(key)
})
}
func (c *forwardCacheClient) OnUpdated(ctx context.Context, key string, callback func() error) error {
return c.doLazy(func(client cache.CacheClient) error {
return client.OnUpdated(ctx, key, callback)
})
}
func (c *forwardCacheClient) NotifyUpdated(key string) error {
return c.doLazy(func(client cache.CacheClient) error {
return client.NotifyUpdated(key)
})
}
type forwardRepoClientset struct {
namespace string
context string
init sync.Once
repoClientset repoapiclient.Clientset
err error
}
func (c *forwardRepoClientset) NewRepoServerClient() (io.Closer, repoapiclient.RepoServerServiceClient, error) {
c.init.Do(func() {
overrides := clientcmd.ConfigOverrides{
CurrentContext: c.context,
}
repoServerPort, err := kubeutil.PortForward(8081, c.namespace, &overrides, "app.kubernetes.io/name=argocd-repo-server")
if err != nil {
c.err = err
return
}
c.repoClientset = apiclient.NewRepoServerClientset(fmt.Sprintf("localhost:%d", repoServerPort), 60, apiclient.TLSConfiguration{
DisableTLS: false, StrictValidation: false})
})
if c.err != nil {
return nil, nil, c.err
}
return c.repoClientset.NewRepoServerClient()
}

View File

@@ -0,0 +1,162 @@
package headless
import (
"context"
"fmt"
"net"
"os"
"time"
"github.com/alicebob/miniredis/v2"
"github.com/go-redis/redis/v8"
"github.com/golang/protobuf/ptypes/empty"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
argoapi "github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
"github.com/argoproj/argo-cd/v2/server"
servercache "github.com/argoproj/argo-cd/v2/server/cache"
cacheutil "github.com/argoproj/argo-cd/v2/util/cache"
appstatecache "github.com/argoproj/argo-cd/v2/util/cache/appstate"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/argo-cd/v2/util/localconfig"
flag "github.com/spf13/pflag"
)
func testAPI(clientOpts *argoapi.ClientOptions) error {
apiClient, err := argoapi.NewClient(clientOpts)
if err != nil {
return err
}
closer, versionClient, err := apiClient.NewVersionClient()
if err != nil {
return err
}
defer io.Close(closer)
_, err = versionClient.Version(context.Background(), &empty.Empty{})
return err
}
func retrieveContextIfChanged(contextFlag *flag.Flag) string {
if contextFlag != nil && contextFlag.Changed {
return contextFlag.Value.String()
}
return ""
}
// InitCommand allows executing command in a headless mode: on the fly starts Argo CD API server and
// changes provided client options to use started API server port
func InitCommand(cmd *cobra.Command, clientOpts *argoapi.ClientOptions, port *int) *cobra.Command {
ctx, cancel := context.WithCancel(context.Background())
flags := pflag.NewFlagSet("tmp", pflag.ContinueOnError)
clientConfig := cli.AddKubectlFlagsToSet(flags)
// copy k8s persistent flags into argocd command flags
flags.VisitAll(func(flag *pflag.Flag) {
// skip Kubernetes server flags since argocd has it's own server flag
if flag.Name == "server" {
return
}
cmd.Flags().AddFlag(flag)
})
cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {
startInProcessAPI := clientOpts.Core
if !startInProcessAPI {
localCfg, err := localconfig.ReadLocalConfig(clientOpts.ConfigPath)
if err != nil {
return err
}
if localCfg != nil {
configCtx, err := localCfg.ResolveContext(clientOpts.Context)
if err != nil {
return err
}
startInProcessAPI = configCtx.Server.Core
}
}
if !startInProcessAPI {
return nil
}
// get rid of logging error handler
runtime.ErrorHandlers = runtime.ErrorHandlers[1:]
cli.SetLogLevel(log.ErrorLevel.String())
log.SetLevel(log.ErrorLevel)
os.Setenv(v1alpha1.EnvVarFakeInClusterConfig, "true")
if port == nil || *port == 0 {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return err
}
port = &ln.Addr().(*net.TCPAddr).Port
io.Close(ln)
}
restConfig, err := clientConfig.ClientConfig()
if err != nil {
return err
}
appClientset, err := appclientset.NewForConfig(restConfig)
if err != nil {
return err
}
kubeClientset, err := kubernetes.NewForConfig(restConfig)
if err != nil {
return err
}
namespace, _, err := clientConfig.Namespace()
if err != nil {
return err
}
context := retrieveContextIfChanged(cmd.Flag("context"))
mr, err := miniredis.Run()
if err != nil {
return err
}
appstateCache := appstatecache.NewCache(cacheutil.NewCache(&forwardCacheClient{namespace: namespace, context: context}), time.Hour)
srv := server.NewServer(ctx, server.ArgoCDServerOpts{
EnableGZip: false,
Namespace: namespace,
ListenPort: *port,
AppClientset: appClientset,
DisableAuth: true,
RedisClient: redis.NewClient(&redis.Options{Addr: mr.Addr()}),
Cache: servercache.NewCache(appstateCache, 0, 0, 0),
KubeClientset: kubeClientset,
Insecure: true,
ListenHost: "localhost",
RepoClientset: &forwardRepoClientset{namespace: namespace, context: context},
})
go srv.Run(ctx, *port, 0)
clientOpts.ServerAddr = fmt.Sprintf("localhost:%d", *port)
clientOpts.PlainText = true
if !cache.WaitForCacheSync(ctx.Done(), srv.Initialized) {
log.Fatal("Timed out waiting for project cache to sync")
}
tries := 5
for i := 0; i < tries; i++ {
err = testAPI(clientOpts)
if err == nil {
break
}
time.Sleep(time.Second)
}
return err
}
cmd.PostRun = func(cmd *cobra.Command, args []string) {
cancel()
}
return cmd
}

View File

@@ -0,0 +1,80 @@
package headless
import (
"testing"
flag "github.com/spf13/pflag"
"github.com/stretchr/testify/assert"
)
type StringFlag struct {
// The exact value provided on the flag
value string
}
func (f StringFlag) String() string {
return f.value
}
func (f *StringFlag) Set(value string) error {
f.value = value
return nil
}
func (f *StringFlag) Type() string {
return "string"
}
func Test_FlagContextNotChanged(t *testing.T) {
res := retrieveContextIfChanged(&flag.Flag{
Name: "",
Shorthand: "",
Usage: "",
Value: &StringFlag{value: "test"},
DefValue: "",
Changed: false,
NoOptDefVal: "",
Deprecated: "",
Hidden: false,
ShorthandDeprecated: "",
Annotations: nil,
})
assert.Equal(t, "", res)
}
func Test_FlagContextChanged(t *testing.T) {
res := retrieveContextIfChanged(&flag.Flag{
Name: "",
Shorthand: "",
Usage: "",
Value: &StringFlag{value: "test"},
DefValue: "",
Changed: true,
NoOptDefVal: "",
Deprecated: "",
Hidden: false,
ShorthandDeprecated: "",
Annotations: nil,
})
assert.Equal(t, "test", res)
}
func Test_FlagContextNil(t *testing.T) {
res := retrieveContextIfChanged(&flag.Flag{
Name: "",
Shorthand: "",
Usage: "",
Value: nil,
DefValue: "",
Changed: false,
NoOptDefVal: "",
Deprecated: "",
Hidden: false,
ShorthandDeprecated: "",
Annotations: nil,
})
assert.Equal(t, "", res)
}

View File

@@ -2,29 +2,34 @@ package commands
import (
"context"
"crypto/sha256"
"encoding/base64"
"fmt"
"html"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/coreos/go-oidc"
"github.com/dgrijalva/jwt-go"
"github.com/dgrijalva/jwt-go/v4"
log "github.com/sirupsen/logrus"
"github.com/skratchdot/open-golang/open"
"github.com/spf13/cobra"
"golang.org/x/oauth2"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
sessionpkg "github.com/argoproj/argo-cd/pkg/apiclient/session"
settingspkg "github.com/argoproj/argo-cd/pkg/apiclient/settings"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/cli"
grpc_util "github.com/argoproj/argo-cd/util/grpc"
"github.com/argoproj/argo-cd/util/localconfig"
oidcutil "github.com/argoproj/argo-cd/util/oidc"
"github.com/argoproj/argo-cd/util/rand"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
sessionpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/session"
settingspkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/settings"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
grpc_util "github.com/argoproj/argo-cd/v2/util/grpc"
"github.com/argoproj/argo-cd/v2/util/io"
jwtutil "github.com/argoproj/argo-cd/v2/util/jwt"
"github.com/argoproj/argo-cd/v2/util/localconfig"
oidcutil "github.com/argoproj/argo-cd/v2/util/oidc"
"github.com/argoproj/argo-cd/v2/util/rand"
)
// NewLoginCommand returns a new instance of `argocd login` command
@@ -40,69 +45,97 @@ func NewLoginCommand(globalClientOpts *argocdclient.ClientOptions) *cobra.Comman
Use: "login SERVER",
Short: "Log in to Argo CD",
Long: "Log in to Argo CD",
Example: `# Login to Argo CD using a username and password
argocd login cd.argoproj.io
# Login to Argo CD using SSO
argocd login cd.argoproj.io --sso
# Configure direct access using Kubernetes API server
argocd login cd.argoproj.io --core`,
Run: func(c *cobra.Command, args []string) {
if len(args) == 0 {
var server string
if len(args) != 1 && !globalClientOpts.PortForward && !globalClientOpts.Core {
c.HelpFunc()(c, args)
os.Exit(1)
}
server := args[0]
tlsTestResult, err := grpc_util.TestTLS(server)
errors.CheckError(err)
if !tlsTestResult.TLS {
if !globalClientOpts.PlainText {
if !cli.AskToProceed("WARNING: server is not configured with TLS. Proceed (y/n)? ") {
os.Exit(1)
if globalClientOpts.PortForward {
server = "port-forward"
} else if globalClientOpts.Core {
server = "kubernetes"
} else {
server = args[0]
tlsTestResult, err := grpc_util.TestTLS(server)
errors.CheckError(err)
if !tlsTestResult.TLS {
if !globalClientOpts.PlainText {
if !cli.AskToProceed("WARNING: server is not configured with TLS. Proceed (y/n)? ") {
os.Exit(1)
}
globalClientOpts.PlainText = true
}
globalClientOpts.PlainText = true
}
} else if tlsTestResult.InsecureErr != nil {
if !globalClientOpts.Insecure {
if !cli.AskToProceed(fmt.Sprintf("WARNING: server certificate had error: %s. Proceed insecurely (y/n)? ", tlsTestResult.InsecureErr)) {
os.Exit(1)
} else if tlsTestResult.InsecureErr != nil {
if !globalClientOpts.Insecure {
if !cli.AskToProceed(fmt.Sprintf("WARNING: server certificate had error: %s. Proceed insecurely (y/n)? ", tlsTestResult.InsecureErr)) {
os.Exit(1)
}
globalClientOpts.Insecure = true
}
globalClientOpts.Insecure = true
}
}
clientOpts := argocdclient.ClientOptions{
ConfigPath: "",
ServerAddr: server,
Insecure: globalClientOpts.Insecure,
PlainText: globalClientOpts.PlainText,
GRPCWeb: globalClientOpts.GRPCWeb,
ConfigPath: "",
ServerAddr: server,
Insecure: globalClientOpts.Insecure,
PlainText: globalClientOpts.PlainText,
ClientCertFile: globalClientOpts.ClientCertFile,
ClientCertKeyFile: globalClientOpts.ClientCertKeyFile,
GRPCWeb: globalClientOpts.GRPCWeb,
GRPCWebRootPath: globalClientOpts.GRPCWebRootPath,
PortForward: globalClientOpts.PortForward,
PortForwardNamespace: globalClientOpts.PortForwardNamespace,
Headers: globalClientOpts.Headers,
}
acdClient := argocdclient.NewClientOrDie(&clientOpts)
setConn, setIf := acdClient.NewSettingsClientOrDie()
defer util.Close(setConn)
if ctxName == "" {
ctxName = server
if globalClientOpts.GRPCWebRootPath != "" {
rootPath := strings.TrimRight(strings.TrimLeft(globalClientOpts.GRPCWebRootPath, "/"), "/")
ctxName = fmt.Sprintf("%s/%s", server, rootPath)
}
}
// Perform the login
var tokenString string
var refreshToken string
if !sso {
tokenString = passwordLogin(acdClient, username, password)
} else {
ctx := context.Background()
httpClient, err := acdClient.HTTPClient()
if !globalClientOpts.Core {
acdClient := argocdclient.NewClientOrDie(&clientOpts)
setConn, setIf := acdClient.NewSettingsClientOrDie()
defer io.Close(setConn)
if !sso {
tokenString = passwordLogin(acdClient, username, password)
} else {
ctx := context.Background()
httpClient, err := acdClient.HTTPClient()
errors.CheckError(err)
ctx = oidc.ClientContext(ctx, httpClient)
acdSet, err := setIf.Get(ctx, &settingspkg.SettingsQuery{})
errors.CheckError(err)
oauth2conf, provider, err := acdClient.OIDCConfig(ctx, acdSet)
errors.CheckError(err)
tokenString, refreshToken = oauth2Login(ctx, ssoPort, acdSet.GetOIDCConfig(), oauth2conf, provider)
}
parser := &jwt.Parser{
ValidationHelper: jwt.NewValidationHelper(jwt.WithoutClaimsValidation(), jwt.WithoutAudienceValidation()),
}
claims := jwt.MapClaims{}
_, _, err := parser.ParseUnverified(tokenString, &claims)
errors.CheckError(err)
ctx = oidc.ClientContext(ctx, httpClient)
acdSet, err := setIf.Get(ctx, &settingspkg.SettingsQuery{})
errors.CheckError(err)
oauth2conf, provider, err := acdClient.OIDCConfig(ctx, acdSet)
errors.CheckError(err)
tokenString, refreshToken = oauth2Login(ctx, ssoPort, acdSet.GetOIDCConfig(), oauth2conf, provider)
fmt.Printf("'%s' logged in successfully\n", userDisplayName(claims))
}
parser := &jwt.Parser{
SkipClaimsValidation: true,
}
claims := jwt.MapClaims{}
_, _, err = parser.ParseUnverified(tokenString, &claims)
errors.CheckError(err)
fmt.Printf("'%s' logged in successfully\n", userDisplayName(claims))
// login successful. Persist the config
localCfg, err := localconfig.ReadLocalConfig(globalClientOpts.ConfigPath)
errors.CheckError(err)
@@ -110,10 +143,12 @@ func NewLoginCommand(globalClientOpts *argocdclient.ClientOptions) *cobra.Comman
localCfg = &localconfig.LocalConfig{}
}
localCfg.UpsertServer(localconfig.Server{
Server: server,
PlainText: globalClientOpts.PlainText,
Insecure: globalClientOpts.Insecure,
GRPCWeb: globalClientOpts.GRPCWeb,
Server: server,
PlainText: globalClientOpts.PlainText,
Insecure: globalClientOpts.Insecure,
GRPCWeb: globalClientOpts.GRPCWeb,
GRPCWebRootPath: globalClientOpts.GRPCWebRootPath,
Core: globalClientOpts.Core,
})
localCfg.UpsertUser(localconfig.User{
Name: ctxName,
@@ -143,13 +178,13 @@ func NewLoginCommand(globalClientOpts *argocdclient.ClientOptions) *cobra.Comman
}
func userDisplayName(claims jwt.MapClaims) string {
if email, ok := claims["email"]; ok && email != nil {
return email.(string)
if email := jwtutil.StringField(claims, "email"); email != "" {
return email
}
if name, ok := claims["name"]; ok && name != nil {
return name.(string)
if name := jwtutil.StringField(claims, "name"); name != "" {
return name
}
return claims["sub"].(string)
return jwtutil.StringField(claims, "sub")
}
// oauth2Login opens a browser, runs a temporary HTTP server to delegate OAuth2 login flow and
@@ -172,17 +207,22 @@ func oauth2Login(ctx context.Context, port int, oidcSettings *settingspkg.OIDCCo
var refreshToken string
handleErr := func(w http.ResponseWriter, errMsg string) {
http.Error(w, errMsg, http.StatusBadRequest)
http.Error(w, html.EscapeString(errMsg), http.StatusBadRequest)
completionChan <- errMsg
}
// PKCE implementation of https://tools.ietf.org/html/rfc7636
codeVerifier := rand.RandStringCharset(43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~")
codeChallengeHash := sha256.Sum256([]byte(codeVerifier))
codeChallenge := base64.RawURLEncoding.EncodeToString(codeChallengeHash[:])
// Authorization redirect callback from OAuth2 auth flow.
// Handles both implicit and authorization code flow
callbackHandler := func(w http.ResponseWriter, r *http.Request) {
log.Debugf("Callback: %s", r.URL)
if formErr := r.FormValue("error"); formErr != "" {
handleErr(w, formErr+": "+r.FormValue("error_description"))
handleErr(w, fmt.Sprintf("%s: %s", formErr, r.FormValue("error_description")))
return
}
@@ -215,7 +255,8 @@ func oauth2Login(ctx context.Context, port int, oidcSettings *settingspkg.OIDCCo
handleErr(w, fmt.Sprintf("no code in request: %q", r.Form))
return
}
tok, err := oauth2conf.Exchange(ctx, code)
opts := []oauth2.AuthCodeOption{oauth2.SetAuthURLParam("code_verifier", codeVerifier)}
tok, err := oauth2conf.Exchange(ctx, code, opts...)
if err != nil {
handleErr(w, err.Error())
return
@@ -251,6 +292,8 @@ func oauth2Login(ctx context.Context, port int, oidcSettings *settingspkg.OIDCCo
switch grantType {
case oidcutil.GrantTypeAuthorizationCode:
opts = append(opts, oauth2.SetAuthURLParam("code_challenge", codeChallenge))
opts = append(opts, oauth2.SetAuthURLParam("code_challenge_method", "S256"))
url = oauth2conf.AuthCodeURL(stateNonce, opts...)
case oidcutil.GrantTypeImplicit:
url = oidcutil.ImplicitFlowURL(oauth2conf, stateNonce, opts...)
@@ -283,7 +326,7 @@ func oauth2Login(ctx context.Context, port int, oidcSettings *settingspkg.OIDCCo
func passwordLogin(acdClient argocdclient.Client, username, password string) string {
username, password = cli.PromptCredentials(username, password)
sessConn, sessionIf := acdClient.NewSessionClientOrDie()
defer util.Close(sessConn)
defer io.Close(sessConn)
sessionRequest := sessionpkg.SessionCreateRequest{
Username: username,
Password: password,

View File

@@ -0,0 +1,31 @@
package commands
import (
"testing"
"github.com/dgrijalva/jwt-go/v4"
"github.com/stretchr/testify/assert"
)
//
func Test_userDisplayName_email(t *testing.T) {
claims := jwt.MapClaims{"iss": "qux", "sub": "foo", "email": "firstname.lastname@example.com", "groups": []string{"baz"}}
actualName := userDisplayName(claims)
expectedName := "firstname.lastname@example.com"
assert.Equal(t, expectedName, actualName)
}
func Test_userDisplayName_name(t *testing.T) {
claims := jwt.MapClaims{"iss": "qux", "sub": "foo", "name": "Firstname Lastname", "groups": []string{"baz"}}
actualName := userDisplayName(claims)
expectedName := "Firstname Lastname"
assert.Equal(t, expectedName, actualName)
}
func Test_userDisplayName_sub(t *testing.T) {
claims := jwt.MapClaims{"iss": "qux", "sub": "foo", "groups": []string{"baz"}}
actualName := userDisplayName(claims)
expectedName := "foo"
assert.Equal(t, expectedName, actualName)
}

View File

@@ -7,9 +7,9 @@ import (
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
"github.com/argoproj/argo-cd/util/localconfig"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/localconfig"
)
// NewLogoutCommand returns a new instance of `argocd logout` command

View File

@@ -5,11 +5,11 @@ import (
"os"
"testing"
"github.com/argoproj/argo-cd/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/stretchr/testify/assert"
"github.com/argoproj/argo-cd/util/localconfig"
"github.com/argoproj/argo-cd/v2/util/localconfig"
)
func TestLogout(t *testing.T) {

View File

@@ -1,65 +1,39 @@
package commands
import (
"bufio"
"context"
"encoding/json"
"fmt"
"io"
"net/url"
"os"
"strings"
"text/tabwriter"
"time"
"github.com/dustin/go-humanize"
humanize "github.com/dustin/go-humanize"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
projectpkg "github.com/argoproj/argo-cd/pkg/apiclient/project"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/config"
"github.com/argoproj/argo-cd/util/git"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
projectpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/project"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/git"
"github.com/argoproj/argo-cd/v2/util/gpg"
argoio "github.com/argoproj/argo-cd/v2/util/io"
)
type projectOpts struct {
description string
destinations []string
sources []string
orphanedResourcesEnabled bool
orphanedResourcesWarn bool
}
type policyOpts struct {
action string
permission string
object string
}
func (opts *projectOpts) GetDestinations() []v1alpha1.ApplicationDestination {
destinations := make([]v1alpha1.ApplicationDestination, 0)
for _, destStr := range opts.destinations {
parts := strings.Split(destStr, ",")
if len(parts) != 2 {
log.Fatalf("Expected destination of the form: server,namespace. Received: %s", destStr)
} else {
destinations = append(destinations, v1alpha1.ApplicationDestination{
Server: parts[0],
Namespace: parts[1],
})
}
}
return destinations
}
// NewProjectCommand returns a new instance of an `argocd proj` command
func NewProjectCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
@@ -77,6 +51,8 @@ func NewProjectCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
command.AddCommand(NewProjectListCommand(clientOpts))
command.AddCommand(NewProjectSetCommand(clientOpts))
command.AddCommand(NewProjectEditCommand(clientOpts))
command.AddCommand(NewProjectAddSignatureKeyCommand(clientOpts))
command.AddCommand(NewProjectRemoveSignatureKeyCommand(clientOpts))
command.AddCommand(NewProjectAddDestinationCommand(clientOpts))
command.AddCommand(NewProjectRemoveDestinationCommand(clientOpts))
command.AddCommand(NewProjectAddSourceCommand(clientOpts))
@@ -86,30 +62,11 @@ func NewProjectCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
command.AddCommand(NewProjectAllowNamespaceResourceCommand(clientOpts))
command.AddCommand(NewProjectDenyNamespaceResourceCommand(clientOpts))
command.AddCommand(NewProjectWindowsCommand(clientOpts))
command.AddCommand(NewProjectAddOrphanedIgnoreCommand(clientOpts))
command.AddCommand(NewProjectRemoveOrphanedIgnoreCommand(clientOpts))
return command
}
func addProjFlags(command *cobra.Command, opts *projectOpts) {
command.Flags().StringVarP(&opts.description, "description", "", "", "Project description")
command.Flags().StringArrayVarP(&opts.destinations, "dest", "d", []string{},
"Permitted destination server and namespace (e.g. https://192.168.99.100:8443,default)")
command.Flags().StringArrayVarP(&opts.sources, "src", "s", []string{}, "Permitted source repository URL")
command.Flags().BoolVar(&opts.orphanedResourcesEnabled, "orphaned-resources", false, "Enables orphaned resources monitoring")
command.Flags().BoolVar(&opts.orphanedResourcesWarn, "orphaned-resources-warn", false, "Specifies if applications should be a warning condition when orphaned resources detected")
}
func getOrphanedResourcesSettings(c *cobra.Command, opts projectOpts) *v1alpha1.OrphanedResourcesMonitorSettings {
warnChanged := c.Flag("orphaned-resources-warn").Changed
if opts.orphanedResourcesEnabled || warnChanged {
settings := v1alpha1.OrphanedResourcesMonitorSettings{}
if warnChanged {
settings.Warn = pointer.BoolPtr(opts.orphanedResourcesWarn)
}
return &settings
}
return nil
}
func addPolicyFlags(command *cobra.Command, opts *policyOpts) {
command.Flags().StringVarP(&opts.action, "action", "a", "", "Action to grant/deny permission on (e.g. get, create, list, update, delete)")
command.Flags().StringVarP(&opts.permission, "permission", "p", "allow", "Whether to allow or deny access to object with the action. This can only be 'allow' or 'deny'")
@@ -124,7 +81,7 @@ func humanizeTimestamp(epoch int64) string {
// NewProjectCreateCommand returns a new instance of an `argocd proj create` command
func NewProjectCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
opts projectOpts
opts cmdutil.ProjectOpts
fileURL string
upsert bool
)
@@ -132,46 +89,12 @@ func NewProjectCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
Use: "create PROJECT",
Short: "Create a project",
Run: func(c *cobra.Command, args []string) {
var proj v1alpha1.AppProject
if fileURL == "-" {
// read stdin
reader := bufio.NewReader(os.Stdin)
err := config.UnmarshalReader(reader, &proj)
if err != nil {
log.Fatalf("unable to read manifest from stdin: %v", err)
}
} else if fileURL != "" {
// read uri
parsedURL, err := url.ParseRequestURI(fileURL)
if err != nil || !(parsedURL.Scheme == "http" || parsedURL.Scheme == "https") {
err = config.UnmarshalLocalFile(fileURL, &proj)
} else {
err = config.UnmarshalRemoteFile(fileURL, &proj)
}
errors.CheckError(err)
if len(args) == 1 && args[0] != proj.Name {
log.Fatalf("project name '%s' does not match project spec metadata.name '%s'", args[0], proj.Name)
}
} else {
// read arguments
if len(args) == 0 {
c.HelpFunc()(c, args)
os.Exit(1)
}
projName := args[0]
proj = v1alpha1.AppProject{
ObjectMeta: v1.ObjectMeta{Name: projName},
Spec: v1alpha1.AppProjectSpec{
Description: opts.description,
Destinations: opts.GetDestinations(),
SourceRepos: opts.sources,
OrphanedResources: getOrphanedResourcesSettings(c, opts),
},
}
}
proj, err := cmdutil.ConstructAppProj(fileURL, args, opts, c)
errors.CheckError(err)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
_, err := projIf.Create(context.Background(), &projectpkg.ProjectCreateRequest{Project: &proj, Upsert: upsert})
defer argoio.Close(conn)
_, err = projIf.Create(context.Background(), &projectpkg.ProjectCreateRequest{Project: proj, Upsert: upsert})
errors.CheckError(err)
},
}
@@ -181,14 +104,14 @@ func NewProjectCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
if err != nil {
log.Fatal(err)
}
addProjFlags(command, &opts)
cmdutil.AddProjFlags(command, &opts)
return command
}
// NewProjectSetCommand returns a new instance of an `argocd proj set` command
func NewProjectSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
opts projectOpts
opts cmdutil.ProjectOpts
)
var command = &cobra.Command{
Use: "set PROJECT",
@@ -200,26 +123,12 @@ func NewProjectSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
}
projName := args[0]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
visited := 0
c.Flags().Visit(func(f *pflag.Flag) {
visited++
switch f.Name {
case "description":
proj.Spec.Description = opts.description
case "dest":
proj.Spec.Destinations = opts.GetDestinations()
case "src":
proj.Spec.SourceRepos = opts.sources
case "orphaned-resources", "orphaned-resources-warn":
proj.Spec.OrphanedResources = getOrphanedResourcesSettings(c, opts)
}
})
if visited == 0 {
if visited := cmdutil.SetProjSpecOptions(c.Flags(), &proj.Spec, &opts); visited == 0 {
log.Error("Please set at least one option to update")
c.HelpFunc()(c, args)
os.Exit(1)
@@ -229,14 +138,98 @@ func NewProjectSetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
errors.CheckError(err)
},
}
addProjFlags(command, &opts)
cmdutil.AddProjFlags(command, &opts)
return command
}
// NewProjectAddSignatureKeyCommand returns a new instance of an `argocd proj add-signature-key` command
func NewProjectAddSignatureKeyCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "add-signature-key PROJECT KEY-ID",
Short: "Add GnuPG signature key to project",
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
projName := args[0]
signatureKey := args[1]
if !gpg.IsShortKeyID(signatureKey) && !gpg.IsLongKeyID(signatureKey) {
log.Fatalf("%s is not a valid GnuPG key ID", signatureKey)
}
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
for _, key := range proj.Spec.SignatureKeys {
if key.KeyID == signatureKey {
log.Fatal("Specified signature key is already defined in project")
}
}
proj.Spec.SignatureKeys = append(proj.Spec.SignatureKeys, v1alpha1.SignatureKey{KeyID: signatureKey})
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
errors.CheckError(err)
},
}
return command
}
// NewProjectRemoveSignatureKeyCommand returns a new instance of an `argocd proj remove-signature-key` command
func NewProjectRemoveSignatureKeyCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "remove-signature-key PROJECT KEY-ID",
Short: "Remove GnuPG signature key from project",
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
projName := args[0]
signatureKey := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
index := -1
for i, key := range proj.Spec.SignatureKeys {
if key.KeyID == signatureKey {
index = i
break
}
}
if index == -1 {
log.Fatal("Specified signature key is not configured for project")
} else {
proj.Spec.SignatureKeys = append(proj.Spec.SignatureKeys[:index], proj.Spec.SignatureKeys[index+1:]...)
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
errors.CheckError(err)
}
},
}
return command
}
// NewProjectAddDestinationCommand returns a new instance of an `argocd proj add-destination` command
func NewProjectAddDestinationCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var nameInsteadServer bool
buildApplicationDestination := func(destination string, namespace string, nameInsteadServer bool) v1alpha1.ApplicationDestination {
if nameInsteadServer {
return v1alpha1.ApplicationDestination{Name: destination, Namespace: namespace}
}
return v1alpha1.ApplicationDestination{Server: destination, Namespace: namespace}
}
var command = &cobra.Command{
Use: "add-destination PROJECT SERVER NAMESPACE",
Use: "add-destination PROJECT SERVER/NAME NAMESPACE",
Short: "Add project destination",
Run: func(c *cobra.Command, args []string) {
if len(args) != 3 {
@@ -244,24 +237,27 @@ func NewProjectAddDestinationCommand(clientOpts *argocdclient.ClientOptions) *co
os.Exit(1)
}
projName := args[0]
server := args[1]
namespace := args[2]
destination := buildApplicationDestination(args[1], namespace, nameInsteadServer)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
for _, dest := range proj.Spec.Destinations {
if dest.Namespace == namespace && dest.Server == server {
dstServerExist := destination.Server != "" && dest.Server == destination.Server
dstNameExist := destination.Name != "" && dest.Name == destination.Name
if dest.Namespace == namespace && (dstServerExist || dstNameExist) {
log.Fatal("Specified destination is already defined in project")
}
}
proj.Spec.Destinations = append(proj.Spec.Destinations, v1alpha1.ApplicationDestination{Server: server, Namespace: namespace})
proj.Spec.Destinations = append(proj.Spec.Destinations, destination)
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
errors.CheckError(err)
},
}
command.Flags().BoolVar(&nameInsteadServer, "name", false, "Use name as destination instead server")
return command
}
@@ -279,7 +275,7 @@ func NewProjectRemoveDestinationCommand(clientOpts *argocdclient.ClientOptions)
server := args[1]
namespace := args[2]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -304,6 +300,96 @@ func NewProjectRemoveDestinationCommand(clientOpts *argocdclient.ClientOptions)
return command
}
// NewProjectAddOrphanedIgnoreCommand returns a new instance of an `argocd proj add-orphaned-ignore` command
func NewProjectAddOrphanedIgnoreCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
name string
)
var command = &cobra.Command{
Use: "add-orphaned-ignore PROJECT GROUP KIND",
Short: "Add a resource to orphaned ignore list",
Run: func(c *cobra.Command, args []string) {
if len(args) != 3 {
c.HelpFunc()(c, args)
os.Exit(1)
}
projName := args[0]
group := args[1]
kind := args[2]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
if proj.Spec.OrphanedResources == nil {
settings := v1alpha1.OrphanedResourcesMonitorSettings{}
settings.Ignore = []v1alpha1.OrphanedResourceKey{{Group: group, Kind: kind, Name: name}}
proj.Spec.OrphanedResources = &settings
} else {
for _, ignore := range proj.Spec.OrphanedResources.Ignore {
if ignore.Group == group && ignore.Kind == kind && ignore.Name == name {
log.Fatal("Specified resource is already defined in the orphaned ignore list of project")
return
}
}
proj.Spec.OrphanedResources.Ignore = append(proj.Spec.OrphanedResources.Ignore, v1alpha1.OrphanedResourceKey{Group: group, Kind: kind, Name: name})
}
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
errors.CheckError(err)
},
}
command.Flags().StringVar(&name, "name", "", "Resource name pattern")
return command
}
// NewProjectRemoveOrphanedIgnoreCommand returns a new instance of an `argocd proj remove-orphaned-ignore` command
func NewProjectRemoveOrphanedIgnoreCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
name string
)
var command = &cobra.Command{
Use: "remove-orphaned-ignore PROJECT GROUP KIND NAME",
Short: "Remove a resource from orphaned ignore list",
Run: func(c *cobra.Command, args []string) {
if len(args) != 3 {
c.HelpFunc()(c, args)
os.Exit(1)
}
projName := args[0]
group := args[1]
kind := args[2]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
if proj.Spec.OrphanedResources == nil {
log.Fatal("Specified resource does not exist in the orphaned ignore list of project")
return
}
index := -1
for i, ignore := range proj.Spec.OrphanedResources.Ignore {
if ignore.Group == group && ignore.Kind == kind && ignore.Name == name {
index = i
break
}
}
if index == -1 {
log.Fatal("Specified resource does not exist in the orphaned ignore of project")
} else {
proj.Spec.OrphanedResources.Ignore = append(proj.Spec.OrphanedResources.Ignore[:index], proj.Spec.OrphanedResources.Ignore[index+1:]...)
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
errors.CheckError(err)
}
},
}
command.Flags().StringVar(&name, "name", "", "Resource name pattern")
return command
}
// NewProjectAddSourceCommand returns a new instance of an `argocd proj add-src` command
func NewProjectAddSourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
@@ -317,7 +403,7 @@ func NewProjectAddSourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.C
projName := args[0]
url := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -340,8 +426,46 @@ func NewProjectAddSourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.C
return command
}
func modifyProjectResourceCmd(cmdUse, cmdDesc string, clientOpts *argocdclient.ClientOptions, action func(proj *v1alpha1.AppProject, group string, kind string) bool) *cobra.Command {
return &cobra.Command{
func modifyResourcesList(list *[]metav1.GroupKind, add bool, listDesc string, group string, kind string) bool {
if add {
for _, item := range *list {
if item.Group == group && item.Kind == kind {
fmt.Printf("Group '%s' and kind '%s' already present in %s resources\n", group, kind, listDesc)
return false
}
}
fmt.Printf("Group '%s' and kind '%s' is added to %s resources\n", group, kind, listDesc)
*list = append(*list, v1.GroupKind{Group: group, Kind: kind})
return true
} else {
index := -1
for i, item := range *list {
if item.Group == group && item.Kind == kind {
index = i
break
}
}
if index == -1 {
fmt.Printf("Group '%s' and kind '%s' not in %s resources\n", group, kind, listDesc)
return false
}
*list = append((*list)[:index], (*list)[index+1:]...)
fmt.Printf("Group '%s' and kind '%s' is removed from %s resources\n", group, kind, listDesc)
return true
}
}
func modifyResourceListCmd(cmdUse, cmdDesc string, clientOpts *argocdclient.ClientOptions, allow bool, namespacedList bool) *cobra.Command {
var (
listType string
defaultList string
)
if namespacedList {
defaultList = "deny"
} else {
defaultList = "allow"
}
var command = &cobra.Command{
Use: cmdUse,
Short: cmdDesc,
Run: func(c *cobra.Command, args []string) {
@@ -351,91 +475,67 @@ func modifyProjectResourceCmd(cmdUse, cmdDesc string, clientOpts *argocdclient.C
}
projName, group, kind := args[0], args[1], args[2]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
var list, allowList, denyList *[]metav1.GroupKind
var listAction, listDesc string
var add bool
if namespacedList {
allowList, denyList = &proj.Spec.NamespaceResourceWhitelist, &proj.Spec.NamespaceResourceBlacklist
listDesc = "namespaced"
} else {
allowList, denyList = &proj.Spec.ClusterResourceWhitelist, &proj.Spec.ClusterResourceBlacklist
listDesc = "cluster"
}
if action(proj, group, kind) {
if (listType == "allow") || (listType == "white") {
list = allowList
listAction = "allowed"
add = allow
} else {
list = denyList
listAction = "denied"
add = !allow
}
if modifyResourcesList(list, add, listAction+" "+listDesc, group, kind) {
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
errors.CheckError(err)
}
},
}
command.Flags().StringVarP(&listType, "list", "l", defaultList, "Use deny list or allow list. This can only be 'allow' or 'deny'")
return command
}
// NewProjectAllowNamespaceResourceCommand returns a new instance of an `deny-cluster-resources` command
func NewProjectAllowNamespaceResourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
use := "allow-namespace-resource PROJECT GROUP KIND"
desc := "Removes a namespaced API resource from the blacklist"
return modifyProjectResourceCmd(use, desc, clientOpts, func(proj *v1alpha1.AppProject, group string, kind string) bool {
index := -1
for i, item := range proj.Spec.NamespaceResourceBlacklist {
if item.Group == group && item.Kind == kind {
index = i
break
}
}
if index == -1 {
fmt.Printf("Group '%s' and kind '%s' not in blacklisted namespaced resources\n", group, kind)
return false
}
proj.Spec.NamespaceResourceBlacklist = append(proj.Spec.NamespaceResourceBlacklist[:index], proj.Spec.NamespaceResourceBlacklist[index+1:]...)
return true
})
desc := "Removes a namespaced API resource from the deny list or add a namespaced API resource to the allow list"
return modifyResourceListCmd(use, desc, clientOpts, true, true)
}
// NewProjectDenyNamespaceResourceCommand returns a new instance of an `argocd proj deny-namespace-resource` command
func NewProjectDenyNamespaceResourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
use := "deny-namespace-resource PROJECT GROUP KIND"
desc := "Adds a namespaced API resource to the blacklist"
return modifyProjectResourceCmd(use, desc, clientOpts, func(proj *v1alpha1.AppProject, group string, kind string) bool {
for _, item := range proj.Spec.NamespaceResourceBlacklist {
if item.Group == group && item.Kind == kind {
fmt.Printf("Group '%s' and kind '%s' already present in blacklisted namespaced resources\n", group, kind)
return false
}
}
proj.Spec.NamespaceResourceBlacklist = append(proj.Spec.NamespaceResourceBlacklist, v1.GroupKind{Group: group, Kind: kind})
return true
})
desc := "Adds a namespaced API resource to the deny list or removes a namespaced API resource from the allow list"
return modifyResourceListCmd(use, desc, clientOpts, false, true)
}
// NewProjectDenyClusterResourceCommand returns a new instance of an `deny-cluster-resource` command
func NewProjectDenyClusterResourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
use := "deny-cluster-resource PROJECT GROUP KIND"
desc := "Removes a cluster-scoped API resource from the whitelist"
return modifyProjectResourceCmd(use, desc, clientOpts, func(proj *v1alpha1.AppProject, group string, kind string) bool {
index := -1
for i, item := range proj.Spec.ClusterResourceWhitelist {
if item.Group == group && item.Kind == kind {
index = i
break
}
}
if index == -1 {
fmt.Printf("Group '%s' and kind '%s' not in whitelisted cluster resources\n", group, kind)
return false
}
proj.Spec.ClusterResourceWhitelist = append(proj.Spec.ClusterResourceWhitelist[:index], proj.Spec.ClusterResourceWhitelist[index+1:]...)
return true
})
desc := "Removes a cluster-scoped API resource from the allow list and adds it to deny list"
return modifyResourceListCmd(use, desc, clientOpts, false, false)
}
// NewProjectAllowClusterResourceCommand returns a new instance of an `argocd proj allow-cluster-resource` command
func NewProjectAllowClusterResourceCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
use := "allow-cluster-resource PROJECT GROUP KIND"
desc := "Adds a cluster-scoped API resource to the whitelist"
return modifyProjectResourceCmd(use, desc, clientOpts, func(proj *v1alpha1.AppProject, group string, kind string) bool {
for _, item := range proj.Spec.ClusterResourceWhitelist {
if item.Group == group && item.Kind == kind {
fmt.Printf("Group '%s' and kind '%s' already present in whitelisted cluster resources\n", group, kind)
return false
}
}
proj.Spec.ClusterResourceWhitelist = append(proj.Spec.ClusterResourceWhitelist, v1.GroupKind{Group: group, Kind: kind})
return true
})
desc := "Adds a cluster-scoped API resource to the allow list and removes it from deny list"
return modifyResourceListCmd(use, desc, clientOpts, true, false)
}
// NewProjectRemoveSourceCommand returns a new instance of an `argocd proj remove-src` command
@@ -451,7 +551,7 @@ func NewProjectRemoveSourceCommand(clientOpts *argocdclient.ClientOptions) *cobr
projName := args[0]
url := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -487,7 +587,7 @@ func NewProjectDeleteCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
os.Exit(1)
}
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
for _, name := range args {
_, err := projIf.Delete(context.Background(), &projectpkg.ProjectQuery{Name: name})
errors.CheckError(err)
@@ -507,7 +607,7 @@ func printProjectNames(projects []v1alpha1.AppProject) {
// Print table of project info
func printProjectTable(projects []v1alpha1.AppProject) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "NAME\tDESCRIPTION\tDESTINATIONS\tSOURCES\tCLUSTER-RESOURCE-WHITELIST\tNAMESPACE-RESOURCE-BLACKLIST\tORPHANED-RESOURCES\n")
fmt.Fprintf(w, "NAME\tDESCRIPTION\tDESTINATIONS\tSOURCES\tCLUSTER-RESOURCE-WHITELIST\tNAMESPACE-RESOURCE-BLACKLIST\tSIGNATURE-KEYS\tORPHANED-RESOURCES\n")
for _, p := range projects {
printProjectLine(w, &p)
}
@@ -524,7 +624,7 @@ func NewProjectListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman
Short: "List projects",
Run: func(c *cobra.Command, args []string) {
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
projects, err := projIf.List(context.Background(), &projectpkg.ProjectQuery{})
errors.CheckError(err)
switch output {
@@ -548,11 +648,15 @@ func formatOrphanedResources(p *v1alpha1.AppProject) string {
if p.Spec.OrphanedResources == nil {
return "disabled"
}
return fmt.Sprintf("enabled (warn=%v)", p.Spec.OrphanedResources.IsWarn())
details := fmt.Sprintf("warn=%v", p.Spec.OrphanedResources.IsWarn())
if len(p.Spec.OrphanedResources.Ignore) > 0 {
details = fmt.Sprintf("%s, ignored %d", details, len(p.Spec.OrphanedResources.Ignore))
}
return fmt.Sprintf("enabled (%s)", details)
}
func printProjectLine(w io.Writer, p *v1alpha1.AppProject) {
var destinations, sourceRepos, clusterWhitelist, namespaceBlacklist string
var destinations, sourceRepos, clusterWhitelist, namespaceBlacklist, signatureKeys string
switch len(p.Spec.Destinations) {
case 0:
destinations = "<none>"
@@ -583,11 +687,17 @@ func printProjectLine(w io.Writer, p *v1alpha1.AppProject) {
default:
namespaceBlacklist = fmt.Sprintf("%d resources", len(p.Spec.NamespaceResourceBlacklist))
}
fmt.Fprintf(w, "%s\t%s\t%v\t%v\t%v\t%v\t%v\n", p.Name, p.Spec.Description, destinations, sourceRepos, clusterWhitelist, namespaceBlacklist, formatOrphanedResources(p))
switch len(p.Spec.SignatureKeys) {
case 0:
signatureKeys = "<none>"
default:
signatureKeys = fmt.Sprintf("%d key(s)", len(p.Spec.SignatureKeys))
}
fmt.Fprintf(w, "%s\t%s\t%v\t%v\t%v\t%v\t%v\t%v\n", p.Name, p.Spec.Description, destinations, sourceRepos, clusterWhitelist, namespaceBlacklist, signatureKeys, formatOrphanedResources(p))
}
func printProject(p *v1alpha1.AppProject) {
const printProjFmtStr = "%-34s%s\n"
const printProjFmtStr = "%-29s%s\n"
fmt.Printf(printProjFmtStr, "Name:", p.Name)
fmt.Printf(printProjFmtStr, "Description:", p.Spec.Description)
@@ -612,25 +722,37 @@ func printProject(p *v1alpha1.AppProject) {
fmt.Printf(printProjFmtStr, "", p.Spec.SourceRepos[i])
}
// Print whitelisted cluster resources
// Print allowed cluster resources
cwl0 := "<none>"
if len(p.Spec.ClusterResourceWhitelist) > 0 {
cwl0 = fmt.Sprintf("%s/%s", p.Spec.ClusterResourceWhitelist[0].Group, p.Spec.ClusterResourceWhitelist[0].Kind)
}
fmt.Printf(printProjFmtStr, "Whitelisted Cluster Resources:", cwl0)
fmt.Printf(printProjFmtStr, "Allowed Cluster Resources:", cwl0)
for i := 1; i < len(p.Spec.ClusterResourceWhitelist); i++ {
fmt.Printf(printProjFmtStr, "", fmt.Sprintf("%s/%s", p.Spec.ClusterResourceWhitelist[i].Group, p.Spec.ClusterResourceWhitelist[i].Kind))
}
// Print blacklisted namespaced resources
// Print denied namespaced resources
rbl0 := "<none>"
if len(p.Spec.NamespaceResourceBlacklist) > 0 {
rbl0 = fmt.Sprintf("%s/%s", p.Spec.NamespaceResourceBlacklist[0].Group, p.Spec.NamespaceResourceBlacklist[0].Kind)
}
fmt.Printf(printProjFmtStr, "Blacklisted Namespaced Resources:", rbl0)
fmt.Printf(printProjFmtStr, "Denied Namespaced Resources:", rbl0)
for i := 1; i < len(p.Spec.NamespaceResourceBlacklist); i++ {
fmt.Printf(printProjFmtStr, "", fmt.Sprintf("%s/%s", p.Spec.NamespaceResourceBlacklist[i].Group, p.Spec.NamespaceResourceBlacklist[i].Kind))
}
// Print required signature keys
signatureKeysStr := "<none>"
if len(p.Spec.SignatureKeys) > 0 {
kids := make([]string, 0)
for _, key := range p.Spec.SignatureKeys {
kids = append(kids, key.KeyID)
}
signatureKeysStr = strings.Join(kids, ", ")
}
fmt.Printf(printProjFmtStr, "Signature keys:", signatureKeysStr)
fmt.Printf(printProjFmtStr, "Orphaned Resources:", formatOrphanedResources(p))
}
@@ -650,7 +772,7 @@ func NewProjectGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
}
projName := args[0]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
p, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -680,7 +802,7 @@ func NewProjectEditCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman
}
projName := args[0]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer argoio.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
projData, err := json.Marshal(proj.Spec)

View File

@@ -6,15 +6,18 @@ import (
"os"
"strconv"
"text/tabwriter"
"time"
timeutil "github.com/argoproj/pkg/time"
jwtgo "github.com/dgrijalva/jwt-go/v4"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
projectpkg "github.com/argoproj/argo-cd/pkg/apiclient/project"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/util"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
projectpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/project"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/argo-cd/v2/util/jwt"
)
const (
@@ -36,6 +39,7 @@ func NewProjectRoleCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comman
roleCommand.AddCommand(NewProjectRoleCreateCommand(clientOpts))
roleCommand.AddCommand(NewProjectRoleDeleteCommand(clientOpts))
roleCommand.AddCommand(NewProjectRoleCreateTokenCommand(clientOpts))
roleCommand.AddCommand(NewProjectRoleListTokensCommand(clientOpts))
roleCommand.AddCommand(NewProjectRoleDeleteTokenCommand(clientOpts))
roleCommand.AddCommand(NewProjectRoleAddPolicyCommand(clientOpts))
roleCommand.AddCommand(NewProjectRoleRemovePolicyCommand(clientOpts))
@@ -60,7 +64,7 @@ func NewProjectRoleAddPolicyCommand(clientOpts *argocdclient.ClientOptions) *cob
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -95,7 +99,7 @@ func NewProjectRoleRemovePolicyCommand(clientOpts *argocdclient.ClientOptions) *
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -140,7 +144,7 @@ func NewProjectRoleCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra.
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -174,7 +178,7 @@ func NewProjectRoleDeleteCommand(clientOpts *argocdclient.ClientOptions) *cobra.
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -195,14 +199,25 @@ func NewProjectRoleDeleteCommand(clientOpts *argocdclient.ClientOptions) *cobra.
return command
}
func tokenTimeToString(t int64) string {
tokenTimeToString := "Never"
if t > 0 {
tokenTimeToString = time.Unix(t, 0).Format(time.RFC3339)
}
return tokenTimeToString
}
// NewProjectRoleCreateTokenCommand returns a new instance of an `argocd proj role create-token` command
func NewProjectRoleCreateTokenCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
expiresIn string
expiresIn string
outputTokenOnly bool
tokenID string
)
var command = &cobra.Command{
Use: "create-token PROJECT ROLE-NAME",
Short: "Create a project token",
Use: "create-token PROJECT ROLE-NAME",
Short: "Create a project token",
Aliases: []string{"token-create"},
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
@@ -211,24 +226,110 @@ func NewProjectRoleCreateTokenCommand(clientOpts *argocdclient.ClientOptions) *c
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
if expiresIn == "" {
expiresIn = "0s"
}
duration, err := timeutil.ParseDuration(expiresIn)
errors.CheckError(err)
token, err := projIf.CreateToken(context.Background(), &projectpkg.ProjectTokenCreateRequest{Project: projName, Role: roleName, ExpiresIn: int64(duration.Seconds())})
tokenResponse, err := projIf.CreateToken(context.Background(), &projectpkg.ProjectTokenCreateRequest{
Project: projName,
Role: roleName,
ExpiresIn: int64(duration.Seconds()),
Id: tokenID,
})
errors.CheckError(err)
fmt.Println(token.Token)
token, err := jwtgo.Parse(tokenResponse.Token, nil)
if token == nil {
err = fmt.Errorf("received malformed token %v", err)
errors.CheckError(err)
return
}
claims := token.Claims.(jwtgo.MapClaims)
issuedAt, _ := jwt.IssuedAt(claims)
expiresAt := int64(jwt.Float64Field(claims, "exp"))
id := jwt.StringField(claims, "jti")
subject := jwt.StringField(claims, "sub")
if !outputTokenOnly {
fmt.Printf("Create token succeeded for %s.\n", subject)
fmt.Printf(" ID: %s\n Issued At: %s\n Expires At: %s\n",
id, tokenTimeToString(issuedAt), tokenTimeToString(expiresAt),
)
fmt.Println(" Token: " + tokenResponse.Token)
} else {
fmt.Println(tokenResponse.Token)
}
},
}
command.Flags().StringVarP(&expiresIn, "expires-in", "e", "0s", "Duration before the token will expire. (Default: No expiration)")
command.Flags().StringVarP(&expiresIn, "expires-in", "e", "",
"Duration before the token will expire, e.g. \"12h\", \"7d\". (Default: No expiration)",
)
command.Flags().StringVarP(&tokenID, "id", "i", "", "Token unique identifier. (Default: Random UUID)")
command.Flags().BoolVarP(&outputTokenOnly, "token-only", "t", false, "Output token only - for use in scripts.")
return command
}
func NewProjectRoleListTokensCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
useUnixTime bool
)
var command = &cobra.Command{
Use: "list-tokens PROJECT ROLE-NAME",
Short: "List tokens for a given role.",
Aliases: []string{"list-token", "token-list"},
Run: func(c *cobra.Command, args []string) {
if len(args) != 2 {
c.HelpFunc()(c, args)
os.Exit(1)
}
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
role, _, err := proj.GetRoleByName(roleName)
errors.CheckError(err)
if len(role.JWTTokens) == 0 {
fmt.Printf("No tokens for %s.%s\n", projName, roleName)
return
}
writer := tabwriter.NewWriter(os.Stdout, 0, 0, 4, ' ', 0)
_, err = fmt.Fprintf(writer, "ID\tISSUED AT\tEXPIRES AT\n")
errors.CheckError(err)
tokenRowFormat := "%s\t%v\t%v\n"
for _, token := range role.JWTTokens {
if useUnixTime {
_, _ = fmt.Fprintf(writer, tokenRowFormat, token.ID, token.IssuedAt, token.ExpiresAt)
} else {
_, _ = fmt.Fprintf(writer, tokenRowFormat, token.ID, tokenTimeToString(token.IssuedAt), tokenTimeToString(token.ExpiresAt))
}
}
err = writer.Flush()
errors.CheckError(err)
},
}
command.Flags().BoolVarP(&useUnixTime, "unixtime", "u", false,
"Print timestamps as Unix time instead of converting. Useful for piping into delete-token.",
)
return command
}
// NewProjectRoleDeleteTokenCommand returns a new instance of an `argocd proj role delete-token` command
func NewProjectRoleDeleteTokenCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "delete-token PROJECT ROLE-NAME ISSUED-AT",
Short: "Delete a project token",
Use: "delete-token PROJECT ROLE-NAME ISSUED-AT",
Short: "Delete a project token",
Aliases: []string{"token-delete", "remove-token"},
Run: func(c *cobra.Command, args []string) {
if len(args) != 3 {
c.HelpFunc()(c, args)
@@ -240,7 +341,7 @@ func NewProjectRoleDeleteTokenCommand(clientOpts *argocdclient.ClientOptions) *c
errors.CheckError(err)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
_, err = projIf.DeleteToken(context.Background(), &projectpkg.ProjectTokenDeleteRequest{Project: projName, Role: roleName, Iat: issuedAt})
errors.CheckError(err)
@@ -281,7 +382,7 @@ func NewProjectRoleListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
}
projName := args[0]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
project, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -315,7 +416,7 @@ func NewProjectRoleGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Com
projName := args[0]
roleName := args[1]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -332,7 +433,7 @@ func NewProjectRoleGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Com
// TODO(jessesuen): print groups
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "ID\tISSUED-AT\tEXPIRES-AT\n")
for _, token := range role.JWTTokens {
for _, token := range proj.Status.JWTTokensByRole[roleName].Items {
expiresAt := "<none>"
if token.ExpiresAt > 0 {
expiresAt = humanizeTimestamp(token.ExpiresAt)
@@ -357,7 +458,7 @@ func NewProjectRoleAddGroupCommand(clientOpts *argocdclient.ClientOptions) *cobr
}
projName, roleName, groupName := args[0], args[1], args[2]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
updated, err := proj.AddGroupToRole(roleName, groupName)
@@ -386,7 +487,7 @@ func NewProjectRoleRemoveGroupCommand(clientOpts *argocdclient.ClientOptions) *c
}
projName, roleName, groupName := args[0], args[1], args[2]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
updated, err := proj.RemoveGroupFromRole(roleName, groupName)

View File

@@ -2,21 +2,19 @@ package commands
import (
"context"
"os"
"github.com/spf13/cobra"
"fmt"
"os"
"strconv"
"strings"
"text/tabwriter"
"strconv"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
projectpkg "github.com/argoproj/argo-cd/pkg/apiclient/project"
"github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/util"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
projectpkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/project"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/io"
)
// NewProjectWindowsCommand returns a new instance of the `argocd proj windows` command
@@ -55,7 +53,7 @@ func NewProjectWindowsDisableManualSyncCommand(clientOpts *argocdclient.ClientOp
errors.CheckError(err)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -90,7 +88,7 @@ func NewProjectWindowsEnableManualSyncCommand(clientOpts *argocdclient.ClientOpt
errors.CheckError(err)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -118,6 +116,7 @@ func NewProjectWindowsAddWindowCommand(clientOpts *argocdclient.ClientOptions) *
namespaces []string
clusters []string
manualSync bool
timeZone string
)
var command = &cobra.Command{
Use: "add PROJECT",
@@ -129,12 +128,12 @@ func NewProjectWindowsAddWindowCommand(clientOpts *argocdclient.ClientOptions) *
}
projName := args[0]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
err = proj.Spec.AddWindow(kind, schedule, duration, applications, namespaces, clusters, manualSync)
err = proj.Spec.AddWindow(kind, schedule, duration, applications, namespaces, clusters, manualSync, timeZone)
errors.CheckError(err)
_, err = projIf.Update(context.Background(), &projectpkg.ProjectUpdateRequest{Project: proj})
@@ -148,6 +147,7 @@ func NewProjectWindowsAddWindowCommand(clientOpts *argocdclient.ClientOptions) *
command.Flags().StringSliceVar(&namespaces, "namespaces", []string{}, "Namespaces that the schedule will be applied to. Comma separated, wildcards supported (e.g. --namespaces default,\\*-prod)")
command.Flags().StringSliceVar(&clusters, "clusters", []string{}, "Clusters that the schedule will be applied to. Comma separated, wildcards supported (e.g. --clusters prod,staging)")
command.Flags().BoolVar(&manualSync, "manual-sync", false, "Allow manual syncs for both deny and allow windows")
command.Flags().StringVar(&timeZone, "time-zone", "UTC", "Time zone of the sync window")
return command
}
@@ -168,7 +168,7 @@ func NewProjectWindowsDeleteCommand(clientOpts *argocdclient.ClientOptions) *cob
errors.CheckError(err)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
@@ -191,6 +191,7 @@ func NewProjectWindowsUpdateCommand(clientOpts *argocdclient.ClientOptions) *cob
applications []string
namespaces []string
clusters []string
timeZone string
)
var command = &cobra.Command{
Use: "update PROJECT ID",
@@ -207,14 +208,14 @@ func NewProjectWindowsUpdateCommand(clientOpts *argocdclient.ClientOptions) *cob
errors.CheckError(err)
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)
for i, window := range proj.Spec.SyncWindows {
if id == i {
err := window.Update(schedule, duration, applications, namespaces, clusters)
err := window.Update(schedule, duration, applications, namespaces, clusters, timeZone)
if err != nil {
errors.CheckError(err)
}
@@ -230,6 +231,7 @@ func NewProjectWindowsUpdateCommand(clientOpts *argocdclient.ClientOptions) *cob
command.Flags().StringSliceVar(&applications, "applications", []string{}, "Applications that the schedule will be applied to. Comma separated, wildcards supported (e.g. --applications prod-\\*,website)")
command.Flags().StringSliceVar(&namespaces, "namespaces", []string{}, "Namespaces that the schedule will be applied to. Comma separated, wildcards supported (e.g. --namespaces default,\\*-prod)")
command.Flags().StringSliceVar(&clusters, "clusters", []string{}, "Clusters that the schedule will be applied to. Comma separated, wildcards supported (e.g. --clusters prod,staging)")
command.Flags().StringVar(&timeZone, "time-zone", "UTC", "Time zone of the sync window. (e.g. --time-zone \"America/New_York\")")
return command
}
@@ -248,7 +250,7 @@ func NewProjectWindowsListCommand(clientOpts *argocdclient.ClientOptions) *cobra
}
projName := args[0]
conn, projIf := argocdclient.NewClientOrDie(clientOpts).NewProjectClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
proj, err := projIf.Get(context.Background(), &projectpkg.ProjectQuery{Name: projName})
errors.CheckError(err)

View File

@@ -9,12 +9,12 @@ import (
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
settingspkg "github.com/argoproj/argo-cd/pkg/apiclient/settings"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/localconfig"
"github.com/argoproj/argo-cd/util/session"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
settingspkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/settings"
"github.com/argoproj/argo-cd/v2/util/errors"
argoio "github.com/argoproj/argo-cd/v2/util/io"
"github.com/argoproj/argo-cd/v2/util/localconfig"
"github.com/argoproj/argo-cd/v2/util/session"
)
// NewReloginCommand returns a new instance of `argocd relogin` command
@@ -43,22 +43,26 @@ func NewReloginCommand(globalClientOpts *argocdclient.ClientOptions) *cobra.Comm
var tokenString string
var refreshToken string
clientOpts := argocdclient.ClientOptions{
ConfigPath: "",
ServerAddr: configCtx.Server.Server,
Insecure: configCtx.Server.Insecure,
GRPCWeb: globalClientOpts.GRPCWeb,
PlainText: configCtx.Server.PlainText,
ConfigPath: "",
ServerAddr: configCtx.Server.Server,
Insecure: configCtx.Server.Insecure,
ClientCertFile: globalClientOpts.ClientCertFile,
ClientCertKeyFile: globalClientOpts.ClientCertKeyFile,
GRPCWeb: globalClientOpts.GRPCWeb,
GRPCWebRootPath: globalClientOpts.GRPCWebRootPath,
PlainText: configCtx.Server.PlainText,
Headers: globalClientOpts.Headers,
}
acdClient := argocdclient.NewClientOrDie(&clientOpts)
claims, err := configCtx.User.Claims()
errors.CheckError(err)
if claims.Issuer == session.SessionManagerClaimsIssuer {
fmt.Printf("Relogging in as '%s'\n", claims.Subject)
tokenString = passwordLogin(acdClient, claims.Subject, password)
fmt.Printf("Relogging in as '%s'\n", localconfig.GetUsername(claims.Subject))
tokenString = passwordLogin(acdClient, localconfig.GetUsername(claims.Subject), password)
} else {
fmt.Println("Reinitiating SSO login")
setConn, setIf := acdClient.NewSettingsClientOrDie()
defer util.Close(setConn)
defer argoio.Close(setConn)
ctx := context.Background()
httpClient, err := acdClient.HTTPClient()
errors.CheckError(err)

View File

@@ -10,14 +10,14 @@ import (
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
repositorypkg "github.com/argoproj/argo-cd/pkg/apiclient/repository"
appsv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/git"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
repositorypkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/repository"
appsv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/git"
"github.com/argoproj/argo-cd/v2/util/io"
)
// NewRepoCommand returns a new instance of an `argocd repo` command
@@ -32,6 +32,7 @@ func NewRepoCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
}
command.AddCommand(NewRepoAddCommand(clientOpts))
command.AddCommand(NewRepoGetCommand(clientOpts))
command.AddCommand(NewRepoListCommand(clientOpts))
command.AddCommand(NewRepoRemoveCommand(clientOpts))
return command
@@ -40,20 +41,16 @@ func NewRepoCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
// NewRepoAddCommand returns a new instance of an `argocd repo add` command
func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
repo appsv1.Repository
upsert bool
sshPrivateKeyPath string
insecureIgnoreHostKey bool
insecureSkipServerVerification bool
tlsClientCertPath string
tlsClientCertKeyPath string
enableLfs bool
repoOpts cmdutil.RepoOptions
)
// For better readability and easier formatting
var repoAddExamples = ` # Add a Git repository via SSH using a private key for authentication, ignoring the server's host key:
argocd repo add git@git.example.com:repos/repo --insecure-ignore-host-key --ssh-private-key-path ~/id_rsa
# Add a Git repository via SSH on a non-default port - need to use ssh:// style URLs here
argocd repo add ssh://git@git.example.com:2222/repos/repo --ssh-private-key-path ~/id_rsa
# Add a private Git repository via HTTPS using username/password and TLS client certificates:
argocd repo add https://git.example.com/repos/repo --username git --password secret --tls-client-cert-path ~/mycert.crt --tls-client-cert-key-path ~/mycert.key
@@ -61,10 +58,19 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
argocd repo add https://git.example.com/repos/repo --username git --password secret --insecure-skip-server-verification
# Add a public Helm repository named 'stable' via HTTPS
argocd repo add https://kubernetes-charts.storage.googleapis.com --type helm --name stable
argocd repo add https://charts.helm.sh/stable --type helm --name stable
# Add a private Helm repository named 'stable' via HTTPS
argocd repo add https://kubernetes-charts.storage.googleapis.com --type helm --name stable --username test --password test
argocd repo add https://charts.helm.sh/stable --type helm --name stable --username test --password test
# Add a private Helm OCI-based repository named 'stable' via HTTPS
argocd repo add helm-oci-registry.cn-zhangjiakou.cr.aliyuncs.com --type helm --name stable --enable-oci --username test --password test
# Add a private Git repository on GitHub.com via GitHub App
argocd repo add https://git.example.com/repos/repo --github-app-id 1 --github-app-installation-id 2 --github-app-private-key-path test.private-key.pem
# Add a private Git repository on GitHub Enterprise via GitHub App
argocd repo add https://ghe.example.com/repos/repo --github-app-id 1 --github-app-installation-id 2 --github-app-private-key-path test.private-key.pem --github-app-enterprise-base-url https://ghe.example.com/api/v3
`
var command = &cobra.Command{
@@ -78,16 +84,16 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
}
// Repository URL
repo.Repo = args[0]
repoOpts.Repo.Repo = args[0]
// Specifying ssh-private-key-path is only valid for SSH repositories
if sshPrivateKeyPath != "" {
if ok, _ := git.IsSSHURL(repo.Repo); ok {
keyData, err := ioutil.ReadFile(sshPrivateKeyPath)
if repoOpts.SshPrivateKeyPath != "" {
if ok, _ := git.IsSSHURL(repoOpts.Repo.Repo); ok {
keyData, err := ioutil.ReadFile(repoOpts.SshPrivateKeyPath)
if err != nil {
log.Fatal(err)
}
repo.SSHPrivateKey = string(keyData)
repoOpts.Repo.SSHPrivateKey = string(keyData)
} else {
err := fmt.Errorf("--ssh-private-key-path is only supported for SSH repositories.")
errors.CheckError(err)
@@ -96,44 +102,61 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
// tls-client-cert-path and tls-client-cert-key-key-path must always be
// specified together
if (tlsClientCertPath != "" && tlsClientCertKeyPath == "") || (tlsClientCertPath == "" && tlsClientCertKeyPath != "") {
if (repoOpts.TlsClientCertPath != "" && repoOpts.TlsClientCertKeyPath == "") || (repoOpts.TlsClientCertPath == "" && repoOpts.TlsClientCertKeyPath != "") {
err := fmt.Errorf("--tls-client-cert-path and --tls-client-cert-key-path must be specified together")
errors.CheckError(err)
}
// Specifying tls-client-cert-path is only valid for HTTPS repositories
if tlsClientCertPath != "" {
if git.IsHTTPSURL(repo.Repo) {
tlsCertData, err := ioutil.ReadFile(tlsClientCertPath)
if repoOpts.TlsClientCertPath != "" {
if git.IsHTTPSURL(repoOpts.Repo.Repo) {
tlsCertData, err := ioutil.ReadFile(repoOpts.TlsClientCertPath)
errors.CheckError(err)
tlsCertKey, err := ioutil.ReadFile(tlsClientCertKeyPath)
tlsCertKey, err := ioutil.ReadFile(repoOpts.TlsClientCertKeyPath)
errors.CheckError(err)
repo.TLSClientCertData = string(tlsCertData)
repo.TLSClientCertKey = string(tlsCertKey)
repoOpts.Repo.TLSClientCertData = string(tlsCertData)
repoOpts.Repo.TLSClientCertKey = string(tlsCertKey)
} else {
err := fmt.Errorf("--tls-client-cert-path is only supported for HTTPS repositories")
errors.CheckError(err)
}
}
// Specifying github-app-private-key-path is only valid for HTTPS repositories
if repoOpts.GithubAppPrivateKeyPath != "" {
if git.IsHTTPSURL(repoOpts.Repo.Repo) {
githubAppPrivateKey, err := ioutil.ReadFile(repoOpts.GithubAppPrivateKeyPath)
errors.CheckError(err)
repoOpts.Repo.GithubAppPrivateKey = string(githubAppPrivateKey)
} else {
err := fmt.Errorf("--github-app-private-key-path is only supported for HTTPS repositories")
errors.CheckError(err)
}
}
// Set repository connection properties only when creating repository, not
// when creating repository credentials.
// InsecureIgnoreHostKey is deprecated and only here for backwards compat
repo.InsecureIgnoreHostKey = insecureIgnoreHostKey
repo.Insecure = insecureSkipServerVerification
repo.EnableLFS = enableLfs
repoOpts.Repo.InsecureIgnoreHostKey = repoOpts.InsecureIgnoreHostKey
repoOpts.Repo.Insecure = repoOpts.InsecureSkipServerVerification
repoOpts.Repo.EnableLFS = repoOpts.EnableLfs
repoOpts.Repo.EnableOCI = repoOpts.EnableOci
repoOpts.Repo.GithubAppId = repoOpts.GithubAppId
repoOpts.Repo.GithubAppInstallationId = repoOpts.GithubAppInstallationId
repoOpts.Repo.GitHubAppEnterpriseBaseURL = repoOpts.GitHubAppEnterpriseBaseURL
repoOpts.Repo.Proxy = repoOpts.Proxy
if repo.Type == "helm" && repo.Name == "" {
if repoOpts.Repo.Type == "helm" && repoOpts.Repo.Name == "" {
errors.CheckError(fmt.Errorf("Must specify --name for repos of type 'helm'"))
}
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
// If the user set a username, but didn't supply password via --password,
// then we prompt for it
if repo.Username != "" && repo.Password == "" {
repo.Password = cli.PromptPassword(repo.Password)
if repoOpts.Repo.Username != "" && repoOpts.Repo.Password == "" {
repoOpts.Repo.Password = cli.PromptPassword(repoOpts.Repo.Password)
}
// We let the server check access to the repository before adding it. If
@@ -144,40 +167,38 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
// are high that we do not have the given URL pointing to a valid Git
// repo anyway.
repoAccessReq := repositorypkg.RepoAccessQuery{
Repo: repo.Repo,
Type: repo.Type,
Name: repo.Name,
Username: repo.Username,
Password: repo.Password,
SshPrivateKey: repo.SSHPrivateKey,
TlsClientCertData: repo.TLSClientCertData,
TlsClientCertKey: repo.TLSClientCertKey,
Insecure: repo.IsInsecure(),
Repo: repoOpts.Repo.Repo,
Type: repoOpts.Repo.Type,
Name: repoOpts.Repo.Name,
Username: repoOpts.Repo.Username,
Password: repoOpts.Repo.Password,
SshPrivateKey: repoOpts.Repo.SSHPrivateKey,
TlsClientCertData: repoOpts.Repo.TLSClientCertData,
TlsClientCertKey: repoOpts.Repo.TLSClientCertKey,
Insecure: repoOpts.Repo.IsInsecure(),
EnableOci: repoOpts.Repo.EnableOCI,
GithubAppPrivateKey: repoOpts.Repo.GithubAppPrivateKey,
GithubAppID: repoOpts.Repo.GithubAppId,
GithubAppInstallationID: repoOpts.Repo.GithubAppInstallationId,
GithubAppEnterpriseBaseUrl: repoOpts.Repo.GitHubAppEnterpriseBaseURL,
Proxy: repoOpts.Proxy,
Project: repoOpts.Repo.Project,
}
_, err := repoIf.ValidateAccess(context.Background(), &repoAccessReq)
errors.CheckError(err)
repoCreateReq := repositorypkg.RepoCreateRequest{
Repo: &repo,
Upsert: upsert,
Repo: &repoOpts.Repo,
Upsert: repoOpts.Upsert,
}
createdRepo, err := repoIf.CreateRepository(context.Background(), &repoCreateReq)
createdRepo, err := repoIf.Create(context.Background(), &repoCreateReq)
errors.CheckError(err)
fmt.Printf("repository '%s' added\n", createdRepo.Repo)
fmt.Printf("Repository '%s' added\n", createdRepo.Repo)
},
}
command.Flags().StringVar(&repo.Type, "type", common.DefaultRepoType, "type of the repository, \"git\" or \"helm\"")
command.Flags().StringVar(&repo.Name, "name", "", "name of the repository, mandatory for repositories of type helm")
command.Flags().StringVar(&repo.Username, "username", "", "username to the repository")
command.Flags().StringVar(&repo.Password, "password", "", "password to the repository")
command.Flags().StringVar(&sshPrivateKeyPath, "ssh-private-key-path", "", "path to the private ssh key (e.g. ~/.ssh/id_rsa)")
command.Flags().StringVar(&tlsClientCertPath, "tls-client-cert-path", "", "path to the TLS client cert (must be PEM format)")
command.Flags().StringVar(&tlsClientCertKeyPath, "tls-client-cert-key-path", "", "path to the TLS client cert's key path (must be PEM format)")
command.Flags().BoolVar(&insecureIgnoreHostKey, "insecure-ignore-host-key", false, "disables SSH strict host key checking (deprecated, use --insecure-skip-server-validation instead)")
command.Flags().BoolVar(&insecureSkipServerVerification, "insecure-skip-server-verification", false, "disables server certificate and host key checks")
command.Flags().BoolVar(&enableLfs, "enable-lfs", false, "enable git-lfs (Large File Support) on this repository")
command.Flags().BoolVar(&upsert, "upsert", false, "Override an existing repository with the same name even if the spec differs")
command.Flags().BoolVar(&repoOpts.Upsert, "upsert", false, "Override an existing repository with the same name even if the spec differs")
cmdutil.AddRepoFlags(command, &repoOpts)
return command
}
@@ -192,10 +213,11 @@ func NewRepoRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
os.Exit(1)
}
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
for _, repoURL := range args {
_, err := repoIf.DeleteRepository(context.Background(), &repositorypkg.RepoQuery{Repo: repoURL})
_, err := repoIf.Delete(context.Background(), &repositorypkg.RepoQuery{Repo: repoURL})
errors.CheckError(err)
fmt.Printf("Repository '%s' removed\n", repoURL)
}
},
}
@@ -205,7 +227,7 @@ func NewRepoRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
// Print table of repo info
func printRepoTable(repos appsv1.Repositories) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
_, _ = fmt.Fprintf(w, "TYPE\tNAME\tREPO\tINSECURE\tLFS\tCREDS\tSTATUS\tMESSAGE\n")
_, _ = fmt.Fprintf(w, "TYPE\tNAME\tREPO\tINSECURE\tOCI\tLFS\tCREDS\tSTATUS\tMESSAGE\tPROJECT\n")
for _, r := range repos {
var hasCreds string
if !r.HasCredentials() {
@@ -217,7 +239,7 @@ func printRepoTable(repos appsv1.Repositories) {
hasCreds = "true"
}
}
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%v\t%v\t%s\t%s\t%s\n", r.Type, r.Name, r.Repo, r.IsInsecure(), r.EnableLFS, hasCreds, r.ConnectionState.Status, r.ConnectionState.Message)
_, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%v\t%v\t%v\t%s\t%s\t%s\t%s\n", r.Type, r.Name, r.Repo, r.IsInsecure(), r.EnableOCI, r.EnableLFS, hasCreds, r.ConnectionState.Status, r.ConnectionState.Message, r.Project)
}
_ = w.Flush()
}
@@ -240,7 +262,7 @@ func NewRepoListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
Short: "List configured repositories",
Run: func(c *cobra.Command, args []string) {
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
forceRefresh := false
switch refresh {
case "":
@@ -250,7 +272,7 @@ func NewRepoListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
err := fmt.Errorf("--refresh must be one of: 'hard'")
errors.CheckError(err)
}
repos, err := repoIf.ListRepositories(context.Background(), &repositorypkg.RepoQuery{ForceRefresh: forceRefresh})
repos, err := repoIf.List(context.Background(), &repositorypkg.RepoQuery{ForceRefresh: forceRefresh})
errors.CheckError(err)
switch output {
case "yaml", "json":
@@ -270,3 +292,52 @@ func NewRepoListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
command.Flags().StringVar(&refresh, "refresh", "", "Force a cache refresh on connection status")
return command
}
// NewRepoGetCommand returns a new instance of an `argocd repo rm` command
func NewRepoGetCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
refresh string
)
var command = &cobra.Command{
Use: "get",
Short: "Get a configured repository by URL",
Run: func(c *cobra.Command, args []string) {
if len(args) != 1 {
c.HelpFunc()(c, args)
os.Exit(1)
}
// Repository URL
repoURL := args[0]
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoClientOrDie()
defer io.Close(conn)
forceRefresh := false
switch refresh {
case "":
case "hard":
forceRefresh = true
default:
err := fmt.Errorf("--refresh must be one of: 'hard'")
errors.CheckError(err)
}
repo, err := repoIf.Get(context.Background(), &repositorypkg.RepoQuery{Repo: repoURL, ForceRefresh: forceRefresh})
errors.CheckError(err)
switch output {
case "yaml", "json":
err := PrintResource(repo, output)
errors.CheckError(err)
case "url":
fmt.Println(repo.Repo)
// wide is the default
case "wide", "":
printRepoTable(appsv1.Repositories{repo})
default:
errors.CheckError(fmt.Errorf("unknown output format: %s", output))
}
},
}
command.Flags().StringVarP(&output, "output", "o", "wide", "Output format. One of: json|yaml|wide|url")
command.Flags().StringVar(&refresh, "refresh", "", "Force a cache refresh on connection status")
return command
}

View File

@@ -10,16 +10,17 @@ import (
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
repocredspkg "github.com/argoproj/argo-cd/pkg/apiclient/repocreds"
appsv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/git"
"github.com/argoproj/argo-cd/v2/common"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
repocredspkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/repocreds"
appsv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/git"
"github.com/argoproj/argo-cd/v2/util/io"
)
// NewRepoCredsCommand returns a new instance of an `argocd repo` command
// NewRepoCredsCommand returns a new instance of an `argocd repocreds` command
func NewRepoCredsCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "repocreds",
@@ -36,22 +37,32 @@ func NewRepoCredsCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command
return command
}
// NewRepoCredsAddCommand returns a new instance of an `argocd repo add` command
// NewRepoCredsAddCommand returns a new instance of an `argocd repocreds add` command
func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
repo appsv1.RepoCreds
upsert bool
sshPrivateKeyPath string
tlsClientCertPath string
tlsClientCertKeyPath string
repo appsv1.RepoCreds
upsert bool
sshPrivateKeyPath string
tlsClientCertPath string
tlsClientCertKeyPath string
githubAppPrivateKeyPath string
)
// For better readability and easier formatting
var repocredsAddExamples = ` # Add credentials with user/pass authentication to use for all repositories under https://git.example.com/repos
argocd repocreds add https://git.example.com/repos/ --username git --password secret
# Add credentials with SSH private key authentication to use for all repositories under https://git.example.com/repos
argocd repocreds add https://git.example.com/repos/ --ssh-private-key-path ~/.ssh/id_rsa
# Add credentials with SSH private key authentication to use for all repositories under ssh://git@git.example.com/repos
argocd repocreds add ssh://git@git.example.com/repos/ --ssh-private-key-path ~/.ssh/id_rsa
# Add credentials with GitHub App authentication to use for all repositories under https://github.com/repos
argocd repocreds add https://github.com/repos/ --github-app-id 1 --github-app-installation-id 2 --github-app-private-key-path test.private-key.pem
# Add credentials with GitHub App authentication to use for all repositories under https://ghe.example.com/repos
argocd repocreds add https://ghe.example.com/repos/ --github-app-id 1 --github-app-installation-id 2 --github-app-private-key-path test.private-key.pem --github-app-enterprise-base-url https://ghe.example.com/api/v3
# Add credentials with helm oci registry so that these oci registry urls do not need to be added as repos individually.
argocd repocreds add localhost:5000/myrepo --enable-oci --type helm
`
var command = &cobra.Command{
@@ -103,8 +114,20 @@ func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comma
}
}
// Specifying github-app-private-key-path is only valid for HTTPS repositories
if githubAppPrivateKeyPath != "" {
if git.IsHTTPSURL(repo.URL) {
githubAppPrivateKey, err := ioutil.ReadFile(githubAppPrivateKeyPath)
errors.CheckError(err)
repo.GithubAppPrivateKey = string(githubAppPrivateKey)
} else {
err := fmt.Errorf("--github-app-private-key-path is only supported for HTTPS repositories")
errors.CheckError(err)
}
}
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoCredsClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
// If the user set a username, but didn't supply password via --password,
// then we prompt for it
@@ -119,7 +142,7 @@ func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comma
createdRepo, err := repoIf.CreateRepositoryCredentials(context.Background(), &repoCreateReq)
errors.CheckError(err)
fmt.Printf("repository credentials for '%s' added\n", createdRepo.URL)
fmt.Printf("Repository credentials for '%s' added\n", createdRepo.URL)
},
}
command.Flags().StringVar(&repo.Username, "username", "", "username to the repository")
@@ -127,11 +150,17 @@ func NewRepoCredsAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comma
command.Flags().StringVar(&sshPrivateKeyPath, "ssh-private-key-path", "", "path to the private ssh key (e.g. ~/.ssh/id_rsa)")
command.Flags().StringVar(&tlsClientCertPath, "tls-client-cert-path", "", "path to the TLS client cert (must be PEM format)")
command.Flags().StringVar(&tlsClientCertKeyPath, "tls-client-cert-key-path", "", "path to the TLS client cert's key path (must be PEM format)")
command.Flags().Int64Var(&repo.GithubAppId, "github-app-id", 0, "id of the GitHub Application")
command.Flags().Int64Var(&repo.GithubAppInstallationId, "github-app-installation-id", 0, "installation id of the GitHub Application")
command.Flags().StringVar(&githubAppPrivateKeyPath, "github-app-private-key-path", "", "private key of the GitHub Application")
command.Flags().StringVar(&repo.GitHubAppEnterpriseBaseURL, "github-app-enterprise-base-url", "", "base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3")
command.Flags().BoolVar(&upsert, "upsert", false, "Override an existing repository with the same name even if the spec differs")
command.Flags().BoolVar(&repo.EnableOCI, "enable-oci", false, "Specifies whether helm-oci support should be enabled for this repo")
command.Flags().StringVar(&repo.Type, "type", common.DefaultRepoType, "type of the repository, \"git\" or \"helm\"")
return command
}
// NewRepoCredsRemoveCommand returns a new instance of an `argocd repo list` command
// NewRepoCredsRemoveCommand returns a new instance of an `argocd repocreds rm` command
func NewRepoCredsRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var command = &cobra.Command{
Use: "rm CREDSURL",
@@ -142,10 +171,11 @@ func NewRepoCredsRemoveCommand(clientOpts *argocdclient.ClientOptions) *cobra.Co
os.Exit(1)
}
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoCredsClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
for _, repoURL := range args {
_, err := repoIf.DeleteRepositoryCredentials(context.Background(), &repocredspkg.RepoCredsDeleteRequest{Url: repoURL})
errors.CheckError(err)
fmt.Printf("Repository credentials for '%s' removed\n", repoURL)
}
},
}
@@ -172,7 +202,7 @@ func printRepoCredsUrls(repos []appsv1.RepoCreds) {
}
}
// NewRepoCredsListCommand returns a new instance of an `argocd repo rm` command
// NewRepoCredsListCommand returns a new instance of an `argocd repo list` command
func NewRepoCredsListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command {
var (
output string
@@ -182,7 +212,7 @@ func NewRepoCredsListCommand(clientOpts *argocdclient.ClientOptions) *cobra.Comm
Short: "List configured repository credentials",
Run: func(c *cobra.Command, args []string) {
conn, repoIf := argocdclient.NewClientOrDie(clientOpts).NewRepoCredsClientOrDie()
defer util.Close(conn)
defer io.Close(conn)
repos, err := repoIf.ListRepositoryCredentials(context.Background(), &repocredspkg.RepoCredsQuery{})
errors.CheckError(err)
switch output {

View File

@@ -4,21 +4,23 @@ import (
"github.com/spf13/cobra"
"k8s.io/client-go/tools/clientcmd"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
"github.com/argoproj/argo-cd/util/cli"
"github.com/argoproj/argo-cd/util/config"
"github.com/argoproj/argo-cd/util/localconfig"
"github.com/argoproj/argo-cd/v2/cmd/argocd/commands/admin"
"github.com/argoproj/argo-cd/v2/cmd/argocd/commands/headless"
cmdutil "github.com/argoproj/argo-cd/v2/cmd/util"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/util/cli"
"github.com/argoproj/argo-cd/v2/util/config"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/localconfig"
)
func init() {
cobra.OnInitialize(initConfig)
}
var logLevel string
func initConfig() {
cli.SetLogLevel(logLevel)
cli.SetLogFormat(cmdutil.LogFormat)
cli.SetLogLevel(cmdutil.LogLevel)
}
// NewCommand returns a new instance of an argocd command
@@ -34,21 +36,24 @@ func NewCommand() *cobra.Command {
Run: func(c *cobra.Command, args []string) {
c.HelpFunc()(c, args)
},
DisableAutoGenTag: true,
}
command.AddCommand(NewCompletionCommand())
command.AddCommand(NewVersionCmd(&clientOpts))
command.AddCommand(NewClusterCommand(&clientOpts, pathOpts))
command.AddCommand(NewApplicationCommand(&clientOpts))
command.AddCommand(headless.InitCommand(NewVersionCmd(&clientOpts), &clientOpts, nil))
command.AddCommand(headless.InitCommand(NewClusterCommand(&clientOpts, pathOpts), &clientOpts, nil))
command.AddCommand(headless.InitCommand(NewApplicationCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(NewLoginCommand(&clientOpts))
command.AddCommand(NewReloginCommand(&clientOpts))
command.AddCommand(NewRepoCommand(&clientOpts))
command.AddCommand(NewRepoCredsCommand(&clientOpts))
command.AddCommand(headless.InitCommand(NewRepoCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(headless.InitCommand(NewRepoCredsCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(NewContextCommand(&clientOpts))
command.AddCommand(NewProjectCommand(&clientOpts))
command.AddCommand(NewAccountCommand(&clientOpts))
command.AddCommand(headless.InitCommand(NewProjectCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(headless.InitCommand(NewAccountCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(NewLogoutCommand(&clientOpts))
command.AddCommand(NewCertCommand(&clientOpts))
command.AddCommand(headless.InitCommand(NewCertCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(headless.InitCommand(NewGPGCommand(&clientOpts), &clientOpts, nil))
command.AddCommand(admin.NewAdminCommand())
defaultLocalConfigPath, err := localconfig.DefaultLocalConfigPath()
errors.CheckError(err)
@@ -57,11 +62,17 @@ func NewCommand() *cobra.Command {
command.PersistentFlags().BoolVar(&clientOpts.PlainText, "plaintext", config.GetBoolFlag("plaintext"), "Disable TLS")
command.PersistentFlags().BoolVar(&clientOpts.Insecure, "insecure", config.GetBoolFlag("insecure"), "Skip server certificate and domain verification")
command.PersistentFlags().StringVar(&clientOpts.CertFile, "server-crt", config.GetFlag("server-crt", ""), "Server certificate file")
command.PersistentFlags().StringVar(&clientOpts.ClientCertFile, "client-crt", config.GetFlag("client-crt", ""), "Client certificate file")
command.PersistentFlags().StringVar(&clientOpts.ClientCertKeyFile, "client-crt-key", config.GetFlag("client-crt-key", ""), "Client certificate key file")
command.PersistentFlags().StringVar(&clientOpts.AuthToken, "auth-token", config.GetFlag("auth-token", ""), "Authentication token")
command.PersistentFlags().BoolVar(&clientOpts.GRPCWeb, "grpc-web", config.GetBoolFlag("grpc-web"), "Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2.")
command.PersistentFlags().StringVar(&logLevel, "loglevel", config.GetFlag("loglevel", "info"), "Set the logging level. One of: debug|info|warn|error")
command.PersistentFlags().StringVar(&clientOpts.GRPCWebRootPath, "grpc-web-root-path", config.GetFlag("grpc-web-root-path", ""), "Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root.")
command.PersistentFlags().StringVar(&cmdutil.LogFormat, "logformat", config.GetFlag("logformat", "text"), "Set the logging format. One of: text|json")
command.PersistentFlags().StringVar(&cmdutil.LogLevel, "loglevel", config.GetFlag("loglevel", "info"), "Set the logging level. One of: debug|info|warn|error")
command.PersistentFlags().StringSliceVarP(&clientOpts.Headers, "header", "H", []string{}, "Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers)")
command.PersistentFlags().BoolVar(&clientOpts.PortForward, "port-forward", config.GetBoolFlag("port-forward"), "Connect to a random argocd-server port using port forwarding")
command.PersistentFlags().StringVar(&clientOpts.PortForwardNamespace, "port-forward-namespace", config.GetFlag("port-forward-namespace", ""), "Namespace name which should be used for port forwarding")
command.PersistentFlags().IntVar(&clientOpts.HttpRetryMax, "http-retry-max", 0, "Maximum number of retries to establish http connection to Argo CD server")
command.PersistentFlags().BoolVar(&clientOpts.Core, "core", false, "If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server")
return command
}

View File

@@ -3,16 +3,16 @@ package commands
import (
"context"
"fmt"
"io"
"github.com/golang/protobuf/ptypes/empty"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/common"
"github.com/argoproj/argo-cd/errors"
argocdclient "github.com/argoproj/argo-cd/pkg/apiclient"
"github.com/argoproj/argo-cd/pkg/apiclient/version"
"github.com/argoproj/argo-cd/util"
"github.com/argoproj/argo-cd/v2/common"
argocdclient "github.com/argoproj/argo-cd/v2/pkg/apiclient"
"github.com/argoproj/argo-cd/v2/pkg/apiclient/version"
"github.com/argoproj/argo-cd/v2/util/errors"
argoio "github.com/argoproj/argo-cd/v2/util/io"
)
// NewVersionCmd returns a new `version` command to be used as a sub-command to root
@@ -25,7 +25,7 @@ func NewVersionCmd(clientOpts *argocdclient.ClientOptions) *cobra.Command {
versionCmd := cobra.Command{
Use: "version",
Short: fmt.Sprintf("Print version information"),
Short: "Print version information",
Example: ` # Print the full version of client and server to stdout
argocd version
@@ -39,44 +39,39 @@ func NewVersionCmd(clientOpts *argocdclient.ClientOptions) *cobra.Command {
argocd version --short -o yaml
`,
Run: func(cmd *cobra.Command, args []string) {
var (
versionIf version.VersionServiceClient
serverVers *version.VersionMessage
conn io.Closer
err error
)
if !client {
// Get Server version
conn, versionIf = argocdclient.NewClientOrDie(clientOpts).NewVersionClientOrDie()
defer util.Close(conn)
serverVers, err = versionIf.Version(context.Background(), &empty.Empty{})
errors.CheckError(err)
}
cv := common.GetVersion()
switch output {
case "yaml", "json":
clientVers := common.GetVersion()
version := make(map[string]interface{})
if !short {
version["client"] = clientVers
v := make(map[string]interface{})
if short {
v["client"] = map[string]string{cliName: cv.Version}
} else {
version["client"] = map[string]string{cliName: clientVers.Version}
v["client"] = cv
}
if !client {
if !short {
version["server"] = serverVers
sv := getServerVersion(clientOpts)
if short {
v["server"] = map[string]string{"argocd-server": sv.Version}
} else {
version["server"] = map[string]string{"argocd-server": serverVers.Version}
v["server"] = sv
}
}
err := PrintResource(version, output)
err := PrintResource(v, output)
errors.CheckError(err)
case "short":
printVersion(serverVers, client, true)
case "wide", "":
// we use value of short for backward compatibility
printVersion(serverVers, client, short)
case "wide", "short", "":
printClientVersion(&cv, short || (output == "short"))
if !client {
sv := getServerVersion(clientOpts)
printServerVersion(sv, short || (output == "short"))
}
default:
errors.CheckError(fmt.Errorf("unknown output format: %s", output))
log.Fatalf("unknown output format: %s", output)
}
},
}
@@ -86,38 +81,75 @@ func NewVersionCmd(clientOpts *argocdclient.ClientOptions) *cobra.Command {
return &versionCmd
}
func printVersion(serverVers *version.VersionMessage, client bool, short bool) {
version := common.GetVersion()
func getServerVersion(options *argocdclient.ClientOptions) *version.VersionMessage {
conn, versionIf := argocdclient.NewClientOrDie(options).NewVersionClientOrDie()
defer argoio.Close(conn)
v, err := versionIf.Version(context.Background(), &empty.Empty{})
errors.CheckError(err)
return v
}
func printClientVersion(version *common.Version, short bool) {
fmt.Printf("%s: %s\n", cliName, version)
if !short {
fmt.Printf(" BuildDate: %s\n", version.BuildDate)
fmt.Printf(" GitCommit: %s\n", version.GitCommit)
fmt.Printf(" GitTreeState: %s\n", version.GitTreeState)
if version.GitTag != "" {
fmt.Printf(" GitTag: %s\n", version.GitTag)
}
fmt.Printf(" GoVersion: %s\n", version.GoVersion)
fmt.Printf(" Compiler: %s\n", version.Compiler)
fmt.Printf(" Platform: %s\n", version.Platform)
}
if client {
if short {
return
}
fmt.Printf("%s: %s\n", "argocd-server", serverVers.Version)
if !short {
fmt.Printf(" BuildDate: %s\n", serverVers.BuildDate)
fmt.Printf(" GitCommit: %s\n", serverVers.GitCommit)
fmt.Printf(" GitTreeState: %s\n", serverVers.GitTreeState)
if version.GitTag != "" {
fmt.Printf(" GitTag: %s\n", serverVers.GitTag)
}
fmt.Printf(" GoVersion: %s\n", serverVers.GoVersion)
fmt.Printf(" Compiler: %s\n", serverVers.Compiler)
fmt.Printf(" Platform: %s\n", serverVers.Platform)
fmt.Printf(" Ksonnet Version: %s\n", serverVers.KsonnetVersion)
fmt.Printf(" Kustomize Version: %s\n", serverVers.KustomizeVersion)
fmt.Printf(" Helm Version: %s\n", serverVers.HelmVersion)
fmt.Printf(" Kubectl Version: %s\n", serverVers.KubectlVersion)
fmt.Printf(" BuildDate: %s\n", version.BuildDate)
fmt.Printf(" GitCommit: %s\n", version.GitCommit)
fmt.Printf(" GitTreeState: %s\n", version.GitTreeState)
if version.GitTag != "" {
fmt.Printf(" GitTag: %s\n", version.GitTag)
}
fmt.Printf(" GoVersion: %s\n", version.GoVersion)
fmt.Printf(" Compiler: %s\n", version.Compiler)
fmt.Printf(" Platform: %s\n", version.Platform)
}
func printServerVersion(version *version.VersionMessage, short bool) {
fmt.Printf("%s: %s\n", "argocd-server", version.Version)
if short {
return
}
if version.BuildDate != "" {
fmt.Printf(" BuildDate: %s\n", version.BuildDate)
}
if version.GitCommit != "" {
fmt.Printf(" GitCommit: %s\n", version.GitCommit)
}
if version.GitTreeState != "" {
fmt.Printf(" GitTreeState: %s\n", version.GitTreeState)
}
if version.GitTag != "" {
fmt.Printf(" GitTag: %s\n", version.GitTag)
}
if version.GoVersion != "" {
fmt.Printf(" GoVersion: %s\n", version.GoVersion)
}
if version.Compiler != "" {
fmt.Printf(" Compiler: %s\n", version.Compiler)
}
if version.Platform != "" {
fmt.Printf(" Platform: %s\n", version.Platform)
}
if version.KsonnetVersion != "" {
fmt.Printf(" Ksonnet Version: %s\n", version.KsonnetVersion)
}
if version.KustomizeVersion != "" {
fmt.Printf(" Kustomize Version: %s\n", version.KustomizeVersion)
}
if version.HelmVersion != "" {
fmt.Printf(" Helm Version: %s\n", version.HelmVersion)
}
if version.KubectlVersion != "" {
fmt.Printf(" Kubectl Version: %s\n", version.KubectlVersion)
}
if version.JsonnetVersion != "" {
fmt.Printf(" Jsonnet Version: %s\n", version.JsonnetVersion)
}
}

View File

@@ -1,16 +0,0 @@
package main
import (
commands "github.com/argoproj/argo-cd/cmd/argocd/commands"
"github.com/argoproj/argo-cd/errors"
// load the gcp plugin (required to authenticate against GKE clusters).
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
// load the oidc plugin (required to authenticate with OpenID Connect).
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
)
func main() {
err := commands.NewCommand().Execute()
errors.CheckError(err)
}

50
cmd/main.go Normal file
View File

@@ -0,0 +1,50 @@
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/spf13/cobra"
appcontroller "github.com/argoproj/argo-cd/v2/cmd/argocd-application-controller/commands"
cmpserver "github.com/argoproj/argo-cd/v2/cmd/argocd-cmp-server/commands"
dex "github.com/argoproj/argo-cd/v2/cmd/argocd-dex/commands"
reposerver "github.com/argoproj/argo-cd/v2/cmd/argocd-repo-server/commands"
apiserver "github.com/argoproj/argo-cd/v2/cmd/argocd-server/commands"
cli "github.com/argoproj/argo-cd/v2/cmd/argocd/commands"
)
const (
binaryNameEnv = "ARGOCD_BINARY_NAME"
)
func main() {
var command *cobra.Command
binaryName := filepath.Base(os.Args[0])
if val := os.Getenv(binaryNameEnv); val != "" {
binaryName = val
}
switch binaryName {
case "argocd", "argocd-linux-amd64", "argocd-darwin-amd64", "argocd-windows-amd64.exe":
command = cli.NewCommand()
case "argocd-server":
command = apiserver.NewCommand()
case "argocd-application-controller":
command = appcontroller.NewCommand()
case "argocd-repo-server":
command = reposerver.NewCommand()
case "argocd-cmp-server":
command = cmpserver.NewCommand()
case "argocd-dex":
command = dex.NewCommand()
default:
command = cli.NewCommand()
}
if err := command.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

682
cmd/util/app.go Normal file
View File

@@ -0,0 +1,682 @@
package util
import (
"bufio"
"fmt"
"io/ioutil"
"net/url"
"os"
"strings"
"time"
"github.com/argoproj/gitops-engine/pkg/utils/kube"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
"github.com/argoproj/argo-cd/v2/pkg/apis/application"
argoappv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/config"
"github.com/argoproj/argo-cd/v2/util/errors"
"github.com/argoproj/argo-cd/v2/util/text/label"
)
type AppOptions struct {
repoURL string
appPath string
chart string
env string
revision string
revisionHistoryLimit int
destName string
destServer string
destNamespace string
Parameters []string
valuesFiles []string
values string
releaseName string
helmSets []string
helmSetStrings []string
helmSetFiles []string
helmVersion string
helmPassCredentials bool
project string
syncPolicy string
syncOptions []string
autoPrune bool
selfHeal bool
allowEmpty bool
namePrefix string
nameSuffix string
directoryRecurse bool
configManagementPlugin string
jsonnetTlaStr []string
jsonnetTlaCode []string
jsonnetExtVarStr []string
jsonnetExtVarCode []string
jsonnetLibs []string
kustomizeImages []string
kustomizeVersion string
kustomizeCommonLabels []string
kustomizeCommonAnnotations []string
kustomizeForceCommonLabels bool
kustomizeForceCommonAnnotations bool
pluginEnvs []string
Validate bool
directoryExclude string
directoryInclude string
retryLimit int64
retryBackoffDuration time.Duration
retryBackoffMaxDuration time.Duration
retryBackoffFactor int64
}
func AddAppFlags(command *cobra.Command, opts *AppOptions) {
command.Flags().StringVar(&opts.repoURL, "repo", "", "Repository URL, ignored if a file is set")
command.Flags().StringVar(&opts.appPath, "path", "", "Path in repository to the app directory, ignored if a file is set")
command.Flags().StringVar(&opts.chart, "helm-chart", "", "Helm Chart name")
command.Flags().StringVar(&opts.env, "env", "", "Application environment to monitor")
command.Flags().StringVar(&opts.revision, "revision", "", "The tracking source branch, tag, commit or Helm chart version the application will sync to")
command.Flags().IntVar(&opts.revisionHistoryLimit, "revision-history-limit", argoappv1.RevisionHistoryLimit, "How many items to keep in revision history")
command.Flags().StringVar(&opts.destServer, "dest-server", "", "K8s cluster URL (e.g. https://kubernetes.default.svc)")
command.Flags().StringVar(&opts.destName, "dest-name", "", "K8s cluster Name (e.g. minikube)")
command.Flags().StringVar(&opts.destNamespace, "dest-namespace", "", "K8s target namespace (overrides the namespace specified in the ksonnet app.yaml)")
command.Flags().StringArrayVarP(&opts.Parameters, "parameter", "p", []string{}, "set a parameter override (e.g. -p guestbook=image=example/guestbook:latest)")
command.Flags().StringArrayVar(&opts.valuesFiles, "values", []string{}, "Helm values file(s) to use")
command.Flags().StringVar(&opts.values, "values-literal-file", "", "Filename or URL to import as a literal Helm values block")
command.Flags().StringVar(&opts.releaseName, "release-name", "", "Helm release-name")
command.Flags().StringVar(&opts.helmVersion, "helm-version", "", "Helm version")
command.Flags().BoolVar(&opts.helmPassCredentials, "helm-pass-credentials", false, "Pass credentials to all domain")
command.Flags().StringArrayVar(&opts.helmSets, "helm-set", []string{}, "Helm set values on the command line (can be repeated to set several values: --helm-set key1=val1 --helm-set key2=val2)")
command.Flags().StringArrayVar(&opts.helmSetStrings, "helm-set-string", []string{}, "Helm set STRING values on the command line (can be repeated to set several values: --helm-set-string key1=val1 --helm-set-string key2=val2)")
command.Flags().StringArrayVar(&opts.helmSetFiles, "helm-set-file", []string{}, "Helm set values from respective files specified via the command line (can be repeated to set several values: --helm-set-file key1=path1 --helm-set-file key2=path2)")
command.Flags().StringVar(&opts.project, "project", "", "Application project name")
command.Flags().StringVar(&opts.syncPolicy, "sync-policy", "", "Set the sync policy (one of: none, automated (aliases of automated: auto, automatic))")
command.Flags().StringArrayVar(&opts.syncOptions, "sync-option", []string{}, "Add or remove a sync option, e.g add `Prune=false`. Remove using `!` prefix, e.g. `!Prune=false`")
command.Flags().BoolVar(&opts.autoPrune, "auto-prune", false, "Set automatic pruning when sync is automated")
command.Flags().BoolVar(&opts.selfHeal, "self-heal", false, "Set self healing when sync is automated")
command.Flags().BoolVar(&opts.allowEmpty, "allow-empty", false, "Set allow zero live resources when sync is automated")
command.Flags().StringVar(&opts.namePrefix, "nameprefix", "", "Kustomize nameprefix")
command.Flags().StringVar(&opts.nameSuffix, "namesuffix", "", "Kustomize namesuffix")
command.Flags().StringVar(&opts.kustomizeVersion, "kustomize-version", "", "Kustomize version")
command.Flags().BoolVar(&opts.directoryRecurse, "directory-recurse", false, "Recurse directory")
command.Flags().StringVar(&opts.configManagementPlugin, "config-management-plugin", "", "Config management plugin name")
command.Flags().StringArrayVar(&opts.jsonnetTlaStr, "jsonnet-tla-str", []string{}, "Jsonnet top level string arguments")
command.Flags().StringArrayVar(&opts.jsonnetTlaCode, "jsonnet-tla-code", []string{}, "Jsonnet top level code arguments")
command.Flags().StringArrayVar(&opts.jsonnetExtVarStr, "jsonnet-ext-var-str", []string{}, "Jsonnet string ext var")
command.Flags().StringArrayVar(&opts.jsonnetExtVarCode, "jsonnet-ext-var-code", []string{}, "Jsonnet ext var")
command.Flags().StringArrayVar(&opts.jsonnetLibs, "jsonnet-libs", []string{}, "Additional jsonnet libs (prefixed by repoRoot)")
command.Flags().StringArrayVar(&opts.kustomizeImages, "kustomize-image", []string{}, "Kustomize images (e.g. --kustomize-image node:8.15.0 --kustomize-image mysql=mariadb,alpine@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d)")
command.Flags().StringArrayVar(&opts.pluginEnvs, "plugin-env", []string{}, "Additional plugin envs")
command.Flags().BoolVar(&opts.Validate, "validate", true, "Validation of repo and cluster")
command.Flags().StringArrayVar(&opts.kustomizeCommonLabels, "kustomize-common-label", []string{}, "Set common labels in Kustomize")
command.Flags().StringArrayVar(&opts.kustomizeCommonAnnotations, "kustomize-common-annotation", []string{}, "Set common labels in Kustomize")
command.Flags().BoolVar(&opts.kustomizeForceCommonLabels, "kustomize-force-common-label", false, "Force common labels in Kustomize")
command.Flags().BoolVar(&opts.kustomizeForceCommonAnnotations, "kustomize-force-common-annotation", false, "Force common annotations in Kustomize")
command.Flags().StringVar(&opts.directoryExclude, "directory-exclude", "", "Set glob expression used to exclude files from application source path")
command.Flags().StringVar(&opts.directoryInclude, "directory-include", "", "Set glob expression used to include files from application source path")
command.Flags().Int64Var(&opts.retryLimit, "sync-retry-limit", 0, "Max number of allowed sync retries")
command.Flags().DurationVar(&opts.retryBackoffDuration, "sync-retry-backoff-duration", argoappv1.DefaultSyncRetryDuration, "Sync retry backoff base duration. Input needs to be a duration (e.g. 2m, 1h)")
command.Flags().DurationVar(&opts.retryBackoffMaxDuration, "sync-retry-backoff-max-duration", argoappv1.DefaultSyncRetryMaxDuration, "Max sync retry backoff duration. Input needs to be a duration (e.g. 2m, 1h)")
command.Flags().Int64Var(&opts.retryBackoffFactor, "sync-retry-backoff-factor", argoappv1.DefaultSyncRetryFactor, "Factor multiplies the base duration after each failed sync retry")
}
func SetAppSpecOptions(flags *pflag.FlagSet, spec *argoappv1.ApplicationSpec, appOpts *AppOptions) int {
visited := 0
if flags == nil {
return visited
}
flags.Visit(func(f *pflag.Flag) {
visited++
switch f.Name {
case "repo":
spec.Source.RepoURL = appOpts.repoURL
case "path":
spec.Source.Path = appOpts.appPath
case "helm-chart":
spec.Source.Chart = appOpts.chart
case "env":
setKsonnetOpt(&spec.Source, &appOpts.env)
case "revision":
spec.Source.TargetRevision = appOpts.revision
case "revision-history-limit":
i := int64(appOpts.revisionHistoryLimit)
spec.RevisionHistoryLimit = &i
case "values":
setHelmOpt(&spec.Source, helmOpts{valueFiles: appOpts.valuesFiles})
case "values-literal-file":
var data []byte
// read uri
parsedURL, err := url.ParseRequestURI(appOpts.values)
if err != nil || !(parsedURL.Scheme == "http" || parsedURL.Scheme == "https") {
data, err = ioutil.ReadFile(appOpts.values)
} else {
data, err = config.ReadRemoteFile(appOpts.values)
}
errors.CheckError(err)
setHelmOpt(&spec.Source, helmOpts{values: string(data)})
case "release-name":
setHelmOpt(&spec.Source, helmOpts{releaseName: appOpts.releaseName})
case "helm-version":
setHelmOpt(&spec.Source, helmOpts{version: appOpts.helmVersion})
case "helm-pass-credentials":
setHelmOpt(&spec.Source, helmOpts{passCredentials: appOpts.helmPassCredentials})
case "helm-set":
setHelmOpt(&spec.Source, helmOpts{helmSets: appOpts.helmSets})
case "helm-set-string":
setHelmOpt(&spec.Source, helmOpts{helmSetStrings: appOpts.helmSetStrings})
case "helm-set-file":
setHelmOpt(&spec.Source, helmOpts{helmSetFiles: appOpts.helmSetFiles})
case "directory-recurse":
if spec.Source.Directory != nil {
spec.Source.Directory.Recurse = appOpts.directoryRecurse
} else {
spec.Source.Directory = &argoappv1.ApplicationSourceDirectory{Recurse: appOpts.directoryRecurse}
}
case "directory-exclude":
if spec.Source.Directory != nil {
spec.Source.Directory.Exclude = appOpts.directoryExclude
} else {
spec.Source.Directory = &argoappv1.ApplicationSourceDirectory{Exclude: appOpts.directoryExclude}
}
case "directory-include":
if spec.Source.Directory != nil {
spec.Source.Directory.Include = appOpts.directoryInclude
} else {
spec.Source.Directory = &argoappv1.ApplicationSourceDirectory{Include: appOpts.directoryInclude}
}
case "config-management-plugin":
spec.Source.Plugin = &argoappv1.ApplicationSourcePlugin{Name: appOpts.configManagementPlugin}
case "dest-name":
spec.Destination.Name = appOpts.destName
case "dest-server":
spec.Destination.Server = appOpts.destServer
case "dest-namespace":
spec.Destination.Namespace = appOpts.destNamespace
case "project":
spec.Project = appOpts.project
case "nameprefix":
setKustomizeOpt(&spec.Source, kustomizeOpts{namePrefix: appOpts.namePrefix})
case "namesuffix":
setKustomizeOpt(&spec.Source, kustomizeOpts{nameSuffix: appOpts.nameSuffix})
case "kustomize-image":
setKustomizeOpt(&spec.Source, kustomizeOpts{images: appOpts.kustomizeImages})
case "kustomize-version":
setKustomizeOpt(&spec.Source, kustomizeOpts{version: appOpts.kustomizeVersion})
case "kustomize-common-label":
parsedLabels, err := label.Parse(appOpts.kustomizeCommonLabels)
errors.CheckError(err)
setKustomizeOpt(&spec.Source, kustomizeOpts{commonLabels: parsedLabels})
case "kustomize-common-annotation":
parsedAnnotations, err := label.Parse(appOpts.kustomizeCommonAnnotations)
errors.CheckError(err)
setKustomizeOpt(&spec.Source, kustomizeOpts{commonAnnotations: parsedAnnotations})
case "kustomize-force-common-label":
setKustomizeOpt(&spec.Source, kustomizeOpts{forceCommonLabels: appOpts.kustomizeForceCommonLabels})
case "kustomize-force-common-annotation":
setKustomizeOpt(&spec.Source, kustomizeOpts{forceCommonAnnotations: appOpts.kustomizeForceCommonAnnotations})
case "jsonnet-tla-str":
setJsonnetOpt(&spec.Source, appOpts.jsonnetTlaStr, false)
case "jsonnet-tla-code":
setJsonnetOpt(&spec.Source, appOpts.jsonnetTlaCode, true)
case "jsonnet-ext-var-str":
setJsonnetOptExtVar(&spec.Source, appOpts.jsonnetExtVarStr, false)
case "jsonnet-ext-var-code":
setJsonnetOptExtVar(&spec.Source, appOpts.jsonnetExtVarCode, true)
case "jsonnet-libs":
setJsonnetOptLibs(&spec.Source, appOpts.jsonnetLibs)
case "plugin-env":
setPluginOptEnvs(&spec.Source, appOpts.pluginEnvs)
case "sync-policy":
switch appOpts.syncPolicy {
case "none":
if spec.SyncPolicy != nil {
spec.SyncPolicy.Automated = nil
}
if spec.SyncPolicy.IsZero() {
spec.SyncPolicy = nil
}
case "automated", "automatic", "auto":
if spec.SyncPolicy == nil {
spec.SyncPolicy = &argoappv1.SyncPolicy{}
}
spec.SyncPolicy.Automated = &argoappv1.SyncPolicyAutomated{}
default:
log.Fatalf("Invalid sync-policy: %s", appOpts.syncPolicy)
}
case "sync-option":
if spec.SyncPolicy == nil {
spec.SyncPolicy = &argoappv1.SyncPolicy{}
}
for _, option := range appOpts.syncOptions {
// `!` means remove the option
if strings.HasPrefix(option, "!") {
option = strings.TrimPrefix(option, "!")
spec.SyncPolicy.SyncOptions = spec.SyncPolicy.SyncOptions.RemoveOption(option)
} else {
spec.SyncPolicy.SyncOptions = spec.SyncPolicy.SyncOptions.AddOption(option)
}
}
if spec.SyncPolicy.IsZero() {
spec.SyncPolicy = nil
}
case "sync-retry-limit":
if appOpts.retryLimit > 0 {
if spec.SyncPolicy == nil {
spec.SyncPolicy = &argoappv1.SyncPolicy{}
}
spec.SyncPolicy.Retry = &argoappv1.RetryStrategy{
Limit: appOpts.retryLimit,
Backoff: &argoappv1.Backoff{
Duration: appOpts.retryBackoffDuration.String(),
MaxDuration: appOpts.retryBackoffMaxDuration.String(),
Factor: pointer.Int64Ptr(appOpts.retryBackoffFactor),
},
}
} else if appOpts.retryLimit == 0 {
if spec.SyncPolicy.IsZero() {
spec.SyncPolicy = nil
} else {
spec.SyncPolicy.Retry = nil
}
} else {
log.Fatalf("Invalid sync-retry-limit [%d]", appOpts.retryLimit)
}
}
})
if flags.Changed("auto-prune") {
if spec.SyncPolicy == nil || spec.SyncPolicy.Automated == nil {
log.Fatal("Cannot set --auto-prune: application not configured with automatic sync")
}
spec.SyncPolicy.Automated.Prune = appOpts.autoPrune
}
if flags.Changed("self-heal") {
if spec.SyncPolicy == nil || spec.SyncPolicy.Automated == nil {
log.Fatal("Cannot set --self-heal: application not configured with automatic sync")
}
spec.SyncPolicy.Automated.SelfHeal = appOpts.selfHeal
}
if flags.Changed("allow-empty") {
if spec.SyncPolicy == nil || spec.SyncPolicy.Automated == nil {
log.Fatal("Cannot set --allow-empty: application not configured with automatic sync")
}
spec.SyncPolicy.Automated.AllowEmpty = appOpts.allowEmpty
}
return visited
}
func setKsonnetOpt(src *argoappv1.ApplicationSource, env *string) {
if src.Ksonnet == nil {
src.Ksonnet = &argoappv1.ApplicationSourceKsonnet{}
}
if env != nil {
src.Ksonnet.Environment = *env
}
if src.Ksonnet.IsZero() {
src.Ksonnet = nil
}
}
type kustomizeOpts struct {
namePrefix string
nameSuffix string
images []string
version string
commonLabels map[string]string
commonAnnotations map[string]string
forceCommonLabels bool
forceCommonAnnotations bool
}
func setKustomizeOpt(src *argoappv1.ApplicationSource, opts kustomizeOpts) {
if src.Kustomize == nil {
src.Kustomize = &argoappv1.ApplicationSourceKustomize{}
}
if opts.version != "" {
src.Kustomize.Version = opts.version
}
if opts.namePrefix != "" {
src.Kustomize.NamePrefix = opts.namePrefix
}
if opts.nameSuffix != "" {
src.Kustomize.NameSuffix = opts.nameSuffix
}
if opts.commonLabels != nil {
src.Kustomize.CommonLabels = opts.commonLabels
}
if opts.commonAnnotations != nil {
src.Kustomize.CommonAnnotations = opts.commonAnnotations
}
if opts.forceCommonLabels {
src.Kustomize.ForceCommonLabels = opts.forceCommonLabels
}
if opts.forceCommonAnnotations {
src.Kustomize.ForceCommonAnnotations = opts.forceCommonAnnotations
}
for _, image := range opts.images {
src.Kustomize.MergeImage(argoappv1.KustomizeImage(image))
}
if src.Kustomize.IsZero() {
src.Kustomize = nil
}
}
func setPluginOptEnvs(src *argoappv1.ApplicationSource, envs []string) {
if src.Plugin == nil {
src.Plugin = &argoappv1.ApplicationSourcePlugin{}
}
for _, text := range envs {
e, err := argoappv1.NewEnvEntry(text)
if err != nil {
log.Fatal(err)
}
src.Plugin.AddEnvEntry(e)
}
}
type helmOpts struct {
valueFiles []string
values string
releaseName string
version string
helmSets []string
helmSetStrings []string
helmSetFiles []string
passCredentials bool
}
func setHelmOpt(src *argoappv1.ApplicationSource, opts helmOpts) {
if src.Helm == nil {
src.Helm = &argoappv1.ApplicationSourceHelm{}
}
if len(opts.valueFiles) > 0 {
src.Helm.ValueFiles = opts.valueFiles
}
if len(opts.values) > 0 {
src.Helm.Values = opts.values
}
if opts.releaseName != "" {
src.Helm.ReleaseName = opts.releaseName
}
if opts.version != "" {
src.Helm.Version = opts.version
}
if opts.passCredentials {
src.Helm.PassCredentials = opts.passCredentials
}
for _, text := range opts.helmSets {
p, err := argoappv1.NewHelmParameter(text, false)
if err != nil {
log.Fatal(err)
}
src.Helm.AddParameter(*p)
}
for _, text := range opts.helmSetStrings {
p, err := argoappv1.NewHelmParameter(text, true)
if err != nil {
log.Fatal(err)
}
src.Helm.AddParameter(*p)
}
for _, text := range opts.helmSetFiles {
p, err := argoappv1.NewHelmFileParameter(text)
if err != nil {
log.Fatal(err)
}
src.Helm.AddFileParameter(*p)
}
if src.Helm.IsZero() {
src.Helm = nil
}
}
func setJsonnetOpt(src *argoappv1.ApplicationSource, tlaParameters []string, code bool) {
if src.Directory == nil {
src.Directory = &argoappv1.ApplicationSourceDirectory{}
}
for _, j := range tlaParameters {
src.Directory.Jsonnet.TLAs = append(src.Directory.Jsonnet.TLAs, argoappv1.NewJsonnetVar(j, code))
}
}
func setJsonnetOptExtVar(src *argoappv1.ApplicationSource, jsonnetExtVar []string, code bool) {
if src.Directory == nil {
src.Directory = &argoappv1.ApplicationSourceDirectory{}
}
for _, j := range jsonnetExtVar {
src.Directory.Jsonnet.ExtVars = append(src.Directory.Jsonnet.ExtVars, argoappv1.NewJsonnetVar(j, code))
}
}
func setJsonnetOptLibs(src *argoappv1.ApplicationSource, libs []string) {
if src.Directory == nil {
src.Directory = &argoappv1.ApplicationSourceDirectory{}
}
src.Directory.Jsonnet.Libs = append(src.Directory.Jsonnet.Libs, libs...)
}
// SetParameterOverrides updates an existing or appends a new parameter override in the application
// If the app is a ksonnet app, then parameters are expected to be in the form: component=param=value
// Otherwise, the app is assumed to be a helm app and is expected to be in the form:
// param=value
func SetParameterOverrides(app *argoappv1.Application, parameters []string) {
if len(parameters) == 0 {
return
}
var sourceType argoappv1.ApplicationSourceType
if st, _ := app.Spec.Source.ExplicitType(); st != nil {
sourceType = *st
} else if app.Status.SourceType != "" {
sourceType = app.Status.SourceType
} else {
// HACK: we don't know the source type, so make an educated guess based on the supplied
// parameter string. This code handles the corner case where app doesn't exist yet, and the
// command is something like: `argocd app create MYAPP -p foo=bar`
// This logic is not foolproof, but when ksonnet is deprecated, this will no longer matter
// since helm will remain as the only source type which has parameters.
if len(strings.SplitN(parameters[0], "=", 3)) == 3 {
sourceType = argoappv1.ApplicationSourceTypeKsonnet
} else if len(strings.SplitN(parameters[0], "=", 2)) == 2 {
sourceType = argoappv1.ApplicationSourceTypeHelm
}
}
switch sourceType {
case argoappv1.ApplicationSourceTypeKsonnet:
if app.Spec.Source.Ksonnet == nil {
app.Spec.Source.Ksonnet = &argoappv1.ApplicationSourceKsonnet{}
}
for _, paramStr := range parameters {
parts := strings.SplitN(paramStr, "=", 3)
if len(parts) != 3 {
log.Fatalf("Expected ksonnet parameter of the form: component=param=value. Received: %s", paramStr)
}
newParam := argoappv1.KsonnetParameter{
Component: parts[0],
Name: parts[1],
Value: parts[2],
}
found := false
for i, cp := range app.Spec.Source.Ksonnet.Parameters {
if cp.Component == newParam.Component && cp.Name == newParam.Name {
found = true
app.Spec.Source.Ksonnet.Parameters[i] = newParam
break
}
}
if !found {
app.Spec.Source.Ksonnet.Parameters = append(app.Spec.Source.Ksonnet.Parameters, newParam)
}
}
case argoappv1.ApplicationSourceTypeHelm:
if app.Spec.Source.Helm == nil {
app.Spec.Source.Helm = &argoappv1.ApplicationSourceHelm{}
}
for _, p := range parameters {
newParam, err := argoappv1.NewHelmParameter(p, false)
if err != nil {
log.Error(err)
continue
}
app.Spec.Source.Helm.AddParameter(*newParam)
}
default:
log.Fatalf("Parameters can only be set against Ksonnet or Helm applications")
}
}
func readApps(yml []byte, apps *[]*argoappv1.Application) error {
yamls, _ := kube.SplitYAMLToString(yml)
var err error
for _, yml := range yamls {
var app argoappv1.Application
err = config.Unmarshal([]byte(yml), &app)
*apps = append(*apps, &app)
if err != nil {
return err
}
}
return err
}
func readAppsFromStdin(apps *[]*argoappv1.Application) error {
reader := bufio.NewReader(os.Stdin)
data, err := ioutil.ReadAll(reader)
if err != nil {
return err
}
err = readApps(data, apps)
if err != nil {
return fmt.Errorf("unable to read manifest from stdin: %v", err)
}
return nil
}
func readAppsFromURI(fileURL string, apps *[]*argoappv1.Application) error {
readFilePayload := func() ([]byte, error) {
parsedURL, err := url.ParseRequestURI(fileURL)
if err != nil || !(parsedURL.Scheme == "http" || parsedURL.Scheme == "https") {
return ioutil.ReadFile(fileURL)
}
return config.ReadRemoteFile(fileURL)
}
yml, err := readFilePayload()
if err != nil {
return err
}
return readApps(yml, apps)
}
func constructAppsFromStdin() ([]*argoappv1.Application, error) {
apps := make([]*argoappv1.Application, 0)
// read stdin
err := readAppsFromStdin(&apps)
if err != nil {
return nil, err
}
return apps, nil
}
func constructAppsBaseOnName(appName string, labels, annotations, args []string, appOpts AppOptions, flags *pflag.FlagSet) ([]*argoappv1.Application, error) {
var app *argoappv1.Application
// read arguments
if len(args) == 1 {
if appName != "" && appName != args[0] {
return nil, fmt.Errorf("--name argument '%s' does not match app name %s", appName, args[0])
}
appName = args[0]
}
app = &argoappv1.Application{
TypeMeta: v1.TypeMeta{
Kind: application.ApplicationKind,
APIVersion: application.Group + "/v1alpha1",
},
ObjectMeta: v1.ObjectMeta{
Name: appName,
},
}
SetAppSpecOptions(flags, &app.Spec, &appOpts)
SetParameterOverrides(app, appOpts.Parameters)
mergeLabels(app, labels)
setAnnotations(app, annotations)
return []*argoappv1.Application{
app,
}, nil
}
func constructAppsFromFileUrl(fileURL, appName string, labels, annotations, args []string, appOpts AppOptions, flags *pflag.FlagSet) ([]*argoappv1.Application, error) {
apps := make([]*argoappv1.Application, 0)
// read uri
err := readAppsFromURI(fileURL, &apps)
if err != nil {
return nil, err
}
for _, app := range apps {
if len(args) == 1 && args[0] != app.Name {
return nil, fmt.Errorf("app name '%s' does not match app spec metadata.name '%s'", args[0], app.Name)
}
if appName != "" && appName != app.Name {
app.Name = appName
}
if app.Name == "" {
return nil, fmt.Errorf("app.Name is empty. --name argument can be used to provide app.Name")
}
SetAppSpecOptions(flags, &app.Spec, &appOpts)
SetParameterOverrides(app, appOpts.Parameters)
mergeLabels(app, labels)
setAnnotations(app, annotations)
}
return apps, nil
}
func ConstructApps(fileURL, appName string, labels, annotations, args []string, appOpts AppOptions, flags *pflag.FlagSet) ([]*argoappv1.Application, error) {
if fileURL == "-" {
return constructAppsFromStdin()
} else if fileURL != "" {
return constructAppsFromFileUrl(fileURL, appName, labels, annotations, args, appOpts, flags)
}
return constructAppsBaseOnName(appName, labels, annotations, args, appOpts, flags)
}
func mergeLabels(app *argoappv1.Application, labels []string) {
mapLabels, err := label.Parse(labels)
errors.CheckError(err)
mergedLabels := make(map[string]string)
for name, value := range app.GetLabels() {
mergedLabels[name] = value
}
for name, value := range mapLabels {
mergedLabels[name] = value
}
app.SetLabels(mergedLabels)
}
func setAnnotations(app *argoappv1.Application, annotations []string) {
if len(annotations) > 0 && app.Annotations == nil {
app.Annotations = map[string]string{}
}
for _, a := range annotations {
annotation := strings.SplitN(a, "=", 2)
if len(annotation) == 2 {
app.Annotations[annotation[0]] = annotation[1]
} else {
app.Annotations[annotation[0]] = ""
}
}
}

304
cmd/util/app_test.go Normal file
View File

@@ -0,0 +1,304 @@
package util
import (
"io/ioutil"
"os"
"testing"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
argoappv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
)
func Test_setHelmOpt(t *testing.T) {
t.Run("Zero", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{})
assert.Nil(t, src.Helm)
})
t.Run("ValueFiles", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{valueFiles: []string{"foo"}})
assert.Equal(t, []string{"foo"}, src.Helm.ValueFiles)
})
t.Run("ReleaseName", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{releaseName: "foo"})
assert.Equal(t, "foo", src.Helm.ReleaseName)
})
t.Run("HelmSets", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{helmSets: []string{"foo=bar"}})
assert.Equal(t, []v1alpha1.HelmParameter{{Name: "foo", Value: "bar"}}, src.Helm.Parameters)
})
t.Run("HelmSetStrings", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{helmSetStrings: []string{"foo=bar"}})
assert.Equal(t, []v1alpha1.HelmParameter{{Name: "foo", Value: "bar", ForceString: true}}, src.Helm.Parameters)
})
t.Run("HelmSetFiles", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{helmSetFiles: []string{"foo=bar"}})
assert.Equal(t, []v1alpha1.HelmFileParameter{{Name: "foo", Path: "bar"}}, src.Helm.FileParameters)
})
t.Run("Version", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{version: "v3"})
assert.Equal(t, "v3", src.Helm.Version)
})
t.Run("HelmPassCredentials", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setHelmOpt(&src, helmOpts{passCredentials: true})
assert.Equal(t, true, src.Helm.PassCredentials)
})
}
func Test_setKustomizeOpt(t *testing.T) {
t.Run("No kustomize", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{})
assert.Nil(t, src.Kustomize)
})
t.Run("Name prefix", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{namePrefix: "test-"})
assert.Equal(t, &v1alpha1.ApplicationSourceKustomize{NamePrefix: "test-"}, src.Kustomize)
})
t.Run("Name suffix", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{nameSuffix: "-test"})
assert.Equal(t, &v1alpha1.ApplicationSourceKustomize{NameSuffix: "-test"}, src.Kustomize)
})
t.Run("Images", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{images: []string{"org/image:v1", "org/image:v2"}})
assert.Equal(t, &v1alpha1.ApplicationSourceKustomize{Images: v1alpha1.KustomizeImages{v1alpha1.KustomizeImage("org/image:v2")}}, src.Kustomize)
})
t.Run("Version", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{version: "v0.1"})
assert.Equal(t, &v1alpha1.ApplicationSourceKustomize{Version: "v0.1"}, src.Kustomize)
})
t.Run("Common labels", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{commonLabels: map[string]string{"foo1": "bar1", "foo2": "bar2"}})
assert.Equal(t, &v1alpha1.ApplicationSourceKustomize{CommonLabels: map[string]string{"foo1": "bar1", "foo2": "bar2"}}, src.Kustomize)
})
t.Run("Common annotations", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setKustomizeOpt(&src, kustomizeOpts{commonAnnotations: map[string]string{"foo1": "bar1", "foo2": "bar2"}})
assert.Equal(t, &v1alpha1.ApplicationSourceKustomize{CommonAnnotations: map[string]string{"foo1": "bar1", "foo2": "bar2"}}, src.Kustomize)
})
}
func Test_setJsonnetOpt(t *testing.T) {
t.Run("TlaSets", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setJsonnetOpt(&src, []string{"foo=bar"}, false)
assert.Equal(t, []v1alpha1.JsonnetVar{{Name: "foo", Value: "bar"}}, src.Directory.Jsonnet.TLAs)
setJsonnetOpt(&src, []string{"bar=baz"}, false)
assert.Equal(t, []v1alpha1.JsonnetVar{{Name: "foo", Value: "bar"}, {Name: "bar", Value: "baz"}}, src.Directory.Jsonnet.TLAs)
})
t.Run("ExtSets", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setJsonnetOptExtVar(&src, []string{"foo=bar"}, false)
assert.Equal(t, []v1alpha1.JsonnetVar{{Name: "foo", Value: "bar"}}, src.Directory.Jsonnet.ExtVars)
setJsonnetOptExtVar(&src, []string{"bar=baz"}, false)
assert.Equal(t, []v1alpha1.JsonnetVar{{Name: "foo", Value: "bar"}, {Name: "bar", Value: "baz"}}, src.Directory.Jsonnet.ExtVars)
})
}
func Test_setPluginOptEnvs(t *testing.T) {
t.Run("PluginEnvs", func(t *testing.T) {
src := v1alpha1.ApplicationSource{}
setPluginOptEnvs(&src, []string{"FOO=bar"})
assert.Equal(t, v1alpha1.EnvEntry{Name: "FOO", Value: "bar"}, *src.Plugin.Env[0])
setPluginOptEnvs(&src, []string{"BAR=baz"})
assert.Equal(t, v1alpha1.EnvEntry{Name: "BAR", Value: "baz"}, *src.Plugin.Env[1])
setPluginOptEnvs(&src, []string{"FOO=baz"})
assert.Equal(t, v1alpha1.EnvEntry{Name: "FOO", Value: "baz"}, *src.Plugin.Env[0])
})
}
type appOptionsFixture struct {
spec *v1alpha1.ApplicationSpec
command *cobra.Command
options *AppOptions
}
func (f *appOptionsFixture) SetFlag(key, value string) error {
err := f.command.Flags().Set(key, value)
if err != nil {
return err
}
_ = SetAppSpecOptions(f.command.Flags(), f.spec, f.options)
return err
}
func newAppOptionsFixture() *appOptionsFixture {
fixture := &appOptionsFixture{
spec: &v1alpha1.ApplicationSpec{},
command: &cobra.Command{},
options: &AppOptions{},
}
AddAppFlags(fixture.command, fixture.options)
return fixture
}
func Test_setAppSpecOptions(t *testing.T) {
f := newAppOptionsFixture()
t.Run("SyncPolicy", func(t *testing.T) {
assert.NoError(t, f.SetFlag("sync-policy", "automated"))
assert.NotNil(t, f.spec.SyncPolicy.Automated)
f.spec.SyncPolicy = nil
assert.NoError(t, f.SetFlag("sync-policy", "automatic"))
assert.NotNil(t, f.spec.SyncPolicy.Automated)
f.spec.SyncPolicy = nil
assert.NoError(t, f.SetFlag("sync-policy", "auto"))
assert.NotNil(t, f.spec.SyncPolicy.Automated)
assert.NoError(t, f.SetFlag("sync-policy", "none"))
assert.Nil(t, f.spec.SyncPolicy)
})
t.Run("SyncOptions", func(t *testing.T) {
assert.NoError(t, f.SetFlag("sync-option", "a=1"))
assert.True(t, f.spec.SyncPolicy.SyncOptions.HasOption("a=1"))
// remove the options using !
assert.NoError(t, f.SetFlag("sync-option", "!a=1"))
assert.Nil(t, f.spec.SyncPolicy)
})
t.Run("RetryLimit", func(t *testing.T) {
assert.NoError(t, f.SetFlag("sync-retry-limit", "5"))
assert.True(t, f.spec.SyncPolicy.Retry.Limit == 5)
assert.NoError(t, f.SetFlag("sync-retry-limit", "0"))
assert.Nil(t, f.spec.SyncPolicy.Retry)
})
}
func Test_setAnnotations(t *testing.T) {
t.Run("Annotations", func(t *testing.T) {
app := v1alpha1.Application{}
setAnnotations(&app, []string{"hoge=foo", "huga=bar"})
assert.Equal(t, map[string]string{"hoge": "foo", "huga": "bar"}, app.Annotations)
})
t.Run("Annotations value contains equal", func(t *testing.T) {
app := v1alpha1.Application{}
setAnnotations(&app, []string{"hoge=foo=bar"})
assert.Equal(t, map[string]string{"hoge": "foo=bar"}, app.Annotations)
})
t.Run("Annotations empty value", func(t *testing.T) {
app := v1alpha1.Application{}
setAnnotations(&app, []string{"hoge"})
assert.Equal(t, map[string]string{"hoge": ""}, app.Annotations)
})
}
const appsYaml = `---
# Source: apps/templates/helm.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sth1
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
destination:
namespace: sth
server: 'https://kubernetes.default.svc'
project: default
source:
repoURL: 'https://github.com/pasha-codefresh/argocd-example-apps'
targetRevision: HEAD
path: apps
helm:
valueFiles:
- values.yaml
---
# Source: apps/templates/helm.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sth2
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
destination:
namespace: sth
server: 'https://kubernetes.default.svc'
project: default
source:
repoURL: 'https://github.com/pasha-codefresh/argocd-example-apps'
targetRevision: HEAD
path: apps
helm:
valueFiles:
- values.yaml`
func TestReadAppsFromURI(t *testing.T) {
file, err := ioutil.TempFile(os.TempDir(), "")
if err != nil {
panic(err)
}
defer func() {
_ = os.Remove(file.Name())
}()
_, _ = file.WriteString(appsYaml)
_ = file.Sync()
apps := make([]*argoappv1.Application, 0)
err = readAppsFromURI(file.Name(), &apps)
assert.NoError(t, err)
assert.Equal(t, 2, len(apps))
assert.Equal(t, "sth1", apps[0].Name)
assert.Equal(t, "sth2", apps[1].Name)
}
func TestConstructAppFromStdin(t *testing.T) {
file, err := ioutil.TempFile(os.TempDir(), "")
if err != nil {
panic(err)
}
defer func() {
_ = os.Remove(file.Name())
}()
_, _ = file.WriteString(appsYaml)
_ = file.Sync()
if _, err := file.Seek(0, 0); err != nil {
log.Fatal(err)
}
os.Stdin = file
apps, err := ConstructApps("-", "test", []string{}, []string{}, []string{}, AppOptions{}, nil)
if err := file.Close(); err != nil {
log.Fatal(err)
}
assert.NoError(t, err)
assert.Equal(t, 2, len(apps))
assert.Equal(t, "sth1", apps[0].Name)
assert.Equal(t, "sth2", apps[1].Name)
}
func TestConstructBasedOnName(t *testing.T) {
apps, err := ConstructApps("", "test", []string{}, []string{}, []string{}, AppOptions{}, nil)
assert.NoError(t, err)
assert.Equal(t, 1, len(apps))
assert.Equal(t, "test", apps[0].Name)
}

139
cmd/util/cluster.go Normal file
View File

@@ -0,0 +1,139 @@
package util
import (
"fmt"
"io/ioutil"
"os"
"sort"
"strings"
"text/tabwriter"
"github.com/spf13/cobra"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
argoappv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/errors"
)
func PrintKubeContexts(ca clientcmd.ConfigAccess) {
config, err := ca.GetStartingConfig()
errors.CheckError(err)
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
defer func() { _ = w.Flush() }()
columnNames := []string{"CURRENT", "NAME", "CLUSTER", "SERVER"}
_, err = fmt.Fprintf(w, "%s\n", strings.Join(columnNames, "\t"))
errors.CheckError(err)
// sort names so output is deterministic
contextNames := make([]string, 0)
for name := range config.Contexts {
contextNames = append(contextNames, name)
}
sort.Strings(contextNames)
if config.Clusters == nil {
return
}
for _, name := range contextNames {
// ignore malformed kube config entries
context := config.Contexts[name]
if context == nil {
continue
}
cluster := config.Clusters[context.Cluster]
if cluster == nil {
continue
}
prefix := " "
if config.CurrentContext == name {
prefix = "*"
}
_, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", prefix, name, context.Cluster, cluster.Server)
errors.CheckError(err)
}
}
func NewCluster(name string, namespaces []string, clusterResources bool, conf *rest.Config, managerBearerToken string, awsAuthConf *argoappv1.AWSAuthConfig, execProviderConf *argoappv1.ExecProviderConfig, labels, annotations map[string]string) *argoappv1.Cluster {
tlsClientConfig := argoappv1.TLSClientConfig{
Insecure: conf.TLSClientConfig.Insecure,
ServerName: conf.TLSClientConfig.ServerName,
CAData: conf.TLSClientConfig.CAData,
CertData: conf.TLSClientConfig.CertData,
KeyData: conf.TLSClientConfig.KeyData,
}
if len(conf.TLSClientConfig.CAData) == 0 && conf.TLSClientConfig.CAFile != "" {
data, err := ioutil.ReadFile(conf.TLSClientConfig.CAFile)
errors.CheckError(err)
tlsClientConfig.CAData = data
}
if len(conf.TLSClientConfig.CertData) == 0 && conf.TLSClientConfig.CertFile != "" {
data, err := ioutil.ReadFile(conf.TLSClientConfig.CertFile)
errors.CheckError(err)
tlsClientConfig.CertData = data
}
if len(conf.TLSClientConfig.KeyData) == 0 && conf.TLSClientConfig.KeyFile != "" {
data, err := ioutil.ReadFile(conf.TLSClientConfig.KeyFile)
errors.CheckError(err)
tlsClientConfig.KeyData = data
}
clst := argoappv1.Cluster{
Server: conf.Host,
Name: name,
Namespaces: namespaces,
ClusterResources: clusterResources,
Config: argoappv1.ClusterConfig{
TLSClientConfig: tlsClientConfig,
AWSAuthConfig: awsAuthConf,
ExecProviderConfig: execProviderConf,
},
Labels: labels,
Annotations: annotations,
}
// Bearer token will preferentially be used for auth if present,
// Even in presence of key/cert credentials
// So set bearer token only if the key/cert data is absent
if len(tlsClientConfig.CertData) == 0 || len(tlsClientConfig.KeyData) == 0 {
clst.Config.BearerToken = managerBearerToken
}
return &clst
}
type ClusterOptions struct {
InCluster bool
Upsert bool
ServiceAccount string
AwsRoleArn string
AwsClusterName string
SystemNamespace string
Namespaces []string
ClusterResources bool
Name string
Project string
Shard int64
ExecProviderCommand string
ExecProviderArgs []string
ExecProviderEnv map[string]string
ExecProviderAPIVersion string
ExecProviderInstallHint string
}
func AddClusterFlags(command *cobra.Command, opts *ClusterOptions) {
command.Flags().BoolVar(&opts.InCluster, "in-cluster", false, "Indicates Argo CD resides inside this cluster and should connect using the internal k8s hostname (kubernetes.default.svc)")
command.Flags().StringVar(&opts.AwsClusterName, "aws-cluster-name", "", "AWS Cluster name if set then aws cli eks token command will be used to access cluster")
command.Flags().StringVar(&opts.AwsRoleArn, "aws-role-arn", "", "Optional AWS role arn. If set then AWS IAM Authenticator assumes a role to perform cluster operations instead of the default AWS credential provider chain.")
command.Flags().StringArrayVar(&opts.Namespaces, "namespace", nil, "List of namespaces which are allowed to manage")
command.Flags().BoolVar(&opts.ClusterResources, "cluster-resources", false, "Indicates if cluster level resources should be managed. The setting is used only if list of managed namespaces is not empty.")
command.Flags().StringVar(&opts.Name, "name", "", "Overwrite the cluster name")
command.Flags().StringVar(&opts.Project, "project", "", "project of the cluster")
command.Flags().Int64Var(&opts.Shard, "shard", -1, "Cluster shard number; inferred from hostname if not set")
command.Flags().StringVar(&opts.ExecProviderCommand, "exec-command", "", "Command to run to provide client credentials to the cluster. You may need to build a custom ArgoCD image to ensure the command is available at runtime.")
command.Flags().StringArrayVar(&opts.ExecProviderArgs, "exec-command-args", nil, "Arguments to supply to the --exec-command executable")
command.Flags().StringToStringVar(&opts.ExecProviderEnv, "exec-command-env", nil, "Environment vars to set when running the --exec-command executable")
command.Flags().StringVar(&opts.ExecProviderAPIVersion, "exec-command-api-version", "", "Preferred input version of the ExecInfo for the --exec-command executable")
command.Flags().StringVar(&opts.ExecProviderInstallHint, "exec-command-install-hint", "", "Text shown to the user when the --exec-command executable doesn't seem to be present")
}

71
cmd/util/cluster_test.go Normal file
View File

@@ -0,0 +1,71 @@
package util
import (
"strings"
"testing"
"github.com/stretchr/testify/assert"
"k8s.io/client-go/rest"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
)
func Test_newCluster(t *testing.T) {
labels := map[string]string{"key1": "val1"}
annotations := map[string]string{"key2": "val2"}
clusterWithData := NewCluster("test-cluster", []string{"test-namespace"}, false, &rest.Config{
TLSClientConfig: rest.TLSClientConfig{
Insecure: false,
ServerName: "test-endpoint.example.com",
CAData: []byte("test-ca-data"),
CertData: []byte("test-cert-data"),
KeyData: []byte("test-key-data"),
},
Host: "test-endpoint.example.com",
},
"test-bearer-token",
&v1alpha1.AWSAuthConfig{},
&v1alpha1.ExecProviderConfig{}, labels, annotations)
assert.Equal(t, "test-cert-data", string(clusterWithData.Config.CertData))
assert.Equal(t, "test-key-data", string(clusterWithData.Config.KeyData))
assert.Equal(t, "", clusterWithData.Config.BearerToken)
assert.Equal(t, labels, clusterWithData.Labels)
assert.Equal(t, annotations, clusterWithData.Annotations)
clusterWithFiles := NewCluster("test-cluster", []string{"test-namespace"}, false, &rest.Config{
TLSClientConfig: rest.TLSClientConfig{
Insecure: false,
ServerName: "test-endpoint.example.com",
CAData: []byte("test-ca-data"),
CertFile: "./testdata/test.cert.pem",
KeyFile: "./testdata/test.key.pem",
},
Host: "test-endpoint.example.com",
},
"test-bearer-token",
&v1alpha1.AWSAuthConfig{},
&v1alpha1.ExecProviderConfig{}, labels, nil)
assert.True(t, strings.Contains(string(clusterWithFiles.Config.CertData), "test-cert-data"))
assert.True(t, strings.Contains(string(clusterWithFiles.Config.KeyData), "test-key-data"))
assert.Equal(t, "", clusterWithFiles.Config.BearerToken)
assert.Equal(t, labels, clusterWithFiles.Labels)
assert.Nil(t, clusterWithFiles.Annotations)
clusterWithBearerToken := NewCluster("test-cluster", []string{"test-namespace"}, false, &rest.Config{
TLSClientConfig: rest.TLSClientConfig{
Insecure: false,
ServerName: "test-endpoint.example.com",
CAData: []byte("test-ca-data"),
},
Host: "test-endpoint.example.com",
},
"test-bearer-token",
&v1alpha1.AWSAuthConfig{},
&v1alpha1.ExecProviderConfig{}, nil, nil)
assert.Equal(t, "test-bearer-token", clusterWithBearerToken.Config.BearerToken)
assert.Nil(t, clusterWithBearerToken.Labels)
assert.Nil(t, clusterWithBearerToken.Annotations)
}

6
cmd/util/common.go Normal file
View File

@@ -0,0 +1,6 @@
package util
var (
LogFormat string
LogLevel string
)

202
cmd/util/project.go Normal file
View File

@@ -0,0 +1,202 @@
package util
import (
"bufio"
"fmt"
"log"
"net/url"
"os"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
"github.com/argoproj/argo-cd/v2/pkg/apis/application"
"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
"github.com/argoproj/argo-cd/v2/util/config"
"github.com/argoproj/argo-cd/v2/util/gpg"
)
type ProjectOpts struct {
Description string
destinations []string
Sources []string
SignatureKeys []string
orphanedResourcesEnabled bool
orphanedResourcesWarn bool
allowedClusterResources []string
deniedClusterResources []string
allowedNamespacedResources []string
deniedNamespacedResources []string
}
func AddProjFlags(command *cobra.Command, opts *ProjectOpts) {
command.Flags().StringVarP(&opts.Description, "description", "", "", "Project description")
command.Flags().StringArrayVarP(&opts.destinations, "dest", "d", []string{},
"Permitted destination server and namespace (e.g. https://192.168.99.100:8443,default)")
command.Flags().StringArrayVarP(&opts.Sources, "src", "s", []string{}, "Permitted source repository URL")
command.Flags().StringSliceVar(&opts.SignatureKeys, "signature-keys", []string{}, "GnuPG public key IDs for commit signature verification")
command.Flags().BoolVar(&opts.orphanedResourcesEnabled, "orphaned-resources", false, "Enables orphaned resources monitoring")
command.Flags().BoolVar(&opts.orphanedResourcesWarn, "orphaned-resources-warn", false, "Specifies if applications should have a warning condition when orphaned resources detected")
command.Flags().StringArrayVar(&opts.allowedClusterResources, "allow-cluster-resource", []string{}, "List of allowed cluster level resources")
command.Flags().StringArrayVar(&opts.deniedClusterResources, "deny-cluster-resource", []string{}, "List of denied cluster level resources")
command.Flags().StringArrayVar(&opts.allowedNamespacedResources, "allow-namespaced-resource", []string{}, "List of allowed namespaced resources")
command.Flags().StringArrayVar(&opts.deniedNamespacedResources, "deny-namespaced-resource", []string{}, "List of denied namespaced resources")
}
func getGroupKindList(values []string) []v1.GroupKind {
var res []v1.GroupKind
for _, val := range values {
if parts := strings.Split(val, "/"); len(parts) == 2 {
res = append(res, v1.GroupKind{Group: parts[0], Kind: parts[1]})
} else if len(parts) == 1 {
res = append(res, v1.GroupKind{Kind: parts[0]})
}
}
return res
}
func (opts *ProjectOpts) GetAllowedClusterResources() []v1.GroupKind {
return getGroupKindList(opts.allowedClusterResources)
}
func (opts *ProjectOpts) GetDeniedClusterResources() []v1.GroupKind {
return getGroupKindList(opts.deniedClusterResources)
}
func (opts *ProjectOpts) GetAllowedNamespacedResources() []v1.GroupKind {
return getGroupKindList(opts.allowedNamespacedResources)
}
func (opts *ProjectOpts) GetDeniedNamespacedResources() []v1.GroupKind {
return getGroupKindList(opts.deniedNamespacedResources)
}
func (opts *ProjectOpts) GetDestinations() []v1alpha1.ApplicationDestination {
destinations := make([]v1alpha1.ApplicationDestination, 0)
for _, destStr := range opts.destinations {
parts := strings.Split(destStr, ",")
if len(parts) != 2 {
log.Fatalf("Expected destination of the form: server,namespace. Received: %s", destStr)
} else {
destinations = append(destinations, v1alpha1.ApplicationDestination{
Server: parts[0],
Namespace: parts[1],
})
}
}
return destinations
}
// TODO: Get configured keys and emit warning when a key is specified that is not configured
func (opts *ProjectOpts) GetSignatureKeys() []v1alpha1.SignatureKey {
signatureKeys := make([]v1alpha1.SignatureKey, 0)
for _, keyStr := range opts.SignatureKeys {
if !gpg.IsShortKeyID(keyStr) && !gpg.IsLongKeyID(keyStr) {
log.Fatalf("'%s' is not a valid GnuPG key ID", keyStr)
}
signatureKeys = append(signatureKeys, v1alpha1.SignatureKey{KeyID: gpg.KeyID(keyStr)})
}
return signatureKeys
}
func GetOrphanedResourcesSettings(flagSet *pflag.FlagSet, opts ProjectOpts) *v1alpha1.OrphanedResourcesMonitorSettings {
warnChanged := flagSet.Changed("orphaned-resources-warn")
if opts.orphanedResourcesEnabled || warnChanged {
settings := v1alpha1.OrphanedResourcesMonitorSettings{}
if warnChanged {
settings.Warn = pointer.BoolPtr(opts.orphanedResourcesWarn)
}
return &settings
}
return nil
}
func readProjFromStdin(proj *v1alpha1.AppProject) error {
reader := bufio.NewReader(os.Stdin)
err := config.UnmarshalReader(reader, &proj)
if err != nil {
return fmt.Errorf("unable to read manifest from stdin: %v", err)
}
return nil
}
func readProjFromURI(fileURL string, proj *v1alpha1.AppProject) error {
parsedURL, err := url.ParseRequestURI(fileURL)
if err != nil || !(parsedURL.Scheme == "http" || parsedURL.Scheme == "https") {
err = config.UnmarshalLocalFile(fileURL, &proj)
} else {
err = config.UnmarshalRemoteFile(fileURL, &proj)
}
return err
}
func SetProjSpecOptions(flags *pflag.FlagSet, spec *v1alpha1.AppProjectSpec, projOpts *ProjectOpts) int {
visited := 0
flags.Visit(func(f *pflag.Flag) {
visited++
switch f.Name {
case "description":
spec.Description = projOpts.Description
case "dest":
spec.Destinations = projOpts.GetDestinations()
case "src":
spec.SourceRepos = projOpts.Sources
case "signature-keys":
spec.SignatureKeys = projOpts.GetSignatureKeys()
case "allow-cluster-resource":
spec.ClusterResourceWhitelist = projOpts.GetAllowedClusterResources()
case "deny-cluster-resource":
spec.ClusterResourceBlacklist = projOpts.GetDeniedClusterResources()
case "allow-namespaced-resource":
spec.NamespaceResourceWhitelist = projOpts.GetAllowedNamespacedResources()
case "deny-namespaced-resource":
spec.NamespaceResourceBlacklist = projOpts.GetDeniedNamespacedResources()
}
})
if flags.Changed("orphaned-resources") || flags.Changed("orphaned-resources-warn") {
spec.OrphanedResources = GetOrphanedResourcesSettings(flags, *projOpts)
visited++
}
return visited
}
func ConstructAppProj(fileURL string, args []string, opts ProjectOpts, c *cobra.Command) (*v1alpha1.AppProject, error) {
var proj = v1alpha1.AppProject{
TypeMeta: v1.TypeMeta{
Kind: application.AppProjectKind,
APIVersion: application.Group + "/v1alpha1",
},
}
if fileURL == "-" {
// read stdin
err := readProjFromStdin(&proj)
if err != nil {
return nil, err
}
} else if fileURL != "" {
// read uri
err := readProjFromURI(fileURL, &proj)
if err != nil {
return nil, err
}
if len(args) == 1 && args[0] != proj.Name {
return nil, fmt.Errorf("project name '%s' does not match project spec metadata.name '%s'", args[0], proj.Name)
}
} else {
// read arguments
if len(args) == 0 {
c.HelpFunc()(c, args)
os.Exit(1)
}
proj.Name = args[0]
}
SetProjSpecOptions(c.Flags(), &proj.Spec, &opts)
return &proj, nil
}

24
cmd/util/project_test.go Normal file
View File

@@ -0,0 +1,24 @@
package util
import (
"testing"
"github.com/stretchr/testify/assert"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func TestProjectOpts_ResourceLists(t *testing.T) {
opts := ProjectOpts{
allowedNamespacedResources: []string{"ConfigMap"},
deniedNamespacedResources: []string{"apps/DaemonSet"},
allowedClusterResources: []string{"apiextensions.k8s.io/CustomResourceDefinition"},
deniedClusterResources: []string{"rbac.authorization.k8s.io/ClusterRole"},
}
assert.ElementsMatch(t,
[]v1.GroupKind{{Kind: "ConfigMap"}}, opts.GetAllowedNamespacedResources(),
[]v1.GroupKind{{Group: "apps", Kind: "DaemonSet"}}, opts.GetDeniedNamespacedResources(),
[]v1.GroupKind{{Group: "apiextensions.k8s.io", Kind: "CustomResourceDefinition"}}, opts.GetAllowedClusterResources(),
[]v1.GroupKind{{Group: "rbac.authorization.k8s.io", Kind: "ClusterRole"}}, opts.GetDeniedClusterResources(),
)
}

45
cmd/util/repo.go Normal file
View File

@@ -0,0 +1,45 @@
package util
import (
"github.com/spf13/cobra"
"github.com/argoproj/argo-cd/v2/common"
appsv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
)
type RepoOptions struct {
Repo appsv1.Repository
Upsert bool
SshPrivateKeyPath string
InsecureIgnoreHostKey bool
InsecureSkipServerVerification bool
TlsClientCertPath string
TlsClientCertKeyPath string
EnableLfs bool
EnableOci bool
GithubAppId int64
GithubAppInstallationId int64
GithubAppPrivateKeyPath string
GitHubAppEnterpriseBaseURL string
Proxy string
}
func AddRepoFlags(command *cobra.Command, opts *RepoOptions) {
command.Flags().StringVar(&opts.Repo.Type, "type", common.DefaultRepoType, "type of the repository, \"git\" or \"helm\"")
command.Flags().StringVar(&opts.Repo.Name, "name", "", "name of the repository, mandatory for repositories of type helm")
command.Flags().StringVar(&opts.Repo.Project, "project", "", "project of the repository")
command.Flags().StringVar(&opts.Repo.Username, "username", "", "username to the repository")
command.Flags().StringVar(&opts.Repo.Password, "password", "", "password to the repository")
command.Flags().StringVar(&opts.SshPrivateKeyPath, "ssh-private-key-path", "", "path to the private ssh key (e.g. ~/.ssh/id_rsa)")
command.Flags().StringVar(&opts.TlsClientCertPath, "tls-client-cert-path", "", "path to the TLS client cert (must be PEM format)")
command.Flags().StringVar(&opts.TlsClientCertKeyPath, "tls-client-cert-key-path", "", "path to the TLS client cert's key path (must be PEM format)")
command.Flags().BoolVar(&opts.InsecureIgnoreHostKey, "insecure-ignore-host-key", false, "disables SSH strict host key checking (deprecated, use --insecure-skip-server-verification instead)")
command.Flags().BoolVar(&opts.InsecureSkipServerVerification, "insecure-skip-server-verification", false, "disables server certificate and host key checks")
command.Flags().BoolVar(&opts.EnableLfs, "enable-lfs", false, "enable git-lfs (Large File Support) on this repository")
command.Flags().BoolVar(&opts.EnableOci, "enable-oci", false, "enable helm-oci (Helm OCI-Based Repository)")
command.Flags().Int64Var(&opts.GithubAppId, "github-app-id", 0, "id of the GitHub Application")
command.Flags().Int64Var(&opts.GithubAppInstallationId, "github-app-installation-id", 0, "installation id of the GitHub Application")
command.Flags().StringVar(&opts.GithubAppPrivateKeyPath, "github-app-private-key-path", "", "private key of the GitHub Application")
command.Flags().StringVar(&opts.GitHubAppEnterpriseBaseURL, "github-app-enterprise-base-url", "", "base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3")
command.Flags().StringVar(&opts.Proxy, "proxy", "", "use proxy to access repository")
}

3
cmd/util/testdata/test.cert.pem vendored Normal file
View File

@@ -0,0 +1,3 @@
-----BEGIN CERTIFICATE-----
test-cert-data
-----END CERTIFICATE-----

3
cmd/util/testdata/test.key.pem vendored Normal file
View File

@@ -0,0 +1,3 @@
-----BEGIN RSA PRIVATE KEY-----
test-key-data
-----END RSA PRIVATE KEY-----

Some files were not shown because too many files have changed in this diff Show More