Repository: argoproj/argo-cd
Pull request #8514 (2022-02-15 20:00:59)

feat: support disabling manifest generation using config management tools 
 Signed-off-by: Alexander Matyushentsev <AMatyushentsev@gmail.com>

PR allows end-users to disable helm/kustomize/jsonnet/ksonnet. If the tool is disabled then Argo CD defaults to "directory" source type. This way UI is also automatically switches to "directory" mode when then config management tool is disabled.

codecov[bot]: # [Codecov](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj) Report
> Merging [#8514](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj) (f131f49) into [master](https://codecov.io/gh/argoproj/argo-cd/commit/9bdf0bae2db6884f23b8ddb4b6dfc473b22ad6f3?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj) (9bdf0ba) will **increase** coverage by `0.01%`.
> The diff coverage is `77.10%`.

[![Impacted file tree graph](https://codecov.io/gh/argoproj/argo-cd/pull/8514/graphs/tree.svg?width=650&height=150&src=pr&token=kf5kwuegwE&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj)](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj)

```diff
@@            Coverage Diff             @@
##           master    #8514      +/-   ##
==========================================
+ Coverage   42.31%   42.32%   +0.01%     
==========================================
  Files         176      176              
  Lines       22798    22833      +35     
==========================================
+ Hits         9647     9665      +18     
- Misses      11775    11788      +13     
- Partials     1376     1380       +4     
```


| [Impacted Files](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj) | Coverage Δ | |
|---|---|---|
| [server/application/application.go](https://codecov.io/gh/argoproj/argo-cd/pull/8514/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj#diff-c2VydmVyL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9uLmdv) | `31.27% <52.63%> (+0.06%)` | :arrow_up: |
| [reposerver/repository/repository.go](https://codecov.io/gh/argoproj/argo-cd/pull/8514/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj#diff-cmVwb3NlcnZlci9yZXBvc2l0b3J5L3JlcG9zaXRvcnkuZ28=) | `58.59% <75.00%> (-0.13%)` | :arrow_down: |
| [util/settings/settings.go](https://codecov.io/gh/argoproj/argo-cd/pull/8514/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj#diff-dXRpbC9zZXR0aW5ncy9zZXR0aW5ncy5nbw==) | `47.47% <77.77%> (+0.32%)` | :arrow_up: |
| [util/app/discovery/discovery.go](https://codecov.io/gh/argoproj/argo-cd/pull/8514/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj#diff-dXRpbC9hcHAvZGlzY292ZXJ5L2Rpc2NvdmVyeS5nbw==) | `48.43% <80.00%> (+1.88%)` | :arrow_up: |
| [util/argo/argo.go](https://codecov.io/gh/argoproj/argo-cd/pull/8514/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj#diff-dXRpbC9hcmdvL2FyZ28uZ28=) | `63.00% <88.23%> (-0.25%)` | :arrow_down: |
| [controller/state.go](https://codecov.io/gh/argoproj/argo-cd/pull/8514/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj#diff-Y29udHJvbGxlci9zdGF0ZS5nbw==) | `74.16% <90.00%> (-0.28%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj). Last update [9bdf0ba...f131f49](https://codecov.io/gh/argoproj/argo-cd/pull/8514?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=argoproj).


Patch:
diff --git a/Makefile b/Makefile
index 1a4563ae0..81057f733 100644
--- a/Makefile
+++ b/Makefile
@@ -229,7 +229,7 @@ gen-resources-cli-local: clean-debug
 	CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${GEN_RESOURCES_CLI_NAME} ./hack/gen-resources/cmd
 
 .PHONY: release-cli
-release-cli: clean-debug
+release-cli: clean-debug build-ui
 	make BIN_NAME=argocd-darwin-amd64 GOOS=darwin argocd-all
 	make BIN_NAME=argocd-darwin-arm64 GOOS=darwin GOARCH=arm64 argocd-all
 	make BIN_NAME=argocd-linux-amd64 GOOS=linux argocd-all
@@ -266,17 +266,20 @@ repo-server:
 controller:
 	CGO_ENABLED=0 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd
 
+.PHONY: build-ui
+build-ui:
+	docker build -t argocd-ui --target argocd-ui .
+	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/'
+
 .PHONY: image
 ifeq ($(DEV_IMAGE), true)
 # The "dev" image builds the binaries from the users desktop environment (instead of in Docker)
 # 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:
+image: build-ui
 	docker build -t argocd-base --target argocd-base .
-	docker build -t argocd-ui --target argocd-ui .
-	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
 	ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-server
 	ln -sfn ${DIST_DIR}/argocd ${DIST_DIR}/argocd-application-controller
diff --git a/controller/state.go b/controller/state.go
index 7e66ceb91..03def14f1 100644
--- a/controller/state.go
+++ b/controller/state.go
@@ -140,6 +140,10 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, source v1alpha1
 	if err != nil {
 		return nil, nil, err
 	}
+	enabledSourceTypes, err := m.settingsMgr.GetEnabledSourceTypes()
+	if err != nil {
+		return nil, nil, err
+	}
 	ts.AddCheckpoint("plugins_ms")
 	tools := make([]*appv1.ConfigManagementPlugin, len(plugins))
 	for i := range plugins {
@@ -162,22 +166,23 @@ func (m *appStateManager) getRepoObjs(app *v1alpha1.Application, source v1alpha1
 	}
 	ts.AddCheckpoint("version_ms")
 	manifestInfo, err := repoClient.GenerateManifest(context.Background(), &apiclient.ManifestRequest{
-		Repo:              repo,
-		Repos:             permittedHelmRepos,
-		Revision:          revision,
-		NoCache:           noCache,
-		NoRevisionCache:   noRevisionCache,
-		AppLabelKey:       appLabelKey,
-		AppName:           app.Name,
-		Namespace:         app.Spec.Destination.Namespace,
-		ApplicationSource: &source,
-		Plugins:           tools,
-		KustomizeOptions:  kustomizeOptions,
-		KubeVersion:       serverVersion,
-		ApiVersions:       argo.APIResourcesToStrings(apiResources, true),
-		VerifySignature:   verifySignature,
-		HelmRepoCreds:     permittedHelmCredentials,
-		TrackingMethod:    string(argo.GetTrackingMethod(m.settingsMgr)),
+		Repo:               repo,
+		Repos:              permittedHelmRepos,
+		Revision:           revision,
+		NoCache:            noCache,
+		NoRevisionCache:    noRevisionCache,
+		AppLabelKey:        appLabelKey,
+		AppName:            app.Name,
+		Namespace:          app.Spec.Destination.Namespace,
+		ApplicationSource:  &source,
+		Plugins:            tools,
+		KustomizeOptions:   kustomizeOptions,
+		KubeVersion:        serverVersion,
+		ApiVersions:        argo.APIResourcesToStrings(apiResources, true),
+		VerifySignature:    verifySignature,
+		HelmRepoCreds:      permittedHelmCredentials,
+		TrackingMethod:     string(argo.GetTrackingMethod(m.settingsMgr)),
+		EnabledSourceTypes: enabledSourceTypes,
 	})
 	if err != nil {
 		return nil, nil, err
diff --git a/docs/operator-manual/argocd-cm.yaml b/docs/operator-manual/argocd-cm.yaml
index c66c64792..a7079d98c 100644
--- a/docs/operator-manual/argocd-cm.yaml
+++ b/docs/operator-manual/argocd-cm.yaml
@@ -205,6 +205,13 @@ data:
       generate:
         command: [kasane, show]
 
+  # A set of settings that allow enabling or disabling the config management tool.
+  # If unset, each defaults to "true".
+  kustomize.enabled: true
+  jsonnet.enabled: true
+  helm.enabled: true
+  ksonnet.enabled: true
+
   # Build options/parameters to use with `kustomize build` (optional)
   kustomize.buildOptions: --load_restrictor none
 
diff --git a/docs/operator-manual/security.md b/docs/operator-manual/security.md
index 8e0d6b45f..4040b776a 100644
--- a/docs/operator-manual/security.md
+++ b/docs/operator-manual/security.md
@@ -73,6 +73,11 @@ sensitive information, but might be configured with Config Management Plugins wh
 (e.g. decryption keys). If such plugins are used, extreme care must be taken to ensure the
 repository contents can be trusted at all times.
 
+Optionally the built-in config management tools might be individually disabled.
+If you know that your users will not need a certain config management tool, it's advisable
+to disable that tool.
+See [Tool Detection](../user-guide/tool_detection.md) for more information.
+
 ### Remote bases and helm chart dependencies
 
 Argo CD's repository allow-list only restricts the initial repository which is cloned. However, both
diff --git a/docs/user-guide/tool_detection.md b/docs/user-guide/tool_detection.md
index bd98e5a91..35af3bcd4 100644
--- a/docs/user-guide/tool_detection.md
+++ b/docs/user-guide/tool_detection.md
@@ -32,6 +32,12 @@ If not, then the tool is detected implicitly as follows:
 
 Otherwise it is assumed to be a plain **directory** application. 
 
+## Disable built-in tools
+
+Optionally built-in config management tools might be disabled. In order to disable the tool add one of the following
+keys to the `argocd-cm` ConfigMap: `kustomize.enable`, `helm.enable`, `ksonnet.enable` or `jsonnet.enable`. Once the
+tool is disabled Argo CD will assume the application target directory contains plain Kubernetes YAML manifests.
+
 ## References
 
 * [reposerver/repository/repository.go/GetAppSourceType](https://github.com/argoproj/argo-cd/blob/master/reposerver/repository/repository.go#L286)
diff --git a/reposerver/apiclient/repository.pb.go b/reposerver/apiclient/repository.pb.go
index a61884fb1..7bd047462 100644
--- a/reposerver/apiclient/repository.pb.go
+++ b/reposerver/apiclient/repository.pb.go
@@ -51,6 +51,7 @@ type ManifestRequest struct {
 	HelmRepoCreds        []*v1alpha1.RepoCreds `protobuf:"bytes,17,rep,name=helmRepoCreds,proto3" json:"helmRepoCreds,omitempty"`
 	NoRevisionCache      bool                  `protobuf:"varint,18,opt,name=noRevisionCache,proto3" json:"noRevisionCache,omitempty"`
 	TrackingMethod       string                `protobuf:"bytes,19,opt,name=trackingMethod,proto3" json:"trackingMethod,omitempty"`
+	EnabledSourceTypes   map[string]bool       `protobuf:"bytes,20,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
 	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
 	XXX_unrecognized     []byte                `json:"-"`
 	XXX_sizecache        int32                 `json:"-"`
@@ -201,6 +202,13 @@ func (m *ManifestRequest) GetTrackingMethod() string {
 	return ""
 }
 
+func (m *ManifestRequest) GetEnabledSourceTypes() map[string]bool {
+	if m != nil {
+		return m.EnabledSourceTypes
+	}
+	return nil
+}
+
 // TestRepositoryRequest is a query to test repository is valid or not and has valid access.
 type TestRepositoryRequest struct {
 	Repo                 *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
@@ -615,6 +623,7 @@ func (m *Refs) GetTags() []string {
 type ListAppsRequest struct {
 	Repo                 *v1alpha1.Repository `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
 	Revision             string               `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"`
+	EnabledSourceTypes   map[string]bool      `protobuf:"bytes,3,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
 	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
 	XXX_unrecognized     []byte               `json:"-"`
 	XXX_sizecache        int32                `json:"-"`
@@ -667,6 +676,13 @@ func (m *ListAppsRequest) GetRevision() string {
 	return ""
 }
 
+func (m *ListAppsRequest) GetEnabledSourceTypes() map[string]bool {
+	if m != nil {
+		return m.EnabledSourceTypes
+	}
+	return nil
+}
+
 // AppList returns the contents of the repo of a ListApps request
 type AppList struct {
 	Apps                 map[string]string `protobuf:"bytes,1,rep,name=apps,proto3" json:"apps,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
@@ -725,6 +741,7 @@ type RepoServerAppDetailsQuery struct {
 	NoCache              bool                        `protobuf:"varint,6,opt,name=noCache,proto3" json:"noCache,omitempty"`
 	NoRevisionCache      bool                        `protobuf:"varint,7,opt,name=noRevisionCache,proto3" json:"noRevisionCache,omitempty"`
 	TrackingMethod       string                      `protobuf:"bytes,8,opt,name=trackingMethod,proto3" json:"trackingMethod,omitempty"`
+	EnabledSourceTypes   map[string]bool             `protobuf:"bytes,9,rep,name=enabledSourceTypes,proto3" json:"enabledSourceTypes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
 	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
 	XXX_unrecognized     []byte                      `json:"-"`
 	XXX_sizecache        int32                       `json:"-"`
@@ -819,6 +836,13 @@ func (m *RepoServerAppDetailsQuery) GetTrackingMethod() string {
 	return ""
 }
 
+func (m *RepoServerAppDetailsQuery) GetEnabledSourceTypes() map[string]bool {
+	if m != nil {
+		return m.EnabledSourceTypes
+	}
+	return nil
+}
+
 // RepoAppDetailsResponse application details
 type RepoAppDetailsResponse struct {
 	Type                 string            `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
@@ -1476,6 +1500,7 @@ func (m *HelmChartsResponse) GetItems() []*HelmChart {
 
 func init() {
 	proto.RegisterType((*ManifestRequest)(nil), "repository.ManifestRequest")
+	proto.RegisterMapType((map[string]bool)(nil), "repository.ManifestRequest.EnabledSourceTypesEntry")
 	proto.RegisterType((*TestRepositoryRequest)(nil), "repository.TestRepositoryRequest")
 	proto.RegisterType((*TestRepositoryResponse)(nil), "repository.TestRepositoryResponse")
 	proto.RegisterType((*ResolveRevisionRequest)(nil), "repository.ResolveRevisionRequest")
@@ -1484,9 +1509,11 @@ func init() {
 	proto.RegisterType((*ListRefsRequest)(nil), "repository.ListRefsRequest")
 	proto.RegisterType((*Refs)(nil), "repository.Refs")
 	proto.RegisterType((*ListAppsRequest)(nil), "repository.ListAppsRequest")
+	proto.RegisterMapType((map[string]bool)(nil), "repository.ListAppsRequest.EnabledSourceTypesEntry")
 	proto.RegisterType((*AppList)(nil), "repository.AppList")
 	proto.RegisterMapType((map[string]string)(nil), "repository.AppList.AppsEntry")
 	proto.RegisterType((*RepoServerAppDetailsQuery)(nil), "repository.RepoServerAppDetailsQuery")
+	proto.RegisterMapType((map[string]bool)(nil), "repository.RepoServerAppDetailsQuery.EnabledSourceTypesEntry")
 	proto.RegisterType((*RepoAppDetailsResponse)(nil), "repository.RepoAppDetailsResponse")
 	proto.RegisterType((*RepoServerRevisionMetadataRequest)(nil), "repository.RepoServerRevisionMetadataRequest")
 	proto.RegisterType((*KsonnetAppSpec)(nil), "repository.KsonnetAppSpec")
@@ -1506,101 +1533,106 @@ func init() {
 }
 
 var fileDescriptor_dd8723cfcc820480 = []byte{
-	// 1502 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x18, 0x5b, 0x6f, 0x1b, 0x45,
-	0x37, 0xeb, 0x38, 0x17, 0x1f, 0xb7, 0x89, 0x33, 0xbd, 0xed, 0xb7, 0x5f, 0x1a, 0xa5, 0x8b, 0xa8,
-	0x02, 0x6d, 0xd7, 0xaa, 0x5b, 0x41, 0xd5, 0x4a, 0x48, 0x26, 0x6d, 0x53, 0x94, 0xa6, 0x09, 0x9b,
-	0x82, 0x04, 0x54, 0x54, 0x93, 0xf5, 0x64, 0x3d, 0x78, 0xbd, 0x3b, 0xdd, 0xd9, 0x35, 0x4a, 0x25,
-	0x1e, 0x78, 0xe2, 0x81, 0x67, 0xf8, 0x3b, 0xbc, 0x70, 0x7b, 0xe4, 0x27, 0xa0, 0xf2, 0x2b, 0x78,
-	0x43, 0x33, 0x7b, 0x5f, 0xaf, 0x03, 0x92, 0xd3, 0xf4, 0xc5, 0x9e, 0x39, 0xf7, 0x39, 0x73, 0x6e,
-	0xb3, 0x70, 0xd5, 0x27, 0xcc, 0xe3, 0xc4, 0x1f, 0x11, 0xbf, 0x2d, 0x97, 0x34, 0xf0, 0xfc, 0xa3,
-	0xdc, 0xd2, 0x60, 0xbe, 0x17, 0x78, 0x08, 0x32, 0x88, 0x76, 0xde, 0xf6, 0x6c, 0x4f, 0x82, 0xdb,
-	0x62, 0x15, 0x51, 0x68, 0xab, 0xb6, 0xe7, 0xd9, 0x0e, 0x69, 0x63, 0x46, 0xdb, 0xd8, 0x75, 0xbd,
-	0x00, 0x07, 0xd4, 0x73, 0x79, 0x8c, 0xd5, 0x07, 0x77, 0xb8, 0x41, 0x3d, 0x89, 0xb5, 0x3c, 0x9f,
-	0xb4, 0x47, 0x37, 0xdb, 0x36, 0x71, 0x89, 0x8f, 0x03, 0xd2, 0x8b, 0x69, 0x1e, 0xdb, 0x34, 0xe8,
-	0x87, 0x07, 0x86, 0xe5, 0x0d, 0xdb, 0xd8, 0x97, 0x2a, 0xbe, 0x92, 0x8b, 0x1b, 0x56, 0xaf, 0x3d,
-	0xea, 0xb4, 0xd9, 0xc0, 0x16, 0xfc, 0xbc, 0x8d, 0x19, 0x73, 0xa8, 0x25, 0xe5, 0xb7, 0x47, 0x37,
-	0xb1, 0xc3, 0xfa, 0x78, 0x4c, 0x9a, 0xfe, 0xf7, 0x02, 0x2c, 0xef, 0x60, 0x97, 0x1e, 0x12, 0x1e,
-	0x98, 0xe4, 0x45, 0x48, 0x78, 0x80, 0x9e, 0x41, 0x5d, 0x9c, 0x43, 0x55, 0xd6, 0x95, 0x8d, 0x66,
-	0xe7, 0x91, 0x91, 0x29, 0x34, 0x12, 0x85, 0x72, 0xf1, 0xdc, 0xea, 0x19, 0xa3, 0x8e, 0xc1, 0x06,
-	0xb6, 0x21, 0x14, 0x1a, 0x39, 0x85, 0x46, 0xa2, 0xd0, 0x30, 0x53, 0x8f, 0x98, 0x52, 0x2a, 0xd2,
-	0x60, 0xd1, 0x27, 0x23, 0xca, 0xa9, 0xe7, 0xaa, 0xb5, 0x75, 0x65, 0xa3, 0x61, 0xa6, 0x7b, 0xa4,
-	0xc2, 0x82, 0xeb, 0x6d, 0x62, 0xab, 0x4f, 0xd4, 0xd9, 0x75, 0x65, 0x63, 0xd1, 0x4c, 0xb6, 0x68,
-	0x1d, 0x9a, 0x98, 0xb1, 0xc7, 0xf8, 0x80, 0x38, 0xdb, 0xe4, 0x48, 0xad, 0x4b, 0xc6, 0x3c, 0x48,
-	0xf0, 0x62, 0xc6, 0x9e, 0xe0, 0x21, 0x51, 0xe7, 0x24, 0x36, 0xd9, 0xa2, 0x55, 0x68, 0xb8, 0x78,
-	0x48, 0x38, 0xc3, 0x16, 0x51, 0x17, 0x25, 0x2e, 0x03, 0xa0, 0x6f, 0x60, 0x25, 0x67, 0xf8, 0xbe,
-	0x17, 0xfa, 0x16, 0x51, 0x41, 0x1e, 0x7d, 0x77, 0xba, 0xa3, 0x77, 0xcb, 0x62, 0xcd, 0x71, 0x4d,
-	0xe8, 0x4b, 0x98, 0x93, 0x41, 0xa3, 0x36, 0xd7, 0x67, 0x4f, 0xd4, 0xdb, 0x91, 0x58, 0xe4, 0xc2,
-	0x02, 0x73, 0x42, 0x9b, 0xba, 0x5c, 0x3d, 0x23, 0x35, 0x3c, 0x9d, 0x4e, 0xc3, 0xa6, 0xe7, 0x1e,
-	0x52, 0x7b, 0x07, 0xbb, 0xd8, 0x26, 0x43, 0xe2, 0x06, 0x7b, 0x52, 0xb8, 0x99, 0x28, 0x41, 0x2f,
-	0xa1, 0x35, 0x08, 0x79, 0xe0, 0x0d, 0xe9, 0x4b, 0xb2, 0xcb, 0x64, 0x70, 0xab, 0x67, 0xa5, 0x37,
-	0x9f, 0x4c, 0xa7, 0x78, 0xbb, 0x24, 0xd5, 0x1c, 0xd3, 0x23, 0x82, 0x64, 0x10, 0x1e, 0x90, 0x4f,
-	0x89, 0x2f, 0xa3, 0x6b, 0x29, 0x0a, 0x92, 0x1c, 0x28, 0x0a, 0x23, 0x1a, 0xef, 0xb8, 0xba, 0xbc,
-	0x3e, 0x1b, 0x85, 0x51, 0x0a, 0x42, 0x1b, 0xb0, 0x3c, 0x22, 0x3e, 0x3d, 0x3c, 0xda, 0xa7, 0xb6,
-	0x8b, 0x83, 0xd0, 0x27, 0x6a, 0x4b, 0x86, 0x62, 0x19, 0x8c, 0x86, 0x70, 0xb6, 0x4f, 0x9c, 0xa1,
-	0x70, 0xf9, 0xa6, 0x4f, 0x7a, 0x5c, 0x5d, 0x91, 0xfe, 0xdd, 0x9a, 0xfe, 0x06, 0xa5, 0x38, 0xb3,
-	0x28, 0x5d, 0x18, 0xe6, 0x7a, 0x66, 0x9c, 0x29, 0x51, 0x8e, 0xa0, 0xc8, 0xb0, 0x12, 0x18, 0x5d,
-	0x85, 0xa5, 0xc0, 0xc7, 0xd6, 0x80, 0xba, 0xf6, 0x0e, 0x09, 0xfa, 0x5e, 0x4f, 0x3d, 0x27, 0x3d,
-	0x51, 0x82, 0xea, 0x21, 0x5c, 0x78, 0x2a, 0xd3, 0x3e, 0x8d, 0x99, 0xd3, 0x28, 0x00, 0xfa, 0x23,
-	0xb8, 0x58, 0x56, 0xcb, 0x99, 0xe7, 0x72, 0x82, 0x0c, 0x40, 0xd2, 0xc9, 0x94, 0xf4, 0x32, 0xac,
-	0xb4, 0x62, 0xd1, 0xac, 0xc0, 0xe8, 0xdf, 0xd6, 0xe0, 0xa2, 0x49, 0xb8, 0xe7, 0x8c, 0x48, 0xe2,
-	0x81, 0xd3, 0xa9, 0x61, 0x5f, 0xc0, 0x2c, 0x66, 0x4c, 0x96, 0xaf, 0x66, 0xe7, 0xa3, 0x13, 0xab,
-	0x12, 0xa6, 0x90, 0x8a, 0xae, 0xc3, 0x0a, 0x1e, 0x1e, 0x50, 0x3b, 0xf4, 0x42, 0x9e, 0x1c, 0x4b,
-	0x96, 0xc3, 0x86, 0x39, 0x8e, 0xd0, 0x2d, 0xb8, 0x34, 0xe6, 0x82, 0xd8, 0x9d, 0xf9, 0x4a, 0xab,
-	0x94, 0x2a, 0x6d, 0xa5, 0x92, 0xda, 0x24, 0x25, 0xbf, 0x2a, 0xd0, 0xca, 0xba, 0x44, 0x2c, 0x7e,
-	0x15, 0x1a, 0xc3, 0x18, 0xc6, 0x55, 0x45, 0x66, 0x52, 0x06, 0x28, 0x16, 0xdd, 0x5a, 0xb9, 0xe8,
-	0x5e, 0x84, 0xf9, 0xa8, 0x9d, 0xc6, 0x07, 0x8b, 0x77, 0x05, 0x93, 0xeb, 0x25, 0x93, 0xd7, 0x00,
-	0xb8, 0xac, 0x99, 0x4f, 0x8f, 0x18, 0x51, 0xe7, 0x25, 0x36, 0x07, 0x41, 0x3a, 0x9c, 0x89, 0x52,
-	0xd4, 0x24, 0x3c, 0x74, 0x02, 0x75, 0x41, 0x52, 0x14, 0x60, 0xba, 0x07, 0xcb, 0x8f, 0xa9, 0x38,
-	0xc3, 0x21, 0x3f, 0x9d, 0x60, 0x7f, 0x0f, 0xea, 0x42, 0x99, 0x38, 0xd8, 0x81, 0x8f, 0x5d, 0xab,
-	0x4f, 0x12, 0x5f, 0xa5, 0x7b, 0x84, 0xa0, 0x1e, 0x60, 0x9b, 0xab, 0x35, 0x09, 0x97, 0x6b, 0xfd,
-	0x7b, 0x25, 0xb2, 0xb4, 0xcb, 0x18, 0x7f, 0xe3, 0x7d, 0x59, 0x0f, 0x61, 0xa1, 0xcb, 0x98, 0xb0,
-	0x07, 0xdd, 0x84, 0x3a, 0x66, 0x2c, 0x3a, 0x44, 0xb3, 0x73, 0xd9, 0xc8, 0xcd, 0x40, 0x31, 0x89,
-	0xf8, 0xe7, 0x0f, 0xdc, 0x40, 0x48, 0x16, 0xa4, 0xda, 0xfb, 0xd0, 0x48, 0x41, 0xa8, 0x05, 0xb3,
-	0x03, 0x72, 0x14, 0xc7, 0xa3, 0x58, 0xa2, 0xf3, 0x30, 0x37, 0xc2, 0x4e, 0x98, 0x44, 0x49, 0xb4,
-	0xb9, 0x5b, 0xbb, 0xa3, 0xe8, 0x3f, 0xd7, 0xe1, 0x7f, 0xc2, 0xce, 0x7d, 0x19, 0x1c, 0x5d, 0xc6,
-	0xee, 0x93, 0x00, 0x53, 0x87, 0x7f, 0x1c, 0x12, 0xff, 0xe8, 0x35, 0xbb, 0xc3, 0x86, 0xf9, 0x28,
-	0xb6, 0xe2, 0x2c, 0x3f, 0xf1, 0x59, 0x20, 0x16, 0x9f, 0x0d, 0x00, 0xb3, 0xaf, 0x67, 0x00, 0xa8,
-	0x6a, 0xc8, 0xf5, 0x53, 0x6a, 0xc8, 0x93, 0x67, 0xb2, 0xdc, 0xa4, 0x37, 0x5f, 0x9c, 0xf4, 0x2a,
-	0xfa, 0xdc, 0xc2, 0x7f, 0xed, 0x73, 0x8b, 0x95, 0x7d, 0xee, 0x3b, 0xd9, 0x26, 0x98, 0x97, 0x05,
-	0x50, 0x5a, 0xc3, 0x44, 0xea, 0x89, 0x6a, 0x12, 0x85, 0xa3, 0x5c, 0xa3, 0xdb, 0xb0, 0x30, 0xe0,
-	0x9e, 0xeb, 0x92, 0x20, 0xbe, 0x7a, 0x2d, 0x1f, 0xe4, 0xdb, 0x11, 0xaa, 0xcb, 0xd8, 0x3e, 0x23,
-	0x96, 0x99, 0x90, 0xa2, 0x6b, 0x50, 0x17, 0xfd, 0x5a, 0xd6, 0xb3, 0x66, 0xe7, 0x52, 0x9e, 0xe5,
-	0x11, 0x71, 0x86, 0x09, 0xbd, 0x24, 0x42, 0x77, 0xa1, 0x91, 0xfa, 0x2a, 0xbe, 0x8c, 0xd5, 0x82,
-	0x92, 0x04, 0x99, 0xb0, 0x65, 0xe4, 0x82, 0xb7, 0x47, 0x7d, 0x62, 0xc9, 0xde, 0x38, 0x37, 0xce,
-	0x7b, 0x3f, 0x41, 0xa6, 0xbc, 0x29, 0xb9, 0xfe, 0x8b, 0x02, 0x57, 0xb2, 0x84, 0x4a, 0xbc, 0xb9,
-	0x43, 0x02, 0xdc, 0xc3, 0x01, 0x7e, 0xf3, 0xf3, 0xff, 0x55, 0x58, 0xb2, 0xfa, 0xc4, 0x1a, 0x64,
-	0xb3, 0x57, 0xf4, 0x0c, 0x28, 0x41, 0xf5, 0xdf, 0x6a, 0xb0, 0x54, 0xbc, 0x08, 0x71, 0x93, 0xa2,
-	0xbd, 0x24, 0x37, 0x29, 0xd6, 0x68, 0x0f, 0xce, 0x10, 0x77, 0x44, 0x7d, 0xcf, 0x15, 0x93, 0x6a,
-	0x92, 0x61, 0xd7, 0x27, 0x5f, 0xa7, 0xf1, 0x20, 0x47, 0x1e, 0x95, 0xb0, 0x82, 0x04, 0xe4, 0x02,
-	0x30, 0xec, 0xe3, 0x21, 0x09, 0x88, 0x2f, 0xd2, 0x68, 0xf6, 0x04, 0xd2, 0x28, 0xb2, 0x60, 0x2f,
-	0x11, 0x6b, 0xe6, 0x34, 0x68, 0xcf, 0x61, 0x65, 0xcc, 0xa4, 0x8a, 0x12, 0x7a, 0x3b, 0x5f, 0x42,
-	0x9b, 0x9d, 0xb5, 0x8a, 0x13, 0xe6, 0xc4, 0xe4, 0x4b, 0xec, 0x4f, 0x35, 0x68, 0xe6, 0xe2, 0xb3,
-	0xd2, 0x8d, 0x6b, 0x00, 0x92, 0xe1, 0x21, 0x75, 0x48, 0xe4, 0xc4, 0x86, 0x99, 0x83, 0xa0, 0x41,
-	0x85, 0x53, 0xb6, 0xa7, 0x73, 0x8a, 0x30, 0xa9, 0xd2, 0x23, 0x62, 0x72, 0x90, 0xaa, 0x79, 0x5c,
-	0x51, 0xe2, 0x1d, 0xfa, 0x1a, 0x96, 0x0e, 0xa9, 0x43, 0xf6, 0x32, 0x43, 0xe6, 0xa5, 0x21, 0xbb,
-	0xd3, 0x1b, 0xf2, 0x30, 0x2f, 0xd7, 0x2c, 0xa9, 0xd1, 0xdf, 0x85, 0x56, 0x39, 0x5d, 0x85, 0x91,
-	0x74, 0x88, 0xed, 0xd4, 0x5b, 0xf1, 0x4e, 0xff, 0x41, 0x01, 0x34, 0x7e, 0x1f, 0x93, 0x9c, 0x3e,
-	0xb8, 0xc3, 0x93, 0xa7, 0x4c, 0x94, 0x28, 0x39, 0x08, 0xda, 0x86, 0x66, 0x8f, 0xf0, 0x80, 0xba,
-	0xd2, 0xe0, 0xb8, 0x88, 0xbc, 0x73, 0xfc, 0xc5, 0xdf, 0xcf, 0x18, 0xcc, 0x3c, 0xb7, 0xfe, 0x09,
-	0x5c, 0x3e, 0x96, 0x3a, 0x37, 0xaf, 0x29, 0x85, 0x79, 0xed, 0xd8, 0x29, 0x4f, 0x47, 0xd0, 0x2a,
-	0x57, 0x23, 0xfd, 0x05, 0xac, 0x08, 0x9f, 0x6e, 0xf6, 0xb1, 0x1f, 0x9c, 0xd2, 0x0c, 0x76, 0x0f,
-	0x1a, 0xa9, 0xca, 0x4a, 0x5f, 0x6b, 0xb0, 0x38, 0x4a, 0x9e, 0x84, 0xd1, 0x10, 0x96, 0xee, 0xf5,
-	0x2e, 0xa0, 0xbc, 0xbd, 0x71, 0xdf, 0xb8, 0x06, 0x73, 0x34, 0x20, 0xc3, 0x64, 0x0c, 0xba, 0x50,
-	0x2e, 0xf7, 0x92, 0xdc, 0x8c, 0x68, 0x3a, 0x7f, 0xcd, 0xc1, 0x4a, 0x56, 0x75, 0xc5, 0x2f, 0xb5,
-	0x08, 0xda, 0x85, 0xd6, 0x56, 0xfc, 0x31, 0x26, 0x19, 0xad, 0xd1, 0xff, 0xf3, 0x72, 0x4a, 0x9f,
-	0x65, 0xb4, 0xd5, 0x6a, 0x64, 0x64, 0x91, 0x3e, 0x83, 0x3e, 0x83, 0xa5, 0xe2, 0xbb, 0x0a, 0x5d,
-	0xc9, 0x73, 0x54, 0x3e, 0xf5, 0x34, 0xfd, 0x38, 0x92, 0x54, 0xf4, 0x33, 0x58, 0x2e, 0x3d, 0x32,
-	0x50, 0x81, 0xb1, 0xfa, 0x11, 0xa6, 0xbd, 0x75, 0x2c, 0x4d, 0x2a, 0xfd, 0x1e, 0x2c, 0x26, 0x43,
-	0x79, 0xd1, 0x03, 0xa5, 0x51, 0x5d, 0x6b, 0x15, 0xe5, 0x1d, 0x72, 0x7d, 0x06, 0x7d, 0x10, 0x31,
-	0x8b, 0x01, 0x73, 0x9c, 0x39, 0x37, 0x3d, 0x6b, 0xe7, 0x2a, 0x46, 0x55, 0x79, 0xb4, 0xb3, 0x5b,
-	0xb2, 0xfe, 0xc7, 0xa3, 0x01, 0x7a, 0xbb, 0xa8, 0x64, 0xc2, 0xf4, 0xa9, 0xe9, 0x65, 0xb2, 0xf1,
-	0xe9, 0x42, 0x9f, 0x41, 0x3f, 0x2a, 0x70, 0x6e, 0x8b, 0x04, 0xe5, 0x4e, 0x8b, 0x6e, 0x54, 0x2b,
-	0x99, 0xd0, 0x91, 0xb5, 0x27, 0xd3, 0x66, 0x44, 0x51, 0xac, 0x3e, 0x83, 0xf6, 0xe4, 0xb1, 0xb3,
-	0xc8, 0x46, 0x97, 0x2b, 0x43, 0x38, 0xf5, 0xde, 0xda, 0x24, 0x74, 0x72, 0xd4, 0x0f, 0xbb, 0xbf,
-	0xbf, 0x5a, 0x53, 0xfe, 0x78, 0xb5, 0xa6, 0xfc, 0xf9, 0x6a, 0x4d, 0xf9, 0xfc, 0xd6, 0xbf, 0x7c,
-	0xa5, 0xcc, 0x7d, 0x50, 0xc5, 0x8c, 0x5a, 0x0e, 0x25, 0x6e, 0x70, 0x30, 0x2f, 0xbf, 0x49, 0xde,
-	0xfa, 0x27, 0x00, 0x00, 0xff, 0xff, 0x6e, 0xdf, 0x39, 0x38, 0x6f, 0x15, 0x00, 0x00,
+	// 1574 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x6e, 0x1b, 0x45,
+	0x14, 0x8e, 0x7f, 0x92, 0xd8, 0xc7, 0x6d, 0xe2, 0x4c, 0xff, 0x96, 0x25, 0x8d, 0xd2, 0x45, 0x54,
+	0x81, 0xb6, 0x6b, 0xd5, 0xad, 0xa0, 0x6a, 0x05, 0x52, 0x48, 0xd3, 0x14, 0xa5, 0x69, 0xc2, 0xa6,
+	0x20, 0x01, 0x15, 0xd5, 0x64, 0x3d, 0x59, 0x0f, 0x5e, 0xef, 0x4e, 0x77, 0xd6, 0x46, 0xa9, 0xc4,
+	0x05, 0x57, 0x3c, 0x01, 0xbc, 0x01, 0xcf, 0xc0, 0x25, 0x57, 0xfc, 0x5c, 0xf2, 0x08, 0xa8, 0xbc,
+	0x05, 0x57, 0x68, 0x66, 0xff, 0xc6, 0xeb, 0x75, 0x5a, 0x29, 0x69, 0x72, 0x63, 0xcf, 0x9c, 0x39,
+	0x7f, 0x73, 0xe6, 0xcc, 0x39, 0xdf, 0x2c, 0x5c, 0x0d, 0x08, 0xf3, 0x39, 0x09, 0x86, 0x24, 0x68,
+	0xc9, 0x21, 0x0d, 0xfd, 0xe0, 0x40, 0x19, 0x9a, 0x2c, 0xf0, 0x43, 0x1f, 0x41, 0x46, 0xd1, 0xcf,
+	0x3b, 0xbe, 0xe3, 0x4b, 0x72, 0x4b, 0x8c, 0x22, 0x0e, 0x7d, 0xd1, 0xf1, 0x7d, 0xc7, 0x25, 0x2d,
+	0xcc, 0x68, 0x0b, 0x7b, 0x9e, 0x1f, 0xe2, 0x90, 0xfa, 0x1e, 0x8f, 0x57, 0x8d, 0xde, 0x1d, 0x6e,
+	0x52, 0x5f, 0xae, 0xda, 0x7e, 0x40, 0x5a, 0xc3, 0x9b, 0x2d, 0x87, 0x78, 0x24, 0xc0, 0x21, 0xe9,
+	0xc4, 0x3c, 0x8f, 0x1c, 0x1a, 0x76, 0x07, 0x7b, 0xa6, 0xed, 0xf7, 0x5b, 0x38, 0x90, 0x26, 0xbe,
+	0x95, 0x83, 0x1b, 0x76, 0xa7, 0x35, 0x6c, 0xb7, 0x58, 0xcf, 0x11, 0xf2, 0xbc, 0x85, 0x19, 0x73,
+	0xa9, 0x2d, 0xf5, 0xb7, 0x86, 0x37, 0xb1, 0xcb, 0xba, 0x78, 0x4c, 0x9b, 0xf1, 0x4b, 0x1d, 0xe6,
+	0xb7, 0xb0, 0x47, 0xf7, 0x09, 0x0f, 0x2d, 0xf2, 0x7c, 0x40, 0x78, 0x88, 0x9e, 0x42, 0x55, 0xec,
+	0x43, 0x2b, 0x2d, 0x97, 0x56, 0x1a, 0xed, 0x87, 0x66, 0x66, 0xd0, 0x4c, 0x0c, 0xca, 0xc1, 0x33,
+	0xbb, 0x63, 0x0e, 0xdb, 0x26, 0xeb, 0x39, 0xa6, 0x30, 0x68, 0x2a, 0x06, 0xcd, 0xc4, 0xa0, 0x69,
+	0xa5, 0x11, 0xb1, 0xa4, 0x56, 0xa4, 0x43, 0x2d, 0x20, 0x43, 0xca, 0xa9, 0xef, 0x69, 0xe5, 0xe5,
+	0xd2, 0x4a, 0xdd, 0x4a, 0xe7, 0x48, 0x83, 0x59, 0xcf, 0x5f, 0xc3, 0x76, 0x97, 0x68, 0x95, 0xe5,
+	0xd2, 0x4a, 0xcd, 0x4a, 0xa6, 0x68, 0x19, 0x1a, 0x98, 0xb1, 0x47, 0x78, 0x8f, 0xb8, 0x9b, 0xe4,
+	0x40, 0xab, 0x4a, 0x41, 0x95, 0x24, 0x64, 0x31, 0x63, 0x8f, 0x71, 0x9f, 0x68, 0xd3, 0x72, 0x35,
+	0x99, 0xa2, 0x45, 0xa8, 0x7b, 0xb8, 0x4f, 0x38, 0xc3, 0x36, 0xd1, 0x6a, 0x72, 0x2d, 0x23, 0xa0,
+	0xef, 0x61, 0x41, 0x71, 0x7c, 0xd7, 0x1f, 0x04, 0x36, 0xd1, 0x40, 0x6e, 0x7d, 0xfb, 0x68, 0x5b,
+	0x5f, 0xcd, 0xab, 0xb5, 0xc6, 0x2d, 0xa1, 0x6f, 0x60, 0x5a, 0x26, 0x8d, 0xd6, 0x58, 0xae, 0x1c,
+	0x6b, 0xb4, 0x23, 0xb5, 0xc8, 0x83, 0x59, 0xe6, 0x0e, 0x1c, 0xea, 0x71, 0xed, 0x8c, 0xb4, 0xf0,
+	0xe4, 0x68, 0x16, 0xd6, 0x7c, 0x6f, 0x9f, 0x3a, 0x5b, 0xd8, 0xc3, 0x0e, 0xe9, 0x13, 0x2f, 0xdc,
+	0x91, 0xca, 0xad, 0xc4, 0x08, 0x7a, 0x01, 0xcd, 0xde, 0x80, 0x87, 0x7e, 0x9f, 0xbe, 0x20, 0xdb,
+	0x4c, 0x26, 0xb7, 0x76, 0x56, 0x46, 0xf3, 0xf1, 0xd1, 0x0c, 0x6f, 0xe6, 0xb4, 0x5a, 0x63, 0x76,
+	0x44, 0x92, 0xf4, 0x06, 0x7b, 0xe4, 0x0b, 0x12, 0xc8, 0xec, 0x9a, 0x8b, 0x92, 0x44, 0x21, 0x45,
+	0x69, 0x44, 0xe3, 0x19, 0xd7, 0xe6, 0x97, 0x2b, 0x51, 0x1a, 0xa5, 0x24, 0xb4, 0x02, 0xf3, 0x43,
+	0x12, 0xd0, 0xfd, 0x83, 0x5d, 0xea, 0x78, 0x38, 0x1c, 0x04, 0x44, 0x6b, 0xca, 0x54, 0xcc, 0x93,
+	0x51, 0x1f, 0xce, 0x76, 0x89, 0xdb, 0x17, 0x21, 0x5f, 0x0b, 0x48, 0x87, 0x6b, 0x0b, 0x32, 0xbe,
+	0x1b, 0x47, 0x3f, 0x41, 0xa9, 0xce, 0x1a, 0xd5, 0x2e, 0x1c, 0xf3, 0x7c, 0x2b, 0xbe, 0x29, 0xd1,
+	0x1d, 0x41, 0x91, 0x63, 0x39, 0x32, 0xba, 0x0a, 0x73, 0x61, 0x80, 0xed, 0x1e, 0xf5, 0x9c, 0x2d,
+	0x12, 0x76, 0xfd, 0x8e, 0x76, 0x4e, 0x46, 0x22, 0x47, 0x45, 0x36, 0x20, 0xe2, 0xe1, 0x3d, 0x97,
+	0x74, 0xa2, 0x5c, 0x7c, 0x72, 0xc0, 0x08, 0xd7, 0xce, 0xcb, 0x5d, 0xdc, 0x32, 0x95, 0xe2, 0x96,
+	0x2b, 0x10, 0xe6, 0xfa, 0x98, 0xd4, 0xba, 0x17, 0x06, 0x07, 0x56, 0x81, 0x3a, 0x7d, 0x1d, 0x2e,
+	0x4d, 0x60, 0x47, 0x4d, 0xa8, 0xf4, 0xc8, 0x81, 0x2c, 0x33, 0x75, 0x4b, 0x0c, 0xd1, 0x79, 0x98,
+	0x1e, 0x62, 0x77, 0x40, 0x64, 0x61, 0xa8, 0x59, 0xd1, 0xe4, 0x6e, 0xf9, 0x4e, 0xc9, 0x18, 0xc0,
+	0x85, 0x27, 0xd2, 0x83, 0x34, 0xbf, 0x4f, 0xa2, 0x58, 0x19, 0x0f, 0xe1, 0x62, 0xde, 0x2c, 0x67,
+	0xbe, 0xc7, 0x09, 0x32, 0x01, 0xc9, 0x84, 0xa0, 0xa4, 0x93, 0xad, 0x4a, 0x2f, 0x6a, 0x56, 0xc1,
+	0x8a, 0xf1, 0x43, 0x19, 0x2e, 0x5a, 0x84, 0xfb, 0xee, 0x90, 0x24, 0xa7, 0x75, 0x32, 0xf5, 0xf6,
+	0x6b, 0xa8, 0x60, 0xc6, 0x64, 0x44, 0x1b, 0xed, 0x4f, 0x8f, 0xad, 0xa2, 0x59, 0x42, 0x2b, 0xba,
+	0x0e, 0x0b, 0xb8, 0xbf, 0x47, 0x9d, 0x81, 0x3f, 0xe0, 0xc9, 0xb6, 0x64, 0xe9, 0xae, 0x5b, 0xe3,
+	0x0b, 0x86, 0x0d, 0x97, 0xc6, 0x42, 0x10, 0x87, 0x53, 0xed, 0x0a, 0xa5, 0x5c, 0x57, 0x28, 0x34,
+	0x52, 0x9e, 0x64, 0xe4, 0x8f, 0x12, 0x34, 0xb3, 0x84, 0x8d, 0xd5, 0x2f, 0x42, 0xbd, 0x1f, 0xd3,
+	0xb8, 0x56, 0x92, 0xb7, 0x3e, 0x23, 0x8c, 0x36, 0x88, 0x72, 0xbe, 0x41, 0x5c, 0x84, 0x99, 0xa8,
+	0xf5, 0xc7, 0x1b, 0x8b, 0x67, 0x23, 0x2e, 0x57, 0x73, 0x2e, 0x2f, 0x01, 0xf0, 0x34, 0xdd, 0xb5,
+	0x19, 0xb9, 0xaa, 0x50, 0x90, 0x01, 0x67, 0xa2, 0x72, 0x62, 0x11, 0x3e, 0x70, 0x43, 0x6d, 0x56,
+	0x72, 0x8c, 0xd0, 0x0c, 0x1f, 0xe6, 0x1f, 0x51, 0xb1, 0x87, 0x7d, 0x7e, 0x32, 0xc9, 0xfe, 0x01,
+	0x54, 0x85, 0x31, 0xb1, 0xb1, 0xbd, 0x00, 0x7b, 0x76, 0x97, 0x24, 0xb1, 0x4a, 0xe7, 0x08, 0x41,
+	0x35, 0xc4, 0x0e, 0xd7, 0xca, 0x92, 0x2e, 0xc7, 0xc6, 0xaf, 0xe5, 0xc8, 0xd3, 0x55, 0xc6, 0xf8,
+	0xe9, 0x63, 0x88, 0xe2, 0xaa, 0x56, 0x19, 0xaf, 0x6a, 0x39, 0x97, 0x4f, 0xa7, 0xaa, 0xcd, 0xae,
+	0x32, 0x26, 0x1c, 0x41, 0x37, 0xa1, 0x8a, 0x19, 0x8b, 0x02, 0xde, 0x68, 0x5f, 0x56, 0x1d, 0x8d,
+	0x59, 0xc4, 0x7f, 0xec, 0x92, 0x64, 0xd5, 0x3f, 0x84, 0x7a, 0x4a, 0x7a, 0x95, 0xd9, 0xba, 0x6a,
+	0xf6, 0xbf, 0x69, 0x78, 0x4b, 0xc4, 0x74, 0x57, 0x26, 0xf2, 0x2a, 0x63, 0xf7, 0x49, 0x88, 0xa9,
+	0xcb, 0x3f, 0x1b, 0x90, 0xe0, 0xe0, 0x0d, 0x1f, 0x9d, 0x03, 0x33, 0xd1, 0x3d, 0x88, 0x2b, 0xd2,
+	0xb1, 0x63, 0xac, 0x58, 0x7d, 0x06, 0xac, 0x2a, 0x6f, 0x06, 0x58, 0x15, 0x01, 0x9d, 0xea, 0x09,
+	0x01, 0x9d, 0xc9, 0x58, 0x57, 0x41, 0xd0, 0x33, 0xa3, 0x08, 0xba, 0x00, 0x3f, 0xcc, 0xbe, 0x2e,
+	0x7e, 0xa8, 0x15, 0xe2, 0x87, 0x7e, 0xe1, 0x4d, 0xab, 0xcb, 0x70, 0x7f, 0xa4, 0x26, 0xf0, 0xc4,
+	0x5c, 0x3b, 0x8d, 0x3b, 0xf7, 0xa3, 0x6c, 0xc4, 0xcc, 0xcf, 0x5c, 0x49, 0xbb, 0x84, 0x28, 0x6e,
+	0xa2, 0x5e, 0x47, 0x7a, 0xe4, 0x18, 0xdd, 0x86, 0xd9, 0x1e, 0xf7, 0x3d, 0x8f, 0x84, 0x71, 0xc2,
+	0xea, 0xea, 0xce, 0x36, 0xa3, 0xa5, 0x55, 0xc6, 0x76, 0x19, 0xb1, 0xad, 0x84, 0x15, 0x5d, 0x83,
+	0xaa, 0x40, 0x6f, 0xb2, 0x63, 0x34, 0xda, 0x97, 0x54, 0x91, 0x87, 0xc4, 0xed, 0x27, 0xfc, 0x92,
+	0x09, 0xdd, 0x85, 0x7a, 0x7a, 0xc2, 0x71, 0x0a, 0x2d, 0x8e, 0x18, 0x49, 0x16, 0x13, 0xb1, 0x8c,
+	0x5d, 0xc8, 0x76, 0x68, 0x40, 0x6c, 0x89, 0x3e, 0xa6, 0xc7, 0x65, 0xef, 0x27, 0x8b, 0xa9, 0x6c,
+	0xca, 0x6e, 0xfc, 0x5e, 0x82, 0x2b, 0xd9, 0xd1, 0x24, 0x39, 0xb0, 0x45, 0x42, 0xdc, 0xc1, 0x21,
+	0x3e, 0xfd, 0x4a, 0x7e, 0x15, 0xe6, 0xec, 0x2e, 0xb1, 0x7b, 0x19, 0x12, 0x8f, 0x1e, 0x85, 0x39,
+	0xaa, 0xf1, 0x67, 0x19, 0xe6, 0x46, 0x0f, 0x42, 0x9c, 0xa4, 0x68, 0xe0, 0xc9, 0x49, 0x8a, 0x31,
+	0xda, 0x81, 0x33, 0xc4, 0x1b, 0xd2, 0xc0, 0xf7, 0xc4, 0xbb, 0x25, 0xa9, 0x0b, 0xd7, 0x27, 0x1f,
+	0xa7, 0xb9, 0xae, 0xb0, 0x47, 0x79, 0x39, 0xa2, 0x01, 0x79, 0x00, 0x0c, 0x07, 0xb8, 0x4f, 0x42,
+	0x12, 0x88, 0xcb, 0x5f, 0x39, 0x86, 0xcb, 0x1f, 0x79, 0xb0, 0x93, 0xa8, 0xb5, 0x14, 0x0b, 0xfa,
+	0x33, 0x58, 0x18, 0x73, 0xa9, 0x20, 0xf7, 0x6f, 0xab, 0xb9, 0xdf, 0x68, 0x2f, 0x15, 0xec, 0x50,
+	0x51, 0xa3, 0xde, 0x8d, 0xdf, 0xca, 0xd0, 0x50, 0xf2, 0xb3, 0x30, 0x8c, 0x4b, 0x00, 0x52, 0xe0,
+	0x01, 0x75, 0xe3, 0xbe, 0x5a, 0xb7, 0x14, 0x0a, 0xea, 0x15, 0x04, 0x65, 0xf3, 0x68, 0x41, 0x11,
+	0x2e, 0x15, 0x46, 0x44, 0x60, 0x33, 0x69, 0x9a, 0xc7, 0x75, 0x30, 0x9e, 0xa1, 0xef, 0x60, 0x6e,
+	0x9f, 0xba, 0x64, 0x27, 0x73, 0x64, 0x46, 0x3a, 0xb2, 0x7d, 0x74, 0x47, 0x1e, 0xa8, 0x7a, 0xad,
+	0x9c, 0x19, 0xe3, 0x7d, 0x68, 0xe6, 0xaf, 0xab, 0x70, 0x92, 0xf6, 0xb1, 0x93, 0x46, 0x2b, 0x9e,
+	0x19, 0x3f, 0x95, 0x00, 0x8d, 0x9f, 0xc7, 0xa4, 0xa0, 0xf7, 0xee, 0xf0, 0xe4, 0x61, 0x1b, 0x5d,
+	0x14, 0x85, 0x82, 0x36, 0xa1, 0xd1, 0x21, 0x3c, 0xa4, 0x9e, 0x74, 0x38, 0x2e, 0x22, 0xef, 0x1d,
+	0x7e, 0xf0, 0xf7, 0x33, 0x01, 0x4b, 0x95, 0x36, 0x3e, 0x87, 0xcb, 0x87, 0x72, 0x2b, 0x88, 0xb8,
+	0x34, 0x82, 0x88, 0x0f, 0xc5, 0xd1, 0x06, 0x82, 0x66, 0xbe, 0x1a, 0x19, 0xcf, 0x61, 0x41, 0xc4,
+	0x74, 0xad, 0x8b, 0x83, 0xf0, 0x84, 0x50, 0xee, 0x3d, 0xa8, 0xa7, 0x26, 0x0b, 0x63, 0xad, 0x43,
+	0x6d, 0x98, 0x7c, 0x20, 0x88, 0x60, 0x6e, 0x3a, 0x37, 0x56, 0x01, 0xa9, 0xfe, 0xc6, 0x7d, 0xe3,
+	0x1a, 0x4c, 0xd3, 0x90, 0xf4, 0x13, 0xf0, 0x76, 0x21, 0x5f, 0xee, 0x25, 0xbb, 0x15, 0xf1, 0xb4,
+	0xff, 0x9d, 0x86, 0x85, 0xac, 0xea, 0x8a, 0x5f, 0x6a, 0x13, 0xb4, 0x0d, 0xcd, 0x8d, 0xf8, 0xd3,
+	0x5c, 0xf2, 0x78, 0x41, 0x6f, 0x1f, 0xf2, 0x06, 0xd7, 0x17, 0x8b, 0x17, 0x23, 0x8f, 0x8c, 0x29,
+	0xf4, 0x25, 0xcc, 0x8d, 0xbe, 0x5c, 0xd1, 0x15, 0x55, 0xa2, 0xf0, 0x31, 0xad, 0x1b, 0x87, 0xb1,
+	0xa4, 0xaa, 0x9f, 0xc2, 0x7c, 0xee, 0x19, 0x87, 0x8c, 0xd1, 0x76, 0x5f, 0xf4, 0xcc, 0xd5, 0xdf,
+	0x39, 0x94, 0x27, 0xd5, 0x7e, 0x0f, 0x6a, 0xc9, 0xb3, 0x67, 0x34, 0x02, 0xb9, 0xc7, 0x90, 0xde,
+	0x1c, 0xd5, 0xb7, 0xcf, 0x8d, 0x29, 0xf4, 0x71, 0x24, 0x2c, 0x60, 0xf1, 0xb8, 0xb0, 0x02, 0xf6,
+	0xf5, 0x73, 0x05, 0x00, 0x5b, 0x6e, 0xed, 0xec, 0x86, 0xac, 0xff, 0x31, 0x34, 0x40, 0xef, 0xbe,
+	0x16, 0x8e, 0xd1, 0x8d, 0x3c, 0xdb, 0x38, 0xba, 0x30, 0xa6, 0xd0, 0xcf, 0x25, 0x38, 0xb7, 0x41,
+	0xc2, 0x7c, 0xa7, 0x45, 0x37, 0x8a, 0x8d, 0x4c, 0xe8, 0xc8, 0xfa, 0xe3, 0xa3, 0xde, 0x88, 0x51,
+	0xb5, 0xc6, 0x14, 0xda, 0x91, 0xdb, 0xce, 0x32, 0x1b, 0x5d, 0x2e, 0x4c, 0xe1, 0x34, 0x7a, 0x4b,
+	0x93, 0x96, 0x93, 0xad, 0x7e, 0xb2, 0xfa, 0xd7, 0xcb, 0xa5, 0xd2, 0xdf, 0x2f, 0x97, 0x4a, 0xff,
+	0xbc, 0x5c, 0x2a, 0x7d, 0x75, 0xeb, 0x15, 0xdf, 0xac, 0x95, 0xcf, 0xeb, 0x98, 0x51, 0xdb, 0xa5,
+	0xc4, 0x0b, 0xf7, 0x66, 0xe4, 0x17, 0xea, 0x5b, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x33, 0x5f,
+	0x15, 0x9a, 0x7d, 0x17, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1975,6 +2007,30 @@ func (m *ManifestRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 		i -= len(m.XXX_unrecognized)
 		copy(dAtA[i:], m.XXX_unrecognized)
 	}
+	if len(m.EnabledSourceTypes) > 0 {
+		for k := range m.EnabledSourceTypes {
+			v := m.EnabledSourceTypes[k]
+			baseI := i
+			i--
+			if v {
+				dAtA[i] = 1
+			} else {
+				dAtA[i] = 0
+			}
+			i--
+			dAtA[i] = 0x10
+			i -= len(k)
+			copy(dAtA[i:], k)
+			i = encodeVarintRepository(dAtA, i, uint64(len(k)))
+			i--
+			dAtA[i] = 0xa
+			i = encodeVarintRepository(dAtA, i, uint64(baseI-i))
+			i--
+			dAtA[i] = 0x1
+			i--
+			dAtA[i] = 0xa2
+		}
+	}
 	if len(m.TrackingMethod) > 0 {
 		i -= len(m.TrackingMethod)
 		copy(dAtA[i:], m.TrackingMethod)
@@ -2499,6 +2555,28 @@ func (m *ListAppsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 		i -= len(m.XXX_unrecognized)
 		copy(dAtA[i:], m.XXX_unrecognized)
 	}
+	if len(m.EnabledSourceTypes) > 0 {
+		for k := range m.EnabledSourceTypes {
+			v := m.EnabledSourceTypes[k]
+			baseI := i
+			i--
+			if v {
+				dAtA[i] = 1
+			} else {
+				dAtA[i] = 0
+			}
+			i--
+			dAtA[i] = 0x10
+			i -= len(k)
+			copy(dAtA[i:], k)
+			i = encodeVarintRepository(dAtA, i, uint64(len(k)))
+			i--
+			dAtA[i] = 0xa
+			i = encodeVarintRepository(dAtA, i, uint64(baseI-i))
+			i--
+			dAtA[i] = 0x1a
+		}
+	}
 	if len(m.Revision) > 0 {
 		i -= len(m.Revision)
 		copy(dAtA[i:], m.Revision)
@@ -2591,6 +2669,28 @@ func (m *RepoServerAppDetailsQuery) MarshalToSizedBuffer(dAtA []byte) (int, erro
 		i -= len(m.XXX_unrecognized)
 		copy(dAtA[i:], m.XXX_unrecognized)
 	}
+	if len(m.EnabledSourceTypes) > 0 {
+		for k := range m.EnabledSourceTypes {
+			v := m.EnabledSourceTypes[k]
+			baseI := i
+			i--
+			if v {
+				dAtA[i] = 1
+			} else {
+				dAtA[i] = 0
+			}
+			i--
+			dAtA[i] = 0x10
+			i -= len(k)
+			copy(dAtA[i:], k)
+			i = encodeVarintRepository(dAtA, i, uint64(len(k)))
+			i--
+			dAtA[i] = 0xa
+			i = encodeVarintRepository(dAtA, i, uint64(baseI-i))
+			i--
+			dAtA[i] = 0x4a
+		}
+	}
 	if len(m.TrackingMethod) > 0 {
 		i -= len(m.TrackingMethod)
 		copy(dAtA[i:], m.TrackingMethod)
@@ -3334,6 +3434,14 @@ func (m *ManifestRequest) Size() (n int) {
 	if l > 0 {
 		n += 2 + l + sovRepository(uint64(l))
 	}
+	if len(m.EnabledSourceTypes) > 0 {
+		for k, v := range m.EnabledSourceTypes {
+			_ = k
+			_ = v
+			mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + 1 + 1
+			n += mapEntrySize + 2 + sovRepository(uint64(mapEntrySize))
+		}
+	}
 	if m.XXX_unrecognized != nil {
 		n += len(m.XXX_unrecognized)
 	}
@@ -3507,6 +3615,14 @@ func (m *ListAppsRequest) Size() (n int) {
 	if l > 0 {
 		n += 1 + l + sovRepository(uint64(l))
 	}
+	if len(m.EnabledSourceTypes) > 0 {
+		for k, v := range m.EnabledSourceTypes {
+			_ = k
+			_ = v
+			mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + 1 + 1
+			n += mapEntrySize + 1 + sovRepository(uint64(mapEntrySize))
+		}
+	}
 	if m.XXX_unrecognized != nil {
 		n += len(m.XXX_unrecognized)
 	}
@@ -3571,6 +3687,14 @@ func (m *RepoServerAppDetailsQuery) Size() (n int) {
 	if l > 0 {
 		n += 1 + l + sovRepository(uint64(l))
 	}
+	if len(m.EnabledSourceTypes) > 0 {
+		for k, v := range m.EnabledSourceTypes {
+			_ = k
+			_ = v
+			mapEntrySize := 1 + len(k) + sovRepository(uint64(len(k))) + 1 + 1
+			n += mapEntrySize + 1 + sovRepository(uint64(mapEntrySize))
+		}
+	}
 	if m.XXX_unrecognized != nil {
 		n += len(m.XXX_unrecognized)
 	}
@@ -4364,6 +4488,121 @@ func (m *ManifestRequest) Unmarshal(dAtA []byte) error {
 			}
 			m.TrackingMethod = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
+		case 20:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field EnabledSourceTypes", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowRepository
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthRepository
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthRepository
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.EnabledSourceTypes == nil {
+				m.EnabledSourceTypes = make(map[string]bool)
+			}
+			var mapkey string
+			var mapvalue bool
+			for iNdEx < postIndex {
+				entryPreIndex := iNdEx
+				var wire uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowRepository
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					wire |= uint64(b&0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				fieldNum := int32(wire >> 3)
+				if fieldNum == 1 {
+					var stringLenmapkey uint64
+					for shift := uint(0); ; shift += 7 {
+						if shift >= 64 {
+							return ErrIntOverflowRepository
+						}
+						if iNdEx >= l {
+							return io.ErrUnexpectedEOF
+						}
+						b := dAtA[iNdEx]
+						iNdEx++
+						stringLenmapkey |= uint64(b&0x7F) << shift
+						if b < 0x80 {
+							break
+						}
+					}
+					intStringLenmapkey := int(stringLenmapkey)
+					if intStringLenmapkey < 0 {
+						return ErrInvalidLengthRepository
+					}
+					postStringIndexmapkey := iNdEx + intStringLenmapkey
+					if postStringIndexmapkey < 0 {
+						return ErrInvalidLengthRepository
+					}
+					if postStringIndexmapkey > l {
+						return io.ErrUnexpectedEOF
+					}
+					mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+					iNdEx = postStringIndexmapkey
+				} else if fieldNum == 2 {
+					var mapvaluetemp int
+					for shift := uint(0); ; shift += 7 {
+						if shift >= 64 {
+							return ErrIntOverflowRepository
+						}
+						if iNdEx >= l {
+							return io.ErrUnexpectedEOF
+						}
+						b := dAtA[iNdEx]
+						iNdEx++
+						mapvaluetemp |= int(b&0x7F) << shift
+						if b < 0x80 {
+							break
+						}
+					}
+					mapvalue = bool(mapvaluetemp != 0)
+				} else {
+					iNdEx = entryPreIndex
+					skippy, err := skipRepository(dAtA[iNdEx:])
+					if err != nil {
+						return err
+					}
+					if (skippy < 0) || (iNdEx+skippy) < 0 {
+						return ErrInvalidLengthRepository
+					}
+					if (iNdEx + skippy) > postIndex {
+						return io.ErrUnexpectedEOF
+					}
+					iNdEx += skippy
+				}
+			}
+			m.EnabledSourceTypes[mapkey] = mapvalue
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipRepository(dAtA[iNdEx:])
@@ -5356,6 +5595,121 @@ func (m *ListAppsRequest) Unmarshal(dAtA []byte) error {
 			}
 			m.Revision = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field EnabledSourceTypes", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowRepository
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthRepository
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthRepository
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.EnabledSourceTypes == nil {
+				m.EnabledSourceTypes = make(map[string]bool)
+			}
+			var mapkey string
+			var mapvalue bool
+			for iNdEx < postIndex {
+				entryPreIndex := iNdEx
+				var wire uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowRepository
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					wire |= uint64(b&0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				fieldNum := int32(wire >> 3)
+				if fieldNum == 1 {
+					var stringLenmapkey uint64
+					for shift := uint(0); ; shift += 7 {
+						if shift >= 64 {
+							return ErrIntOverflowRepository
+						}
+						if iNdEx >= l {
+							return io.ErrUnexpectedEOF
+						}
+						b := dAtA[iNdEx]
+						iNdEx++
+						stringLenmapkey |= uint64(b&0x7F) << shift
+						if b < 0x80 {
+							break
+						}
+					}
+					intStringLenmapkey := int(stringLenmapkey)
+					if intStringLenmapkey < 0 {
+						return ErrInvalidLengthRepository
+					}
+					postStringIndexmapkey := iNdEx + intStringLenmapkey
+					if postStringIndexmapkey < 0 {
+						return ErrInvalidLengthRepository
+					}
+					if postStringIndexmapkey > l {
+						return io.ErrUnexpectedEOF
+					}
+					mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+					iNdEx = postStringIndexmapkey
+				} else if fieldNum == 2 {
+					var mapvaluetemp int
+					for shift := uint(0); ; shift += 7 {
+						if shift >= 64 {
+							return ErrIntOverflowRepository
+						}
+						if iNdEx >= l {
+							return io.ErrUnexpectedEOF
+						}
+						b := dAtA[iNdEx]
+						iNdEx++
+						mapvaluetemp |= int(b&0x7F) << shift
+						if b < 0x80 {
+							break
+						}
+					}
+					mapvalue = bool(mapvaluetemp != 0)
+				} else {
+					iNdEx = entryPreIndex
+					skippy, err := skipRepository(dAtA[iNdEx:])
+					if err != nil {
+						return err
+					}
+					if (skippy < 0) || (iNdEx+skippy) < 0 {
+						return ErrInvalidLengthRepository
+					}
+					if (iNdEx + skippy) > postIndex {
+						return io.ErrUnexpectedEOF
+					}
+					iNdEx += skippy
+				}
+			}
+			m.EnabledSourceTypes[mapkey] = mapvalue
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipRepository(dAtA[iNdEx:])
@@ -5831,6 +6185,121 @@ func (m *RepoServerAppDetailsQuery) Unmarshal(dAtA []byte) error {
 			}
 			m.TrackingMethod = string(dAtA[iNdEx:postIndex])
 			iNdEx = postIndex
+		case 9:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field EnabledSourceTypes", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowRepository
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthRepository
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthRepository
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.EnabledSourceTypes == nil {
+				m.EnabledSourceTypes = make(map[string]bool)
+			}
+			var mapkey string
+			var mapvalue bool
+			for iNdEx < postIndex {
+				entryPreIndex := iNdEx
+				var wire uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowRepository
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					wire |= uint64(b&0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				fieldNum := int32(wire >> 3)
+				if fieldNum == 1 {
+					var stringLenmapkey uint64
+					for shift := uint(0); ; shift += 7 {
+						if shift >= 64 {
+							return ErrIntOverflowRepository
+						}
+						if iNdEx >= l {
+							return io.ErrUnexpectedEOF
+						}
+						b := dAtA[iNdEx]
+						iNdEx++
+						stringLenmapkey |= uint64(b&0x7F) << shift
+						if b < 0x80 {
+							break
+						}
+					}
+					intStringLenmapkey := int(stringLenmapkey)
+					if intStringLenmapkey < 0 {
+						return ErrInvalidLengthRepository
+					}
+					postStringIndexmapkey := iNdEx + intStringLenmapkey
+					if postStringIndexmapkey < 0 {
+						return ErrInvalidLengthRepository
+					}
+					if postStringIndexmapkey > l {
+						return io.ErrUnexpectedEOF
+					}
+					mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+					iNdEx = postStringIndexmapkey
+				} else if fieldNum == 2 {
+					var mapvaluetemp int
+					for shift := uint(0); ; shift += 7 {
+						if shift >= 64 {
+							return ErrIntOverflowRepository
+						}
+						if iNdEx >= l {
+							return io.ErrUnexpectedEOF
+						}
+						b := dAtA[iNdEx]
+						iNdEx++
+						mapvaluetemp |= int(b&0x7F) << shift
+						if b < 0x80 {
+							break
+						}
+					}
+					mapvalue = bool(mapvaluetemp != 0)
+				} else {
+					iNdEx = entryPreIndex
+					skippy, err := skipRepository(dAtA[iNdEx:])
+					if err != nil {
+						return err
+					}
+					if (skippy < 0) || (iNdEx+skippy) < 0 {
+						return ErrInvalidLengthRepository
+					}
+					if (iNdEx + skippy) > postIndex {
+						return io.ErrUnexpectedEOF
+					}
+					iNdEx += skippy
+				}
+			}
+			m.EnabledSourceTypes[mapkey] = mapvalue
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipRepository(dAtA[iNdEx:])
diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go
index 437a5df9a..f7afc3f3c 100644
--- a/reposerver/repository/repository.go
+++ b/reposerver/repository/repository.go
@@ -158,7 +158,7 @@ func (s *Service) ListApps(ctx context.Context, q *apiclient.ListAppsRequest) (*
 	}
 
 	defer io.Close(closer)
-	apps, err := discovery.Discover(ctx, gitClient.Root())
+	apps, err := discovery.Discover(ctx, gitClient.Root(), q.EnabledSourceTypes)
 	if err != nil {
 		return nil, err
 	}
@@ -870,7 +870,7 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string,
 	var dest *v1alpha1.ApplicationDestination
 
 	resourceTracking := argo.NewResourceTracking()
-	appSourceType, err := GetAppSourceType(ctx, q.ApplicationSource, appPath, q.AppName)
+	appSourceType, err := GetAppSourceType(ctx, q.ApplicationSource, appPath, q.AppName, q.EnabledSourceTypes)
 	if err != nil {
 		return nil, err
 	}
@@ -906,7 +906,7 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string,
 		if directory = q.ApplicationSource.Directory; directory == nil {
 			directory = &v1alpha1.ApplicationSourceDirectory{}
 		}
-		targetObjs, err = findManifests(appPath, repoRoot, env, *directory)
+		targetObjs, err = findManifests(appPath, repoRoot, env, *directory, q.EnabledSourceTypes)
 	}
 	if err != nil {
 		return nil, err
@@ -1029,7 +1029,7 @@ func mergeSourceParameters(source *v1alpha1.ApplicationSource, path, appName str
 }
 
 // GetAppSourceType returns explicit application source type or examines a directory and determines its application source type
-func GetAppSourceType(ctx context.Context, source *v1alpha1.ApplicationSource, path, appName string) (v1alpha1.ApplicationSourceType, error) {
+func GetAppSourceType(ctx context.Context, source *v1alpha1.ApplicationSource, path, appName string, enableGenerateManifests map[string]bool) (v1alpha1.ApplicationSourceType, error) {
 	err := mergeSourceParameters(source, path, appName)
 	if err != nil {
 		return "", fmt.Errorf("error while parsing source parameters: %v", err)
@@ -1040,9 +1040,13 @@ func GetAppSourceType(ctx context.Context, source *v1alpha1.ApplicationSource, p
 		return "", err
 	}
 	if appSourceType != nil {
+		if !discovery.IsManifestGenerationEnabled(*appSourceType, enableGenerateManifests) {
+			log.Debugf("Manifest generation is disabled for '%s'. Assuming plain YAML manifest.", *appSourceType)
+			return v1alpha1.ApplicationSourceTypeDirectory, nil
+		}
 		return *appSourceType, nil
 	}
-	appType, err := discovery.AppType(ctx, path)
+	appType, err := discovery.AppType(ctx, path, enableGenerateManifests)
 	if err != nil {
 		return "", err
 	}
@@ -1104,7 +1108,7 @@ func ksShow(appLabelKey, appPath string, ksonnetOpts *v1alpha1.ApplicationSource
 var manifestFile = regexp.MustCompile(`^.*\.(yaml|yml|json|jsonnet)$`)
 
 // findManifests looks at all yaml files in a directory and unmarshals them into a list of unstructured objects
-func findManifests(appPath string, repoRoot string, env *v1alpha1.Env, directory v1alpha1.ApplicationSourceDirectory) ([]*unstructured.Unstructured, error) {
+func findManifests(appPath string, repoRoot string, env *v1alpha1.Env, directory v1alpha1.ApplicationSourceDirectory, enabledManifestGeneration map[string]bool) ([]*unstructured.Unstructured, error) {
 	var objs []*unstructured.Unstructured
 	err := filepath.Walk(appPath, func(path string, f os.FileInfo, err error) error {
 		if err != nil {
@@ -1135,6 +1139,9 @@ func findManifests(appPath string, repoRoot string, env *v1alpha1.Env, directory
 		}
 
 		if strings.HasSuffix(f.Name(), ".jsonnet") {
+			if !discovery.IsManifestGenerationEnabled(v1alpha1.ApplicationSourceTypeDirectory, enabledManifestGeneration) {
+				return nil
+			}
 			vm, err := makeJsonnetVm(appPath, repoRoot, directory.Jsonnet, env)
 			if err != nil {
 				return err
@@ -1394,7 +1401,7 @@ func (s *Service) GetAppDetails(ctx context.Context, q *apiclient.RepoServerAppD
 			return err
 		}
 
-		appSourceType, err := GetAppSourceType(ctx, q.Source, opContext.appPath, q.AppName)
+		appSourceType, err := GetAppSourceType(ctx, q.Source, opContext.appPath, q.AppName, q.EnabledSourceTypes)
 		if err != nil {
 			return err
 		}
diff --git a/reposerver/repository/repository.proto b/reposerver/repository/repository.proto
index c9fb0a3e0..44fb200a5 100644
--- a/reposerver/repository/repository.proto
+++ b/reposerver/repository/repository.proto
@@ -29,6 +29,7 @@ message ManifestRequest {
     repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RepoCreds helmRepoCreds = 17;
     bool noRevisionCache = 18;
     string trackingMethod = 19;
+    map<string, bool> enabledSourceTypes = 20;
 }
 
 // TestRepositoryRequest is a query to test repository is valid or not and has valid access.
@@ -81,6 +82,7 @@ message Refs {
 message ListAppsRequest {
     github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
     string revision = 2;
+    map<string, bool> enabledSourceTypes = 3;
 }
 
 // AppList returns the contents of the repo of a ListApps request
@@ -98,6 +100,7 @@ message RepoServerAppDetailsQuery {
     bool noCache = 6;
     bool noRevisionCache = 7;
     string trackingMethod = 8;
+    map<string, bool> enabledSourceTypes = 9;
 }
 
 // RepoAppDetailsResponse application details
diff --git a/server/application/application.go b/server/application/application.go
index fdc93b13f..1ea32bd43 100644
--- a/server/application/application.go
+++ b/server/application/application.go
@@ -230,6 +230,7 @@ func (s *Server) queryRepoServer(ctx context.Context, a *v1alpha1.Application, a
 	helmRepos []*appv1.Repository,
 	helmCreds []*v1alpha1.RepoCreds,
 	kustomizeOptions *v1alpha1.KustomizeOptions,
+	enabledSourceTypes map[string]bool,
 ) error) error {
 
 	closer, client, err := s.repoClientset.NewRepoServerClient()
@@ -274,7 +275,11 @@ func (s *Server) queryRepoServer(ctx context.Context, a *v1alpha1.Application, a
 	if err != nil {
 		return err
 	}
-	return action(client, repo, permittedHelmRepos, permittedHelmCredentials, kustomizeOptions)
+	enabledSourceTypes, err := s.settingsMgr.GetEnabledSourceTypes()
+	if err != nil {
+		return err
+	}
+	return action(client, repo, permittedHelmRepos, permittedHelmCredentials, kustomizeOptions, enabledSourceTypes)
 }
 
 // GetManifests returns application manifests
@@ -289,7 +294,7 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan
 
 	var manifestInfo *apiclient.ManifestResponse
 	err = s.queryRepoServer(ctx, a, func(
-		client apiclient.RepoServerServiceClient, repo *appv1.Repository, helmRepos []*appv1.Repository, helmCreds []*appv1.RepoCreds, kustomizeOptions *appv1.KustomizeOptions) error {
+		client apiclient.RepoServerServiceClient, repo *appv1.Repository, helmRepos []*appv1.Repository, helmCreds []*appv1.RepoCreds, kustomizeOptions *appv1.KustomizeOptions, enableGenerateManifests map[string]bool) error {
 		revision := a.Spec.Source.TargetRevision
 		if q.Revision != "" {
 			revision = q.Revision
@@ -319,19 +324,20 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan
 		}
 
 		manifestInfo, err = client.GenerateManifest(ctx, &apiclient.ManifestRequest{
-			Repo:              repo,
-			Revision:          revision,
-			AppLabelKey:       appInstanceLabelKey,
-			AppName:           a.Name,
-			Namespace:         a.Spec.Destination.Namespace,
-			ApplicationSource: &a.Spec.Source,
-			Repos:             helmRepos,
-			Plugins:           plugins,
-			KustomizeOptions:  kustomizeOptions,
-			KubeVersion:       serverVersion,
-			ApiVersions:       argo.APIResourcesToStrings(apiResources, true),
-			HelmRepoCreds:     helmCreds,
-			TrackingMethod:    string(argoutil.GetTrackingMethod(s.settingsMgr)),
+			Repo:               repo,
+			Revision:           revision,
+			AppLabelKey:        appInstanceLabelKey,
+			AppName:            a.Name,
+			Namespace:          a.Spec.Destination.Namespace,
+			ApplicationSource:  &a.Spec.Source,
+			Repos:              helmRepos,
+			Plugins:            plugins,
+			KustomizeOptions:   kustomizeOptions,
+			KubeVersion:        serverVersion,
+			ApiVersions:        argo.APIResourcesToStrings(apiResources, true),
+			HelmRepoCreds:      helmCreds,
+			TrackingMethod:     string(argoutil.GetTrackingMethod(s.settingsMgr)),
+			EnabledSourceTypes: enableGenerateManifests,
 		})
 		return err
 	})
@@ -407,15 +413,17 @@ func (s *Server) Get(ctx context.Context, q *application.ApplicationQuery) (*app
 			helmRepos []*appv1.Repository,
 			_ []*appv1.RepoCreds,
 			kustomizeOptions *appv1.KustomizeOptions,
+			enabledSourceTypes map[string]bool,
 		) error {
 			_, err := client.GetAppDetails(ctx, &apiclient.RepoServerAppDetailsQuery{
-				Repo:             repo,
-				Source:           &app.Spec.Source,
-				AppName:          app.Name,
-				KustomizeOptions: kustomizeOptions,
-				Repos:            helmRepos,
-				NoCache:          true,
-				TrackingMethod:   string(argoutil.GetTrackingMethod(s.settingsMgr)),
+				Repo:               repo,
+				Source:             &app.Spec.Source,
+				AppName:            app.Name,
+				KustomizeOptions:   kustomizeOptions,
+				Repos:              helmRepos,
+				NoCache:            true,
+				TrackingMethod:     string(argoutil.GetTrackingMethod(s.settingsMgr)),
+				EnabledSourceTypes: enabledSourceTypes,
 			})
 			return err
 		}); err != nil {
diff --git a/util/app/discovery/discovery.go b/util/app/discovery/discovery.go
index 79cd3b522..5036546e9 100644
--- a/util/app/discovery/discovery.go
+++ b/util/app/discovery/discovery.go
@@ -17,7 +17,18 @@ import (
 	"github.com/argoproj/argo-cd/v2/util/kustomize"
 )
 
-func Discover(ctx context.Context, root string) (map[string]string, error) {
+func IsManifestGenerationEnabled(sourceType v1alpha1.ApplicationSourceType, enableGenerateManifests map[string]bool) bool {
+	if enableGenerateManifests == nil {
+		return true
+	}
+	enabled, ok := enableGenerateManifests[string(sourceType)]
+	if !ok {
+		return true
+	}
+	return enabled
+}
+
+func Discover(ctx context.Context, root string, enableGenerateManifests map[string]bool) (map[string]string, error) {
 	apps := make(map[string]string)
 
 	// Check if it is CMP
@@ -42,13 +53,13 @@ func Discover(ctx context.Context, root string) (map[string]string, error) {
 			return err
 		}
 		base := filepath.Base(path)
-		if base == "params.libsonnet" && strings.HasSuffix(dir, "components") {
+		if base == "params.libsonnet" && strings.HasSuffix(dir, "components") && IsManifestGenerationEnabled(v1alpha1.ApplicationSourceTypeKsonnet, enableGenerateManifests) {
 			apps[filepath.Dir(dir)] = string(v1alpha1.ApplicationSourceTypeKsonnet)
 		}
-		if strings.HasSuffix(base, "Chart.yaml") {
+		if strings.HasSuffix(base, "Chart.yaml") && IsManifestGenerationEnabled(v1alpha1.ApplicationSourceTypeHelm, enableGenerateManifests) {
 			apps[dir] = string(v1alpha1.ApplicationSourceTypeHelm)
 		}
-		if kustomize.IsKustomization(base) {
+		if kustomize.IsKustomization(base) && IsManifestGenerationEnabled(v1alpha1.ApplicationSourceTypeKustomize, enableGenerateManifests) {
 			apps[dir] = string(v1alpha1.ApplicationSourceTypeKustomize)
 		}
 		return nil
@@ -56,8 +67,8 @@ func Discover(ctx context.Context, root string) (map[string]string, error) {
 	return apps, err
 }
 
-func AppType(ctx context.Context, path string) (string, error) {
-	apps, err := Discover(ctx, path)
+func AppType(ctx context.Context, path string, enableGenerateManifests map[string]bool) (string, error) {
+	apps, err := Discover(ctx, path, enableGenerateManifests)
 	if err != nil {
 		return "", err
 	}
diff --git a/util/argo/argo.go b/util/argo/argo.go
index 4eb7a031a..a7988927d 100644
--- a/util/argo/argo.go
+++ b/util/argo/argo.go
@@ -275,8 +275,12 @@ func ValidateRepo(
 	if err != nil {
 		return nil, err
 	}
+	enabledSourceTypes, err := settingsMgr.GetEnabledSourceTypes()
+	if err != nil {
+		return nil, err
+	}
 	conditions = append(conditions, verifyGenerateManifests(
-		ctx, repo, permittedHelmRepos, app, repoClient, kustomizeOptions, plugins, cluster.ServerVersion, APIResourcesToStrings(apiGroups, true), permittedHelmCredentials, settingsMgr)...)
+		ctx, repo, permittedHelmRepos, app, repoClient, kustomizeOptions, plugins, cluster.ServerVersion, APIResourcesToStrings(apiGroups, true), permittedHelmCredentials, enabledSourceTypes, settingsMgr)...)
 
 	return conditions, nil
 }
@@ -466,19 +470,7 @@ func GetAppProject(spec *argoappv1.ApplicationSpec, projLister applicationsv1.Ap
 }
 
 // verifyGenerateManifests verifies a repo path can generate manifests
-func verifyGenerateManifests(
-	ctx context.Context,
-	repoRes *argoappv1.Repository,
-	helmRepos argoappv1.Repositories,
-	app *argoappv1.Application,
-	repoClient apiclient.RepoServerServiceClient,
-	kustomizeOptions *argoappv1.KustomizeOptions,
-	plugins []*argoappv1.ConfigManagementPlugin,
-	kubeVersion string,
-	apiVersions []string,
-	repositoryCredentials []*argoappv1.RepoCreds,
-	settingsMgr *settings.SettingsManager,
-) []argoappv1.ApplicationCondition {
+func verifyGenerateManifests(ctx context.Context, repoRes *argoappv1.Repository, helmRepos argoappv1.Repositories, app *argoappv1.Application, repoClient apiclient.RepoServerServiceClient, kustomizeOptions *argoappv1.KustomizeOptions, plugins []*argoappv1.ConfigManagementPlugin, kubeVersion string, apiVersions []string, repositoryCredentials []*argoappv1.RepoCreds, enableGenerateManifests map[string]bool, settingsMgr *settings.SettingsManager) []argoappv1.ApplicationCondition {
 	spec := &app.Spec
 	var conditions []argoappv1.ApplicationCondition
 	if spec.Destination.Server == "" {
@@ -495,18 +487,19 @@ func verifyGenerateManifests(
 			Name:  repoRes.Name,
 			Proxy: repoRes.Proxy,
 		},
-		Repos:             helmRepos,
-		Revision:          spec.Source.TargetRevision,
-		AppName:           app.Name,
-		Namespace:         spec.Destination.Namespace,
-		ApplicationSource: &spec.Source,
-		Plugins:           plugins,
-		KustomizeOptions:  kustomizeOptions,
-		KubeVersion:       kubeVersion,
-		ApiVersions:       apiVersions,
-		HelmRepoCreds:     repositoryCredentials,
-		TrackingMethod:    string(GetTrackingMethod(settingsMgr)),
-		NoRevisionCache:   true,
+		Repos:              helmRepos,
+		Revision:           spec.Source.TargetRevision,
+		AppName:            app.Name,
+		Namespace:          spec.Destination.Namespace,
+		ApplicationSource:  &spec.Source,
+		Plugins:            plugins,
+		KustomizeOptions:   kustomizeOptions,
+		KubeVersion:        kubeVersion,
+		ApiVersions:        apiVersions,
+		HelmRepoCreds:      repositoryCredentials,
+		TrackingMethod:     string(GetTrackingMethod(settingsMgr)),
+		EnabledSourceTypes: enableGenerateManifests,
+		NoRevisionCache:    true,
 	}
 	req.Repo.CopyCredentialsFromRepo(repoRes)
 	req.Repo.CopySettingsFrom(repoRes)
diff --git a/util/settings/settings.go b/util/settings/settings.go
index bfddf3ff3..801b2bba4 100644
--- a/util/settings/settings.go
+++ b/util/settings/settings.go
@@ -398,6 +398,15 @@ const (
 	inClusterEnabledKey = "cluster.inClusterEnabled"
 )
 
+var (
+	sourceTypeToEnableGenerationKey = map[v1alpha1.ApplicationSourceType]string{
+		v1alpha1.ApplicationSourceTypeKustomize: "kustomize.enable",
+		v1alpha1.ApplicationSourceTypeHelm:      "helm.enable",
+		v1alpha1.ApplicationSourceTypeDirectory: "jsonnet.enable",
+		v1alpha1.ApplicationSourceTypeKsonnet:   "ksonnet.enable",
+	}
+)
+
 // SettingsManager holds config info for a new manager with which to access Kubernetes ConfigMaps.
 type SettingsManager struct {
 	ctx             context.Context
@@ -653,6 +662,25 @@ func (mgr *SettingsManager) GetConfigManagementPlugins() ([]v1alpha1.ConfigManag
 	return plugins, nil
 }
 
+func (mgr *SettingsManager) GetEnabledSourceTypes() (map[string]bool, error) {
+	argoCDCM, err := mgr.getConfigMap()
+	if err != nil {
+		return nil, err
+	}
+	res := map[string]bool{}
+	for sourceType := range sourceTypeToEnableGenerationKey {
+		res[string(sourceType)] = true
+	}
+	for sourceType, key := range sourceTypeToEnableGenerationKey {
+		if val, ok := argoCDCM.Data[key]; ok && val != "" {
+			res[string(sourceType)] = val == "true"
+		}
+	}
+	// plugin based manifest generation cannot be disabled
+	res[string(v1alpha1.ApplicationSourceTypePlugin)] = true
+	return res, nil
+}
+
 // GetResourceOverrides loads Resource Overrides from argocd-cm ConfigMap
 func (mgr *SettingsManager) GetResourceOverrides() (map[string]v1alpha1.ResourceOverride, error) {
 	argoCDCM, err := mgr.getConfigMap()


Test patch:
diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go
index bac3152d2..e541e01ca 100644
--- a/reposerver/repository/repository_test.go
+++ b/reposerver/repository/repository_test.go
@@ -982,15 +982,15 @@ func TestGenerateNullList(t *testing.T) {
 }
 
 func TestIdentifyAppSourceTypeByAppDirWithKustomizations(t *testing.T) {
-	sourceType, err := GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/kustomization_yaml", "testapp")
+	sourceType, err := GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/kustomization_yaml", "testapp", map[string]bool{})
 	assert.Nil(t, err)
 	assert.Equal(t, argoappv1.ApplicationSourceTypeKustomize, sourceType)
 
-	sourceType, err = GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/kustomization_yml", "testapp")
+	sourceType, err = GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/kustomization_yml", "testapp", map[string]bool{})
 	assert.Nil(t, err)
 	assert.Equal(t, argoappv1.ApplicationSourceTypeKustomize, sourceType)
 
-	sourceType, err = GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/Kustomization", "testapp")
+	sourceType, err = GetAppSourceType(context.Background(), &argoappv1.ApplicationSource{}, "./testdata/Kustomization", "testapp", map[string]bool{})
 	assert.Nil(t, err)
 	assert.Equal(t, argoappv1.ApplicationSourceTypeKustomize, sourceType)
 }
@@ -1609,7 +1609,7 @@ func TestFindResources(t *testing.T) {
 				Recurse: true,
 				Include: tc.include,
 				Exclude: tc.exclude,
-			})
+			}, map[string]bool{})
 			if !assert.NoError(t, err) {
 				return
 			}
@@ -1626,7 +1626,7 @@ func TestFindManifests_Exclude(t *testing.T) {
 	objs, err := findManifests("testdata/app-include-exclude", ".", nil, argoappv1.ApplicationSourceDirectory{
 		Recurse: true,
 		Exclude: "subdir/deploymentSub.yaml",
-	})
+	}, map[string]bool{})
 
 	if !assert.NoError(t, err) || !assert.Len(t, objs, 1) {
 		return
@@ -1639,7 +1639,7 @@ func TestFindManifests_Exclude_NothingMatches(t *testing.T) {
 	objs, err := findManifests("testdata/app-include-exclude", ".", nil, argoappv1.ApplicationSourceDirectory{
 		Recurse: true,
 		Exclude: "nothing.yaml",
-	})
+	}, map[string]bool{})
 
 	if !assert.NoError(t, err) || !assert.Len(t, objs, 2) {
 		return
diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go
index f7f742db3..64fc5e1ae 100644
--- a/test/e2e/app_management_test.go
+++ b/test/e2e/app_management_test.go
@@ -1826,3 +1826,29 @@ func TestDiscoverNewCommit(t *testing.T) {
 			assert.NotEqual(t, sha, app.Status.Sync.Revision)
 		})
 }
+
+func TestDisableManifestGeneration(t *testing.T) {
+	Given(t).
+		Path("guestbook").
+		When().
+		CreateApp().
+		Refresh(RefreshTypeHard).
+		Then().
+		And(func(app *Application) {
+			assert.Equal(t, app.Status.SourceType, ApplicationSourceTypeKustomize)
+		}).
+		When().
+		And(func() {
+			SetEnableManifestGeneration(map[ApplicationSourceType]bool{
+				ApplicationSourceTypeKustomize: false,
+			})
+		}).
+		Refresh(RefreshTypeHard).
+		Then().
+		And(func(app *Application) {
+			time.Sleep(1 * time.Second)
+		}).
+		And(func(app *Application) {
+			assert.Equal(t, app.Status.SourceType, ApplicationSourceTypeDirectory)
+		})
+}
diff --git a/test/e2e/fixture/fixture.go b/test/e2e/fixture/fixture.go
index 9589e7c13..39bf7a1bb 100644
--- a/test/e2e/fixture/fixture.go
+++ b/test/e2e/fixture/fixture.go
@@ -324,6 +324,15 @@ func updateGenericConfigMap(name string, updater func(cm *corev1.ConfigMap) erro
 	errors.CheckError(err)
 }
 
+func SetEnableManifestGeneration(val map[v1alpha1.ApplicationSourceType]bool) {
+	updateSettingConfigMap(func(cm *corev1.ConfigMap) error {
+		for k, v := range val {
+			cm.Data[fmt.Sprintf("%s.enable", strings.ToLower(string(k)))] = strconv.FormatBool(v)
+		}
+		return nil
+	})
+}
+
 func SetResourceOverrides(overrides map[string]v1alpha1.ResourceOverride) {
 	updateSettingConfigMap(func(cm *corev1.ConfigMap) error {
 		if len(overrides) > 0 {
diff --git a/util/app/discovery/discovery_test.go b/util/app/discovery/discovery_test.go
index b06abaa93..8604d6146 100644
--- a/util/app/discovery/discovery_test.go
+++ b/util/app/discovery/discovery_test.go
@@ -4,11 +4,13 @@ import (
 	"context"
 	"testing"
 
+	"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
+
 	"github.com/stretchr/testify/assert"
 )
 
 func TestDiscover(t *testing.T) {
-	apps, err := Discover(context.Background(), "./testdata")
+	apps, err := Discover(context.Background(), "./testdata", map[string]bool{})
 	assert.NoError(t, err)
 	assert.Equal(t, map[string]string{
 		"foo": "Kustomize",
@@ -18,19 +20,42 @@ func TestDiscover(t *testing.T) {
 }
 
 func TestAppType(t *testing.T) {
-	appType, err := AppType(context.Background(), "./testdata/foo")
+	appType, err := AppType(context.Background(), "./testdata/foo", map[string]bool{})
 	assert.NoError(t, err)
 	assert.Equal(t, "Kustomize", appType)
 
-	appType, err = AppType(context.Background(), "./testdata/bar")
+	appType, err = AppType(context.Background(), "./testdata/bar", map[string]bool{})
 	assert.NoError(t, err)
 	assert.Equal(t, "Ksonnet", appType)
 
-	appType, err = AppType(context.Background(), "./testdata/baz")
+	appType, err = AppType(context.Background(), "./testdata/baz", map[string]bool{})
 	assert.NoError(t, err)
 	assert.Equal(t, "Helm", appType)
 
-	appType, err = AppType(context.Background(), "./testdata")
+	appType, err = AppType(context.Background(), "./testdata", map[string]bool{})
+	assert.NoError(t, err)
+	assert.Equal(t, "Directory", appType)
+}
+
+func TestAppType_Disabled(t *testing.T) {
+	enableManifestGeneration := map[string]bool{
+		string(v1alpha1.ApplicationSourceTypeKustomize): false,
+		string(v1alpha1.ApplicationSourceTypeKsonnet):   false,
+		string(v1alpha1.ApplicationSourceTypeHelm):      false,
+	}
+	appType, err := AppType(context.Background(), "./testdata/foo", enableManifestGeneration)
+	assert.NoError(t, err)
+	assert.Equal(t, "Directory", appType)
+
+	appType, err = AppType(context.Background(), "./testdata/bar", enableManifestGeneration)
+	assert.NoError(t, err)
+	assert.Equal(t, "Directory", appType)
+
+	appType, err = AppType(context.Background(), "./testdata/baz", enableManifestGeneration)
+	assert.NoError(t, err)
+	assert.Equal(t, "Directory", appType)
+
+	appType, err = AppType(context.Background(), "./testdata", enableManifestGeneration)
 	assert.NoError(t, err)
 	assert.Equal(t, "Directory", appType)
 }
diff --git a/util/settings/settings_test.go b/util/settings/settings_test.go
index 7701a27b7..7852f39ea 100644
--- a/util/settings/settings_test.go
+++ b/util/settings/settings_test.go
@@ -12,6 +12,7 @@ import (
 	testutil "github.com/argoproj/argo-cd/v2/test"
 
 	"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"
@@ -1026,3 +1027,60 @@ requestedIDTokenClaims: {"groups": {"essential": true}}`,
 	oidcConfig := settings.OIDCConfig()
 	assert.Equal(t, oidcConfig.ClientSecret, "deadbeef")
 }
+
+func TestGetEnableManifestGeneration(t *testing.T) {
+	testCases := []struct {
+		name    string
+		enabled bool
+		data    map[string]string
+		source  string
+	}{{
+		name:    "default",
+		enabled: true,
+		data:    map[string]string{},
+		source:  string(v1alpha1.ApplicationSourceTypeKustomize),
+	}, {
+		name:    "disabled",
+		enabled: false,
+		data:    map[string]string{"kustomize.enable": `false`},
+		source:  string(v1alpha1.ApplicationSourceTypeKustomize),
+	}, {
+		name:    "enabled",
+		enabled: true,
+		data:    map[string]string{"kustomize.enable": `true`},
+		source:  string(v1alpha1.ApplicationSourceTypeKustomize),
+	}}
+	for i := range testCases {
+		tc := testCases[i]
+		t.Run(tc.name, func(t *testing.T) {
+			cm := &v1.ConfigMap{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      common.ArgoCDConfigMapName,
+					Namespace: "default",
+					Labels: map[string]string{
+						"app.kubernetes.io/part-of": "argocd",
+					},
+				},
+				Data: tc.data,
+			}
+			argocdSecret := &v1.Secret{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      common.ArgoCDSecretName,
+					Namespace: "default",
+				},
+				Data: map[string][]byte{
+					"admin.password":   nil,
+					"server.secretkey": nil,
+				},
+			}
+
+			kubeClient := fake.NewSimpleClientset(cm, argocdSecret)
+			settingsManager := NewSettingsManager(context.Background(), kubeClient, "default")
+
+			enableManifestGeneration, err := settingsManager.GetEnabledSourceTypes()
+			require.NoError(t, err)
+
+			assert.Equal(t, enableManifestGeneration[tc.source], tc.enabled)
+		})
+	}
+}