From 080a1cb0694f787882d787cdc41bab20b0641b24 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Fri, 17 Sep 2021 00:45:59 -0700 Subject: [PATCH 1/9] step 1 --- .../v1alpha1/integration_utils_test.go | 337 +++++++++++ .../fluxv2/packages/v1alpha1/release.go | 45 +- .../v1alpha1/release_integration_test.go | 550 ++++++------------ .../fluxv2/packages/v1alpha1/release_test.go | 52 +- .../fluxv2/packages/v1alpha1/server.go | 4 +- 5 files changed, 586 insertions(+), 402 deletions(-) create mode 100644 cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go new file mode 100644 index 00000000000..96e1dd99e58 --- /dev/null +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go @@ -0,0 +1,337 @@ +/* +Copyright © 2021 VMware +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import ( + "context" + "fmt" + "math/rand" + "os" + "os/exec" + "strconv" + "strings" + "testing" + "time" + + plugins "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/plugins/v1alpha1" + fluxplugin "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1" + "google.golang.org/grpc" + kubecorev1 "k8s.io/api/core/v1" + kuberbacv1 "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/apimachinery/pkg/types" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" +) + +func checkEnv(t *testing.T) fluxplugin.FluxV2PackagesServiceClient { + enableEnvVar := os.Getenv(envVarFluxIntegrationTests) + runTests := false + if enableEnvVar != "" { + var err error + runTests, err = strconv.ParseBool(enableEnvVar) + if err != nil { + t.Fatalf("%+v", err) + } + } + + if !runTests { + t.Skipf("skipping flux plugin integration tests as %q not set to be true", envVarFluxIntegrationTests) + } else { + if up, err := isLocalKindClusterUp(t); err != nil || !up { + t.Fatalf("Failed to find local kind cluster due to: [%v]", err) + } + var fluxPluginClient fluxplugin.FluxV2PackagesServiceClient + var err error + if fluxPluginClient, err = getFluxPluginClient(t); err != nil { + t.Fatalf("Failed to get fluxv2 plugin due to: [%v]", err) + } + rand.Seed(time.Now().UnixNano()) + return fluxPluginClient + } + return nil +} + +func isLocalKindClusterUp(t *testing.T) (up bool, err error) { + t.Logf("+isLocalKindClusterUp") + cmd := exec.Command("kind", "get", "clusters") + bytes, err := cmd.CombinedOutput() + if err != nil { + t.Logf("%s", string(bytes)) + return false, err + } + if !strings.Contains(string(bytes), "kubeapps\n") { + return false, nil + } + + // naively assume that if the api server reports nodes, the cluster is up + typedClient, err := kubeGetTypedClient() + if err != nil { + t.Logf("%s", string(bytes)) + return false, err + } + + nodeList, err := typedClient.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) + if err != nil { + t.Logf("%s", string(bytes)) + return false, err + } + + if len(nodeList.Items) == 1 || nodeList.Items[0].Name == "node/kubeapps-control-plane" { + return true, nil + } else { + return false, fmt.Errorf("Unexpected cluster nodes: [%v]", nodeList) + } +} + +func getFluxPluginClient(t *testing.T) (fluxplugin.FluxV2PackagesServiceClient, error) { + t.Logf("+getFluxPluginClient") + + var opts []grpc.DialOption + opts = append(opts, grpc.WithInsecure()) + opts = append(opts, grpc.WithBlock()) + target := "localhost:8080" + conn, err := grpc.Dial(target, opts...) + if err != nil { + t.Fatalf("failed to dial [%s] due to: %v", target, err) + } + t.Cleanup(func() { conn.Close() }) + pluginsCli := plugins.NewPluginsServiceClient(conn) + response, err := pluginsCli.GetConfiguredPlugins(context.TODO(), &plugins.GetConfiguredPluginsRequest{}) + if err != nil { + t.Fatalf("failed to GetConfiguredPlugins due to: %v", err) + } + found := false + for _, p := range response.Plugins { + if p.Name == "fluxv2.packages" && p.Version == "v1alpha1" { + found = true + break + } + } + if !found { + return nil, fmt.Errorf("kubeapps Flux v2 plugin is not registered") + } + return fluxplugin.NewFluxV2PackagesServiceClient(conn), nil +} + +// This should eventually be replaced with fluxPlugin CreateRepository() call as soon as we finalize +// the design +func kubeCreateHelmRepository(t *testing.T, name, url, namespace string) error { + t.Logf("+kubeCreateHelmRepository(%s,%s)", name, namespace) + unstructuredRepo := unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": fmt.Sprintf("%s/%s", fluxGroup, fluxVersion), + "kind": fluxHelmRepository, + "metadata": map[string]interface{}{ + "name": name, + "namespace": namespace, + }, + "spec": map[string]interface{}{ + "url": url, + "interval": "1m", + }, + }, + } + + if ifc, err := kubeGetHelmRepositoryResourceInterface(namespace); err != nil { + return err + } else if _, err = ifc.Create(context.TODO(), &unstructuredRepo, metav1.CreateOptions{}); err != nil { + return err + } + return nil +} + +// this should eventually be replaced with flux plugin's DeleteRepository() +func kubeDeleteHelmRepository(t *testing.T, name, namespace string) error { + t.Logf("+kubeDeleteHelmRepository(%s,%s)", name, namespace) + if ifc, err := kubeGetHelmRepositoryResourceInterface(namespace); err != nil { + return err + } else if err = ifc.Delete(context.TODO(), name, metav1.DeleteOptions{}); err != nil { + return err + } + return nil +} + +// this should eventually be replaced with flux plugin's DeleteInstalledPackage() +func kubeDeleteHelmRelease(t *testing.T, name, namespace string) error { + t.Logf("+kubeDeleteHelmRelease(%s,%s)", name, namespace) + if ifc, err := kubeGetHelmReleaseResourceInterface(namespace); err != nil { + return err + // remove finalizer on HelmRelease cuz sometimes it gets stuck indefinitely + } else if _, err = ifc.Patch(context.TODO(), name, types.JSONPatchType, + []byte("[ { \"op\": \"remove\", \"path\": \"/metadata/finalizers\" } ]"), metav1.PatchOptions{}); err != nil { + return err + } else if err = ifc.Delete(context.TODO(), name, metav1.DeleteOptions{}); err != nil { + return err + } + return nil +} + +func kubeGetPodNames(t *testing.T, namespace string) (names []string, err error) { + t.Logf("+kubeGetPodNames(%s)", namespace) + if typedClient, err := kubeGetTypedClient(); err != nil { + return nil, err + } else if podList, err := typedClient.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{}); err != nil { + return nil, err + } else { + names := []string{} + for _, p := range podList.Items { + names = append(names, p.GetName()) + } + return names, nil + } +} + +// will create a service account with cluster-admin privs +func kubeCreateServiceAccount(t *testing.T, name, namespace string) error { + t.Logf("+kubeCreateServiceAccount(%s,%s)", name, namespace) + if typedClient, err := kubeGetTypedClient(); err != nil { + return err + } else if _, err = typedClient.CoreV1().ServiceAccounts(namespace).Create( + context.TODO(), + &kubecorev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + }, + metav1.CreateOptions{}); err != nil { + return err + } else if _, err = typedClient.RbacV1().ClusterRoleBindings().Create( + context.TODO(), + &kuberbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: name + "-binding", + }, + Subjects: []kuberbacv1.Subject{ + { + Kind: kuberbacv1.ServiceAccountKind, + Name: name, + Namespace: namespace, + }, + }, + RoleRef: kuberbacv1.RoleRef{ + Kind: "ClusterRole", + Name: "cluster-admin", + }, + }, + metav1.CreateOptions{}); err != nil { + return err + } + return nil +} + +func kubeDeleteServiceAccount(t *testing.T, name, namespace string) error { + t.Logf("+kubeDeleteServiceAccount(%s,%s)", name, namespace) + if typedClient, err := kubeGetTypedClient(); err != nil { + return err + } else if err = typedClient.RbacV1().ClusterRoleBindings().Delete( + context.TODO(), + name+"-binding", + metav1.DeleteOptions{}); err != nil { + return err + } else if err = typedClient.CoreV1().ServiceAccounts(namespace).Delete( + context.TODO(), + name, + metav1.DeleteOptions{}); err != nil { + return err + } + return nil +} + +func kubeDeleteNamespace(t *testing.T, namespace string) error { + t.Logf("+kubeDeleteNamespace(%s)", namespace) + if typedClient, err := kubeGetTypedClient(); err != nil { + return err + } else if typedClient.CoreV1().Namespaces().Delete( + context.TODO(), + namespace, + metav1.DeleteOptions{}); err != nil { + return err + } + return nil +} + +func kubeGetHelmReleaseResourceInterface(namespace string) (dynamic.ResourceInterface, error) { + clientset, err := kubeGetDynamicClient() + if err != nil { + return nil, err + } + relResource := schema.GroupVersionResource{ + Group: fluxHelmReleaseGroup, + Version: fluxHelmReleaseVersion, + Resource: fluxHelmReleases, + } + return clientset.Resource(relResource).Namespace(namespace), nil +} + +func kubeGetHelmRepositoryResourceInterface(namespace string) (dynamic.ResourceInterface, error) { + clientset, err := kubeGetDynamicClient() + if err != nil { + return nil, err + } + repoResource := schema.GroupVersionResource{ + Group: fluxGroup, + Version: fluxVersion, + Resource: fluxHelmRepositories, + } + return clientset.Resource(repoResource).Namespace(namespace), nil +} + +func kubeGetDynamicClient() (dynamic.Interface, error) { + if dynamicClient != nil { + return dynamicClient, nil + } else { + if config, err := restConfig(); err != nil { + return nil, err + } else { + dynamicClient, err = dynamic.NewForConfig(config) + return dynamicClient, err + } + } +} + +func kubeGetTypedClient() (kubernetes.Interface, error) { + if typedClient != nil { + return typedClient, nil + } else { + if config, err := restConfig(); err != nil { + return nil, err + } else { + typedClient, err = kubernetes.NewForConfig(config) + return typedClient, err + } + } +} + +func restConfig() (*rest.Config, error) { + kubeconfig := os.Getenv("KUBECONFIG") + return clientcmd.BuildConfigFromFlags("", kubeconfig) +} + +func randSeq(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} + +// global vars +var letters = []rune("abcdefghijklmnopqrstuvwxyz0123456789") +var typedClient kubernetes.Interface +var dynamicClient dynamic.Interface diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go index b3080480d8d..60bd04d93c6 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go @@ -377,12 +377,49 @@ func (s *Server) newRelease(ctx context.Context, packageRef *corev1.AvailablePac } func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString string) error { - _, err := s.getReleasesResourceInterface(ctx, packageRef.Context.Namespace) + ifc, err := s.getReleasesResourceInterface(ctx, packageRef.Context.Namespace) if err != nil { return err } - // TODO (gfichtenholt) implement + // we'll use types.MergePatchType, since + // 1) JSONPatch requires existing value for 'replace' to exist, yuck + // 2) JSONMergePatch doesn't support setting values to nil + patchMap := map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{}, + }, + }, + } + + if versionRef.GetVersion() != "" { + unstructured.SetNestedField(patchMap, versionRef.GetVersion(), "spec", "chart", "spec", "version") + } + + if valuesString != "" { + values := make(map[string]interface{}) + if err = yaml.Unmarshal([]byte(valuesString), &values); err != nil { + return err + } + unstructured.SetNestedMap(patchMap, values, "spec", "values") + } + + if reconcile != nil { + + } + + bytes, err := json.Marshal(patchMap) + if err != nil { + return err + } + + patchedRel, err := ifc.Patch(ctx, packageRef.Identifier, types.MergePatchType, bytes, metav1.PatchOptions{}) + if err != nil { + return err + } + + log.V(4).Infof("Patched release: %s", prettyPrintMap(patchedRel.Object)) return nil } @@ -531,8 +568,8 @@ func newFluxHelmRelease(chart *models.Chart, releaseNamespace string, targetName }, }, } - if versionRef != nil && versionRef.Version != "" { - unstructured.SetNestedField(unstructuredRel.Object, versionRef.Version, "spec", "chart", "spec", "version") + if versionRef.GetVersion() != "" { + unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version") } reconcileInterval := "1m" // unless explictly specified if reconcile != nil { diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go index e5e2dd38241..4867501881e 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go @@ -14,11 +14,6 @@ package main import ( "context" - "fmt" - "math/rand" - "os" - "os/exec" - "strconv" "strings" "testing" "time" @@ -28,17 +23,6 @@ import ( corev1 "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" plugins "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/plugins/v1alpha1" fluxplugin "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1" - "google.golang.org/grpc" - kubecorev1 "k8s.io/api/core/v1" - kuberbacv1 "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/apimachinery/pkg/types" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" ) // This is an integration test: it tests the full integration of flux plugin with flux back-end @@ -123,7 +107,7 @@ type integrationTestUpdateSpec struct { integrationTestCreateSpec request *corev1.UpdateInstalledPackageRequest // this is expected AFTER the update call completes - expectedDetail *corev1.InstalledPackageDetail + expectedDetailAfterUpdate *corev1.InstalledPackageDetail } func TestKindClusterUpdateInstalledPackage(t *testing.T) { @@ -145,7 +129,22 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { Version: "6.0.0", }, }, - expectedDetail: expected_detail_podinfo_5_2_1, + expectedDetailAfterUpdate: expected_detail_podinfo_6_0_0, + }, + { + integrationTestCreateSpec: integrationTestCreateSpec{ + testName: "update test (values)", + repoUrl: podinfo_repo_url, + request: create_request_podinfo_5_2_1_no_values, + expectedDetail: expected_detail_podinfo_5_2_1_no_values, + expectedPodPrefix: "@TARGET_NS@-my-podinfo-", + }, + request: &corev1.UpdateInstalledPackageRequest{ + // this will be filled in by the code below after a call to create(...) completes + InstalledPackageRef: nil, + Values: "{\"ui\": { \"message\": \"what we do in the shadows\" } }", + }, + expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values, }, } @@ -159,31 +158,18 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { t.Fatalf("%+v", err) } - /* TODO - var actualDetail *corev1.InstalledPackageDetail - const maxWait = 25 - for i := 0; i <= maxWait; i++ { - resp2, err := fluxPluginClient.GetInstalledPackageDetail( - context.TODO(), - &corev1.GetInstalledPackageDetailRequest{InstalledPackageRef: installedRef}) - if err != nil { - t.Fatalf("%+v", err) - } - - if resp2.InstalledPackageDetail.Status.Ready == true && - resp2.InstalledPackageDetail.Status.Reason == corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED { - actualDetail = resp2.InstalledPackageDetail - break - } - t.Logf("Waiting 1s due to: [%s], userReason: [%s], attempt: [%d/%d]...", - resp2.InstalledPackageDetail.Status.Reason, resp2.InstalledPackageDetail.Status.UserReason, i+1, maxWait) - time.Sleep(1 * time.Second) - } + actualRespAfterUpdate := waitUntilInstallCompletes(t, fluxPluginClient, installedRef, false) + + tc.expectedDetailAfterUpdate.PostInstallationNotes = strings.ReplaceAll( + tc.expectedDetailAfterUpdate.PostInstallationNotes, + "@TARGET_NS@", + tc.integrationTestCreateSpec.request.TargetContext.Namespace) - if actualDetail == nil { - t.Fatalf("Timed out waiting for task to complete") + expectedResp := &corev1.GetInstalledPackageDetailResponse{ + InstalledPackageDetail: tc.expectedDetailAfterUpdate, } - */ + + compareActualVsExpectedGetInstalledPackageDetailResponse(t, actualRespAfterUpdate, expectedResp) }) } } @@ -264,55 +250,17 @@ func createAndWaitForHelmRelease(t *testing.T, tc integrationTestCreateSpec, flu } }) - var actualDetail *corev1.InstalledPackageDetail - for i := 0; i <= maxWait; i++ { - resp2, err := fluxPluginClient.GetInstalledPackageDetail( - context.TODO(), - &corev1.GetInstalledPackageDetailRequest{InstalledPackageRef: installedPackageRef}) - if err != nil { - t.Fatalf("%+v", err) - } - - if !tc.expectInstallFailure { - if resp2.InstalledPackageDetail.Status.Ready == true && - resp2.InstalledPackageDetail.Status.Reason == corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED { - actualDetail = resp2.InstalledPackageDetail - break - } - } else { - if resp2.InstalledPackageDetail.Status.Ready == false && - resp2.InstalledPackageDetail.Status.Reason == corev1.InstalledPackageStatus_STATUS_REASON_FAILED { - actualDetail = resp2.InstalledPackageDetail - break - } - } - t.Logf("Waiting 1s due to: [%s], userReason: [%s], attempt: [%d/%d]...", - resp2.InstalledPackageDetail.Status.Reason, resp2.InstalledPackageDetail.Status.UserReason, i+1, maxWait) - time.Sleep(1 * time.Second) - } - - if actualDetail == nil { - t.Fatalf("Timed out waiting for task to complete") - } + actualResp := waitUntilInstallCompletes(t, fluxPluginClient, installedPackageRef, tc.expectInstallFailure) tc.expectedDetail.PostInstallationNotes = strings.ReplaceAll( tc.expectedDetail.PostInstallationNotes, "@TARGET_NS@", tc.request.TargetContext.Namespace) - opts = cmpopts.IgnoreUnexported( - corev1.GetInstalledPackageDetailResponse{}, - corev1.InstalledPackageDetail{}, - corev1.InstalledPackageReference{}, - corev1.Context{}, - corev1.VersionReference{}, - corev1.InstalledPackageStatus{}, - corev1.PackageAppVersion{}, - plugins.Plugin{}, - corev1.ReconciliationOptions{}, - corev1.AvailablePackageReference{}) - if got, want := actualDetail, tc.expectedDetail; !cmp.Equal(want, got, opts) { - t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got, opts)) + expectedResp := &corev1.GetInstalledPackageDetailResponse{ + InstalledPackageDetail: tc.expectedDetail, } + compareActualVsExpectedGetInstalledPackageDetailResponse(t, actualResp, expectedResp) + if !tc.expectInstallFailure { // check artifacts in target namespace: tc.expectedPodPrefix = strings.ReplaceAll( @@ -331,305 +279,41 @@ func createAndWaitForHelmRelease(t *testing.T, tc integrationTestCreateSpec, flu return installedPackageRef } -func checkEnv(t *testing.T) fluxplugin.FluxV2PackagesServiceClient { - enableEnvVar := os.Getenv(envVarFluxIntegrationTests) - runTests := false - if enableEnvVar != "" { - var err error - runTests, err = strconv.ParseBool(enableEnvVar) +func waitUntilInstallCompletes(t *testing.T, fluxPluginClient fluxplugin.FluxV2PackagesServiceClient, installedPackageRef *corev1.InstalledPackageReference, expectInstallFailure bool) (actualResp *corev1.GetInstalledPackageDetailResponse) { + const maxWait = 25 + for i := 0; i <= maxWait; i++ { + resp2, err := fluxPluginClient.GetInstalledPackageDetail( + context.TODO(), + &corev1.GetInstalledPackageDetailRequest{InstalledPackageRef: installedPackageRef}) if err != nil { t.Fatalf("%+v", err) } - } - - if !runTests { - t.Skipf("skipping flux plugin integration tests as %q not set to be true", envVarFluxIntegrationTests) - } else { - if up, err := isLocalKindClusterUp(t); err != nil || !up { - t.Fatalf("Failed to find local kind cluster due to: [%v]", err) - } - var fluxPluginClient fluxplugin.FluxV2PackagesServiceClient - var err error - if fluxPluginClient, err = getFluxPluginClient(t); err != nil { - t.Fatalf("Failed to get fluxv2 plugin due to: [%v]", err) - } - rand.Seed(time.Now().UnixNano()) - return fluxPluginClient - } - return nil -} - -func isLocalKindClusterUp(t *testing.T) (up bool, err error) { - t.Logf("+isLocalKindClusterUp") - cmd := exec.Command("kind", "get", "clusters") - bytes, err := cmd.CombinedOutput() - if err != nil { - t.Logf("%s", string(bytes)) - return false, err - } - if !strings.Contains(string(bytes), "kubeapps\n") { - return false, nil - } - - // naively assume that if the api server reports nodes, the cluster is up - typedClient, err := kubeGetTypedClient() - if err != nil { - t.Logf("%s", string(bytes)) - return false, err - } - - nodeList, err := typedClient.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) - if err != nil { - t.Logf("%s", string(bytes)) - return false, err - } - - if len(nodeList.Items) == 1 || nodeList.Items[0].Name == "node/kubeapps-control-plane" { - return true, nil - } else { - return false, fmt.Errorf("Unexpected cluster nodes: [%v]", nodeList) - } -} - -func getFluxPluginClient(t *testing.T) (fluxplugin.FluxV2PackagesServiceClient, error) { - t.Logf("+getFluxPluginClient") - - var opts []grpc.DialOption - opts = append(opts, grpc.WithInsecure()) - opts = append(opts, grpc.WithBlock()) - target := "localhost:8080" - conn, err := grpc.Dial(target, opts...) - if err != nil { - t.Fatalf("failed to dial [%s] due to: %v", target, err) - } - t.Cleanup(func() { conn.Close() }) - pluginsCli := plugins.NewPluginsServiceClient(conn) - response, err := pluginsCli.GetConfiguredPlugins(context.TODO(), &plugins.GetConfiguredPluginsRequest{}) - if err != nil { - t.Fatalf("failed to GetConfiguredPlugins due to: %v", err) - } - found := false - for _, p := range response.Plugins { - if p.Name == "fluxv2.packages" && p.Version == "v1alpha1" { - found = true - break - } - } - if !found { - return nil, fmt.Errorf("kubeapps Flux v2 plugin is not registered") - } - return fluxplugin.NewFluxV2PackagesServiceClient(conn), nil -} - -// This should eventually be replaced with fluxPlugin CreateRepository() call as soon as we finalize -// the design -func kubeCreateHelmRepository(t *testing.T, name, url, namespace string) error { - t.Logf("+kubeCreateHelmRepository(%s,%s)", name, namespace) - unstructuredRepo := unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": fmt.Sprintf("%s/%s", fluxGroup, fluxVersion), - "kind": fluxHelmRepository, - "metadata": map[string]interface{}{ - "name": name, - "namespace": namespace, - }, - "spec": map[string]interface{}{ - "url": url, - "interval": "1m", - }, - }, - } - - if ifc, err := kubeGetHelmRepositoryResourceInterface(namespace); err != nil { - return err - } else if _, err = ifc.Create(context.TODO(), &unstructuredRepo, metav1.CreateOptions{}); err != nil { - return err - } - return nil -} - -// this should eventually be replaced with flux plugin's DeleteRepository() -func kubeDeleteHelmRepository(t *testing.T, name, namespace string) error { - t.Logf("+kubeDeleteHelmRepository(%s,%s)", name, namespace) - if ifc, err := kubeGetHelmRepositoryResourceInterface(namespace); err != nil { - return err - } else if err = ifc.Delete(context.TODO(), name, metav1.DeleteOptions{}); err != nil { - return err - } - return nil -} - -// this should eventually be replaced with flux plugin's DeleteInstalledPackage() -func kubeDeleteHelmRelease(t *testing.T, name, namespace string) error { - t.Logf("+kubeDeleteHelmRelease(%s,%s)", name, namespace) - if ifc, err := kubeGetHelmReleaseResourceInterface(namespace); err != nil { - return err - // remove finalizer on HelmRelease cuz sometimes it gets stuck indefinitely - } else if _, err = ifc.Patch(context.TODO(), name, types.JSONPatchType, - []byte("[ { \"op\": \"remove\", \"path\": \"/metadata/finalizers\" } ]"), metav1.PatchOptions{}); err != nil { - return err - } else if err = ifc.Delete(context.TODO(), name, metav1.DeleteOptions{}); err != nil { - return err - } - return nil -} - -func kubeGetPodNames(t *testing.T, namespace string) (names []string, err error) { - t.Logf("+kubeGetPodNames(%s)", namespace) - if typedClient, err := kubeGetTypedClient(); err != nil { - return nil, err - } else if podList, err := typedClient.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{}); err != nil { - return nil, err - } else { - names := []string{} - for _, p := range podList.Items { - names = append(names, p.GetName()) - } - return names, nil - } -} - -// will create a service account with cluster-admin privs -func kubeCreateServiceAccount(t *testing.T, name, namespace string) error { - t.Logf("+kubeCreateServiceAccount(%s,%s)", name, namespace) - if typedClient, err := kubeGetTypedClient(); err != nil { - return err - } else if _, err = typedClient.CoreV1().ServiceAccounts(namespace).Create( - context.TODO(), - &kubecorev1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - }, - metav1.CreateOptions{}); err != nil { - return err - } else if _, err = typedClient.RbacV1().ClusterRoleBindings().Create( - context.TODO(), - &kuberbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: name + "-binding", - }, - Subjects: []kuberbacv1.Subject{ - { - Kind: kuberbacv1.ServiceAccountKind, - Name: name, - Namespace: namespace, - }, - }, - RoleRef: kuberbacv1.RoleRef{ - Kind: "ClusterRole", - Name: "cluster-admin", - }, - }, - metav1.CreateOptions{}); err != nil { - return err - } - return nil -} - -func kubeDeleteServiceAccount(t *testing.T, name, namespace string) error { - t.Logf("+kubeDeleteServiceAccount(%s,%s)", name, namespace) - if typedClient, err := kubeGetTypedClient(); err != nil { - return err - } else if err = typedClient.RbacV1().ClusterRoleBindings().Delete( - context.TODO(), - name+"-binding", - metav1.DeleteOptions{}); err != nil { - return err - } else if err = typedClient.CoreV1().ServiceAccounts(namespace).Delete( - context.TODO(), - name, - metav1.DeleteOptions{}); err != nil { - return err - } - return nil -} - -func kubeDeleteNamespace(t *testing.T, namespace string) error { - t.Logf("+kubeDeleteNamespace(%s)", namespace) - if typedClient, err := kubeGetTypedClient(); err != nil { - return err - } else if typedClient.CoreV1().Namespaces().Delete( - context.TODO(), - namespace, - metav1.DeleteOptions{}); err != nil { - return err - } - return nil -} - -func kubeGetHelmReleaseResourceInterface(namespace string) (dynamic.ResourceInterface, error) { - clientset, err := kubeGetDynamicClient() - if err != nil { - return nil, err - } - relResource := schema.GroupVersionResource{ - Group: fluxHelmReleaseGroup, - Version: fluxHelmReleaseVersion, - Resource: fluxHelmReleases, - } - return clientset.Resource(relResource).Namespace(namespace), nil -} - -func kubeGetHelmRepositoryResourceInterface(namespace string) (dynamic.ResourceInterface, error) { - clientset, err := kubeGetDynamicClient() - if err != nil { - return nil, err - } - repoResource := schema.GroupVersionResource{ - Group: fluxGroup, - Version: fluxVersion, - Resource: fluxHelmRepositories, - } - return clientset.Resource(repoResource).Namespace(namespace), nil -} - -func kubeGetDynamicClient() (dynamic.Interface, error) { - if dynamicClient != nil { - return dynamicClient, nil - } else { - if config, err := restConfig(); err != nil { - return nil, err - } else { - dynamicClient, err = dynamic.NewForConfig(config) - return dynamicClient, err - } - } -} -func kubeGetTypedClient() (kubernetes.Interface, error) { - if typedClient != nil { - return typedClient, nil - } else { - if config, err := restConfig(); err != nil { - return nil, err + if !expectInstallFailure { + if resp2.InstalledPackageDetail.Status.Ready == true && + resp2.InstalledPackageDetail.Status.Reason == corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED { + actualResp = resp2 + break + } } else { - typedClient, err = kubernetes.NewForConfig(config) - return typedClient, err + if resp2.InstalledPackageDetail.Status.Ready == false && + resp2.InstalledPackageDetail.Status.Reason == corev1.InstalledPackageStatus_STATUS_REASON_FAILED { + actualResp = resp2 + break + } } + t.Logf("Waiting 1s due to: [%s], userReason: [%s], attempt: [%d/%d]...", + resp2.InstalledPackageDetail.Status.Reason, resp2.InstalledPackageDetail.Status.UserReason, i+1, maxWait) + time.Sleep(1 * time.Second) } -} - -func restConfig() (*rest.Config, error) { - kubeconfig := os.Getenv("KUBECONFIG") - return clientcmd.BuildConfigFromFlags("", kubeconfig) -} -func randSeq(n int) string { - b := make([]rune, n) - for i := range b { - b[i] = letters[rand.Intn(len(letters))] + if actualResp == nil { + t.Fatalf("Timed out waiting for task to complete") } - return string(b) + return actualResp } // global vars -var letters = []rune("abcdefghijklmnopqrstuvwxyz0123456789") - -var typedClient kubernetes.Interface -var dynamicClient dynamic.Interface - var create_request_basic = &corev1.CreateInstalledPackageRequest{ AvailablePackageRef: &corev1.AvailablePackageReference{ Identifier: "podinfo-1/podinfo", @@ -936,3 +620,127 @@ var expected_detail_podinfo_5_2_1 = &corev1.InstalledPackageDetail{ Plugin: fluxPlugin, }, } + +var expected_detail_podinfo_6_0_0 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-6", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "6.0.0", + }, + Name: "my-podinfo-6", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + AppVersion: "6.0.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: &corev1.InstalledPackageStatus{ + Ready: true, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, + UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", + }, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-6 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-6/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, +} + +var create_request_podinfo_5_2_1_no_values = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-7/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-7", + TargetContext: &corev1.Context{ + Namespace: "test-7", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, +} + +var expected_detail_podinfo_5_2_1_no_values = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-7", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-7", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: &corev1.InstalledPackageStatus{ + Ready: true, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, + UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", + }, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-7 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-7/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, +} + +var expected_detail_podinfo_5_2_1_values = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-7", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-7", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: &corev1.InstalledPackageStatus{ + Ready: true, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, + UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", + }, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-7 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-7/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, +} diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 02eb2905a37..24b560c2283 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -390,7 +390,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { targetNamespace string // this is where installation would actually place artifacts existingHelmStubs []helmReleaseStub expectedStatusCode codes.Code - expectedResponse *corev1.GetInstalledPackageDetailResponse + expectedDetail *corev1.InstalledPackageDetail }{ { name: "returns installed package detail when install fails", @@ -410,9 +410,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { redis_existing_stub_failed, }, expectedStatusCode: codes.OK, - expectedResponse: &corev1.GetInstalledPackageDetailResponse{ - InstalledPackageDetail: redis_detail_failed, - }, + expectedDetail: redis_detail_failed, }, { name: "returns installed package detail when install is in progress", @@ -432,9 +430,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { redis_existing_stub_pending, }, expectedStatusCode: codes.OK, - expectedResponse: &corev1.GetInstalledPackageDetailResponse{ - InstalledPackageDetail: redis_detail_pending, - }, + expectedDetail: redis_detail_pending, }, { name: "returns installed package detail when install is successful", @@ -454,9 +450,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { redis_existing_stub_completed, }, expectedStatusCode: codes.OK, - expectedResponse: &corev1.GetInstalledPackageDetailResponse{ - InstalledPackageDetail: redis_detail_completed, - }, + expectedDetail: redis_detail_completed, }, { name: "returns a 404 if the installed package is not found", @@ -492,9 +486,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { redis_existing_stub_completed, }, expectedStatusCode: codes.OK, - expectedResponse: &corev1.GetInstalledPackageDetailResponse{ - InstalledPackageDetail: redis_detail_completed_with_values_and_reconciliation_options, - }, + expectedDetail: redis_detail_completed_with_values_and_reconciliation_options, }, } @@ -586,21 +578,12 @@ func TestGetInstalledPackageDetail(t *testing.T) { return } - opts := cmpopts.IgnoreUnexported( - corev1.GetInstalledPackageDetailResponse{}, - corev1.InstalledPackageDetail{}, - corev1.InstalledPackageReference{}, - corev1.Context{}, - corev1.VersionReference{}, - corev1.InstalledPackageStatus{}, - corev1.PackageAppVersion{}, - plugins.Plugin{}, - corev1.ReconciliationOptions{}, - corev1.AvailablePackageReference{}) - if got, want := response, tc.expectedResponse; !cmp.Equal(want, got, opts) { - t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got, opts)) + expectedResp := &corev1.GetInstalledPackageDetailResponse{ + InstalledPackageDetail: tc.expectedDetail, } + compareActualVsExpectedGetInstalledPackageDetailResponse(t, response, expectedResp) + // we make sure that all expectations were met if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("there were unfulfilled expectations: %s", err) @@ -800,6 +783,23 @@ func TestCreateInstalledPackage(t *testing.T) { } } +func compareActualVsExpectedGetInstalledPackageDetailResponse(t *testing.T, actualResp *corev1.GetInstalledPackageDetailResponse, expectedResp *corev1.GetInstalledPackageDetailResponse) { + opts := cmpopts.IgnoreUnexported( + corev1.GetInstalledPackageDetailResponse{}, + corev1.InstalledPackageDetail{}, + corev1.InstalledPackageReference{}, + corev1.Context{}, + corev1.VersionReference{}, + corev1.InstalledPackageStatus{}, + corev1.PackageAppVersion{}, + plugins.Plugin{}, + corev1.ReconciliationOptions{}, + corev1.AvailablePackageReference{}) + if got, want := actualResp, expectedResp; !cmp.Equal(want, got, opts) { + t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got, opts)) + } +} + func newRelease(name string, namespace string, spec map[string]interface{}, status map[string]interface{}) *unstructured.Unstructured { metadata := map[string]interface{}{ "name": name, diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go index 04435122c02..e9c265e19d1 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go @@ -452,6 +452,8 @@ func (s *Server) UpdateInstalledPackage(ctx context.Context, request *corev1.Upd request.Values); err != nil { return nil, err } else { - return &corev1.UpdateInstalledPackageResponse{}, nil + return &corev1.UpdateInstalledPackageResponse{ + InstalledPackageRef: request.InstalledPackageRef, + }, nil } } From 1b7436a871f4748e3f75dd29f447e60b6880f807 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Mon, 20 Sep 2021 02:14:46 -0700 Subject: [PATCH 2/9] step 2 --- .../docs/kubeapps-apis.swagger.json | 2 +- .../gen/core/packages/v1alpha1/packages.pb.go | 884 +++++------ .../helm/packages/v1alpha1/helm.pb.gw.go | 30 +- .../fluxv2/packages/v1alpha1/release.go | 32 +- .../v1alpha1/release_integration_test.go | 1070 ++++++++----- .../fluxv2/packages/v1alpha1/release_test.go | 1378 ++++++++--------- .../fluxv2/packages/v1alpha1/server.go | 2 + .../core/packages/v1alpha1/packages.proto | 7 +- 8 files changed, 1820 insertions(+), 1585 deletions(-) diff --git a/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json b/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json index ca8e35696b7..5731281ce49 100644 --- a/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json +++ b/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json @@ -2679,7 +2679,7 @@ }, "pkgVersionReference": { "$ref": "#/definitions/v1alpha1VersionReference", - "title": "For helm this will be the exact version in VersionReference.version\nFor other plugins we can extend the VersionReference as needed. Optional" + "title": "For helm this will be the exact version in VersionReference.version\nFor fluxv2 this could be any semver constraint expression\nFor other plugins we can extend the VersionReference as needed. Optional" }, "values": { "type": "string", diff --git a/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go b/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go index fee4b1fbd74..b051ceba8ec 100644 --- a/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go +++ b/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go @@ -13,6 +13,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" anypb "google.golang.org/protobuf/types/known/anypb" + _ "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -506,17 +507,18 @@ type UpdateInstalledPackageRequest struct { // Required InstalledPackageRef *InstalledPackageReference `protobuf:"bytes,1,opt,name=installed_package_ref,json=installedPackageRef,proto3" json:"installed_package_ref,omitempty"` // For helm this will be the exact version in VersionReference.version + // For fluxv2 this could be any semver constraint expression // For other plugins we can extend the VersionReference as needed. Optional - PkgVersionReference *VersionReference `protobuf:"bytes,2,opt,name=pkg_version_reference,json=pkgVersionReference,proto3" json:"pkg_version_reference,omitempty"` + PkgVersionReference *VersionReference `protobuf:"bytes,2,opt,name=pkg_version_reference,json=pkgVersionReference,proto3,oneof" json:"pkg_version_reference,omitempty"` // An optional serialized values string to be included when templating a // package in the format expected by the plugin. Included when the backend // format doesn't use secrets or configmaps for values or supports both. // These values are layered on top of any values refs above, when // relevant. - Values string `protobuf:"bytes,3,opt,name=values,proto3" json:"values,omitempty"` + Values *string `protobuf:"bytes,3,opt,name=values,proto3,oneof" json:"values,omitempty"` // An optional field for specifying data common to systems that reconcile // the package on the cluster. - ReconciliationOptions *ReconciliationOptions `protobuf:"bytes,4,opt,name=reconciliation_options,json=reconciliationOptions,proto3" json:"reconciliation_options,omitempty"` + ReconciliationOptions *ReconciliationOptions `protobuf:"bytes,4,opt,name=reconciliation_options,json=reconciliationOptions,proto3,oneof" json:"reconciliation_options,omitempty"` } func (x *UpdateInstalledPackageRequest) Reset() { @@ -566,8 +568,8 @@ func (x *UpdateInstalledPackageRequest) GetPkgVersionReference() *VersionReferen } func (x *UpdateInstalledPackageRequest) GetValues() string { - if x != nil { - return x.Values + if x != nil && x.Values != nil { + return *x.Values } return "" } @@ -2440,6 +2442,8 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaf, 0x02, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, @@ -2537,7 +2541,7 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x89, 0x03, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x73, 0x22, 0xd8, 0x03, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, @@ -2546,289 +2550,326 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x69, 0x0a, 0x15, 0x70, 0x6b, 0x67, 0x5f, 0x76, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x6e, 0x0a, 0x15, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x70, - 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, + 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x48, 0x02, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, + 0x5f, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xec, 0x01, 0x0a, + 0x24, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, - 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xec, 0x01, - 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, - 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x9a, 0x01, 0x0a, - 0x21, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x75, 0x0a, 0x18, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x16, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x8f, 0x01, 0x0a, 0x23, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x68, 0x0a, 0x14, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x70, 0x70, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, + 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x21, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x75, 0x0a, 0x18, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x52, 0x16, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x8f, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x68, 0x0a, 0x14, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x70, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, + 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x24, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x21, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x75, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x16, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x94, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, + 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x22, 0x94, 0x01, + 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x66, 0x22, 0x8b, 0x03, 0x0a, 0x17, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x24, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, + 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, + 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x22, 0xf1, 0x05, 0x0a, 0x16, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, 0x0a, + 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, + 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, + 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x6f, 0x6d, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x6f, 0x6e, 0x67, + 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0b, + 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x83, 0x06, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x15, 0x70, 0x6b, + 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, - 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x21, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x75, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, - 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x94, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, - 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, + 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x6b, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6b, 0x67, + 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x22, 0x94, - 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x66, 0x22, 0x8b, 0x03, 0x0a, 0x17, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x69, 0x65, 0x73, 0x22, 0xf1, 0x05, 0x0a, 0x16, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, - 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, - 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, + 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, - 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x6f, 0x6d, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, - 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x6f, 0x6e, - 0x67, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0b, 0x6d, 0x61, 0x69, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x83, 0x06, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, - 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x15, 0x70, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x91, 0x08, 0x0a, + 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, + 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x69, 0x0a, 0x15, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x6b, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6b, - 0x67, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, - 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, - 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x12, 0x71, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, + 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, + 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, + 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x6f, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, + 0x65, 0x73, 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x91, 0x08, - 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, - 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x69, 0x0a, 0x15, - 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, - 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, - 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, - 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, - 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x6f, - 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, - 0x74, 0x65, 0x73, 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, + 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x22, 0x41, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x41, 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x22, 0x41, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, 0x36, 0x0a, + 0x0a, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xab, 0x01, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x11, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, @@ -2839,185 +2880,153 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, 0x36, - 0x0a, 0x0a, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xab, 0x01, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x11, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x06, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75, - 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, - 0x2c, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x02, - 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x60, - 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, - 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1d, - 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, - 0x55, 0x4e, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, - 0x14, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x04, 0x22, 0x7f, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, - 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xe0, 0x0c, 0x0a, 0x0f, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xee, - 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, 0x75, 0x62, 0x65, - 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, - 0xe3, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x45, 0x2e, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, 0x2c, + 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x02, 0x0a, + 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x60, 0x0a, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xea, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x48, + 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, + 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, + 0x4e, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x04, 0x22, 0x7f, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6b, + 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, + 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xe0, 0x0c, 0x0a, 0x0f, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xee, 0x01, + 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, - 0x12, 0x30, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0xee, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, - 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, - 0x12, 0x31, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0xe3, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x12, 0x45, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0xe3, + 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x45, 0x2e, 0x6b, + 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0xea, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x22, 0x29, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x42, - 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x48, 0x2e, + 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, + 0x30, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0xee, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x32, - 0x29, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, + 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, + 0x31, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x4b, 0x5a, - 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, - 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x63, 0x6d, - 0x64, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, - 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0xe3, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x45, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, + 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, + 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2e, 0x22, 0x29, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, + 0x01, 0x2a, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x42, 0x2e, + 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x32, 0x29, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x4b, 0x5a, 0x49, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x63, 0x6d, 0x64, + 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -3480,6 +3489,7 @@ func file_kubeappsapis_core_packages_v1alpha1_packages_proto_init() { } } } + file_kubeappsapis_core_packages_v1alpha1_packages_proto_msgTypes[6].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go b/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go index 5e59105c7c6..7aa659caaa3 100644 --- a/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go +++ b/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go @@ -15,7 +15,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" - "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" + v1alpha1_0 "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" @@ -37,7 +37,7 @@ var ( ) func request_HelmPackagesService_GetAvailablePackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetAvailablePackageSummariesRequest + var protoReq v1alpha1_0.GetAvailablePackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -53,7 +53,7 @@ func request_HelmPackagesService_GetAvailablePackageSummaries_0(ctx context.Cont } func local_request_HelmPackagesService_GetAvailablePackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetAvailablePackageSummariesRequest + var protoReq v1alpha1_0.GetAvailablePackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -73,7 +73,7 @@ var ( ) func request_HelmPackagesService_GetAvailablePackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetAvailablePackageDetailRequest + var protoReq v1alpha1_0.GetAvailablePackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -89,7 +89,7 @@ func request_HelmPackagesService_GetAvailablePackageDetail_0(ctx context.Context } func local_request_HelmPackagesService_GetAvailablePackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetAvailablePackageDetailRequest + var protoReq v1alpha1_0.GetAvailablePackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -109,7 +109,7 @@ var ( ) func request_HelmPackagesService_GetAvailablePackageVersions_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetAvailablePackageVersionsRequest + var protoReq v1alpha1_0.GetAvailablePackageVersionsRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -125,7 +125,7 @@ func request_HelmPackagesService_GetAvailablePackageVersions_0(ctx context.Conte } func local_request_HelmPackagesService_GetAvailablePackageVersions_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetAvailablePackageVersionsRequest + var protoReq v1alpha1_0.GetAvailablePackageVersionsRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -145,7 +145,7 @@ var ( ) func request_HelmPackagesService_GetInstalledPackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetInstalledPackageSummariesRequest + var protoReq v1alpha1_0.GetInstalledPackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -161,7 +161,7 @@ func request_HelmPackagesService_GetInstalledPackageSummaries_0(ctx context.Cont } func local_request_HelmPackagesService_GetInstalledPackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetInstalledPackageSummariesRequest + var protoReq v1alpha1_0.GetInstalledPackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -181,7 +181,7 @@ var ( ) func request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetInstalledPackageDetailRequest + var protoReq v1alpha1_0.GetInstalledPackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -197,7 +197,7 @@ func request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.Context } func local_request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.GetInstalledPackageDetailRequest + var protoReq v1alpha1_0.GetInstalledPackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -213,7 +213,7 @@ func local_request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.C } func request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.CreateInstalledPackageRequest + var protoReq v1alpha1_0.CreateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -230,7 +230,7 @@ func request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Context, m } func local_request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.CreateInstalledPackageRequest + var protoReq v1alpha1_0.CreateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -247,7 +247,7 @@ func local_request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Cont } func request_HelmPackagesService_UpdateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.UpdateInstalledPackageRequest + var protoReq v1alpha1_0.UpdateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -264,7 +264,7 @@ func request_HelmPackagesService_UpdateInstalledPackage_0(ctx context.Context, m } func local_request_HelmPackagesService_UpdateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1.UpdateInstalledPackageRequest + var protoReq v1alpha1_0.UpdateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go index 60bd04d93c6..63255605553 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go @@ -376,15 +376,15 @@ func (s *Server) newRelease(ctx context.Context, packageRef *corev1.AvailablePac }, nil } -func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString string) error { +func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString *string) error { ifc, err := s.getReleasesResourceInterface(ctx, packageRef.Context.Namespace) if err != nil { return err } - // we'll use types.MergePatchType, since - // 1) JSONPatch requires existing value for 'replace' to exist, yuck - // 2) JSONMergePatch doesn't support setting values to nil + // for now we'll use types.MergePatchType, since + // - JSONPatchType requires existing value for 'replace' to exist, so we'd need to do a Get(...) first. Yuck + // patchMap := map[string]interface{}{ "spec": map[string]interface{}{ "chart": map[string]interface{}{ @@ -397,16 +397,24 @@ func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.Installed unstructured.SetNestedField(patchMap, versionRef.GetVersion(), "spec", "chart", "spec", "version") } - if valuesString != "" { - values := make(map[string]interface{}) - if err = yaml.Unmarshal([]byte(valuesString), &values); err != nil { - return err + if valuesString != nil { + if *valuesString != "" { + values := make(map[string]interface{}) + if err = yaml.Unmarshal([]byte(*valuesString), &values); err != nil { + return err + } + unstructured.SetNestedMap(patchMap, values, "spec", "values") + } else { + // the semantics of this is a remove operation for a 'values' field + unstructured.SetNestedField(patchMap, nil, "spec", "values") } - unstructured.SetNestedMap(patchMap, values, "spec", "values") } if reconcile != nil { - + if reconcile.Interval > 0 { + reconcileInterval := (time.Duration(reconcile.Interval) * time.Second).String() + unstructured.SetNestedField(patchMap, reconcileInterval, "spec", "interval") + } } bytes, err := json.Marshal(patchMap) @@ -414,12 +422,14 @@ func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.Installed return err } + log.Infof("About to patch release: %s", string(bytes)) + patchedRel, err := ifc.Patch(ctx, packageRef.Identifier, types.MergePatchType, bytes, metav1.PatchOptions{}) if err != nil { return err } - log.V(4).Infof("Patched release: %s", prettyPrintMap(patchedRel.Object)) + log.Infof("Patched release: %s", prettyPrintMap(patchedRel.Object)) return nil } diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go index 4867501881e..1738dc2d02b 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go @@ -112,6 +112,9 @@ type integrationTestUpdateSpec struct { func TestKindClusterUpdateInstalledPackage(t *testing.T) { fluxPluginClient := checkEnv(t) + valuesString1 := "{\"ui\": { \"message\": \"what we do in the shadows\" } }" + valuesString2 := "{\"ui\": { \"message\": \"Le Bureau des Légendes\" } }" + valuesString3 := "" testCases := []integrationTestUpdateSpec{ { @@ -123,8 +126,7 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, request: &corev1.UpdateInstalledPackageRequest{ - // this will be filled in by the code below after a call to create(...) completes - InstalledPackageRef: nil, + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes PkgVersionReference: &corev1.VersionReference{ Version: "6.0.0", }, @@ -133,19 +135,59 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { }, { integrationTestCreateSpec: integrationTestCreateSpec{ - testName: "update test (values)", + testName: "update test (add values)", repoUrl: podinfo_repo_url, request: create_request_podinfo_5_2_1_no_values, expectedDetail: expected_detail_podinfo_5_2_1_no_values, expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, request: &corev1.UpdateInstalledPackageRequest{ - // this will be filled in by the code below after a call to create(...) completes - InstalledPackageRef: nil, - Values: "{\"ui\": { \"message\": \"what we do in the shadows\" } }", + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + Values: &valuesString1, }, expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values, }, + { + integrationTestCreateSpec: integrationTestCreateSpec{ + testName: "update test (change values)", + repoUrl: podinfo_repo_url, + request: create_request_podinfo_5_2_1_values_2, + expectedDetail: expected_detail_podinfo_5_2_1_values_2, + expectedPodPrefix: "@TARGET_NS@-my-podinfo-", + }, + request: &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + Values: &valuesString2, + }, + expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values_3, + }, + { + integrationTestCreateSpec: integrationTestCreateSpec{ + testName: "update test (remove values)", + repoUrl: podinfo_repo_url, + request: create_request_podinfo_5_2_1_values_4, + expectedDetail: expected_detail_podinfo_5_2_1_values_4, + expectedPodPrefix: "@TARGET_NS@-my-podinfo-", + }, + request: &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + Values: &valuesString3, + }, + expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values_5, + }, + { + integrationTestCreateSpec: integrationTestCreateSpec{ + testName: "update test (values dont change)", + repoUrl: podinfo_repo_url, + request: create_request_podinfo_5_2_1_values_6, + expectedDetail: expected_detail_podinfo_5_2_1_values_6, + expectedPodPrefix: "@TARGET_NS@-my-podinfo-", + }, + request: &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + }, + expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values_6, + }, } for _, tc := range testCases { @@ -314,433 +356,619 @@ func waitUntilInstallCompletes(t *testing.T, fluxPluginClient fluxplugin.FluxV2P } // global vars -var create_request_basic = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-1/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo", - TargetContext: &corev1.Context{ - Namespace: "test-1", - }, -} +var ( + create_request_basic = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-1/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo", + TargetContext: &corev1.Context{ + Namespace: "test-1", + }, + } -var expected_detail_basic = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "*", - }, - Name: "my-podinfo", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.0.0", - AppVersion: "6.0.0", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-1/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_basic = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "*", + }, + Name: "my-podinfo", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + AppVersion: "6.0.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-1/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } -var create_request_semver_constraint = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-2/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo-2", - TargetContext: &corev1.Context{ - Namespace: "test-2", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "> 5", - }, -} + create_request_semver_constraint = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-2/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-2", + TargetContext: &corev1.Context{ + Namespace: "test-2", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "> 5", + }, + } -var expected_detail_semver_constraint = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-2", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "> 5", - }, - Name: "my-podinfo-2", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.0.0", - AppVersion: "6.0.0", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-2 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-2/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_semver_constraint = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-2", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "> 5", + }, + Name: "my-podinfo-2", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + AppVersion: "6.0.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-2 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-2/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } -var create_request_reconcile_options = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-3/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo-3", - TargetContext: &corev1.Context{ - Namespace: "test-3", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - Suspend: false, - ServiceAccountName: "foo", - }, -} + create_request_reconcile_options = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-3/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-3", + TargetContext: &corev1.Context{ + Namespace: "test-3", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + Suspend: false, + ServiceAccountName: "foo", + }, + } -var expected_detail_reconcile_options = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-3", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "*", - }, - Name: "my-podinfo-3", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.0.0", - AppVersion: "6.0.0", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - Suspend: false, - ServiceAccountName: "foo", - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-3 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-3/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_reconcile_options = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-3", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "*", + }, + Name: "my-podinfo-3", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + AppVersion: "6.0.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + Suspend: false, + ServiceAccountName: "foo", + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-3 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-3/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } -var create_request_with_values = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-4/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo-4", - TargetContext: &corev1.Context{ - Namespace: "test-4", - }, - Values: "{\"ui\": { \"message\": \"what we do in the shadows\" } }", -} + create_request_with_values = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-4/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-4", + TargetContext: &corev1.Context{ + Namespace: "test-4", + }, + Values: "{\"ui\": { \"message\": \"what we do in the shadows\" } }", + } -var expected_detail_with_values = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-4", - Plugin: fluxPlugin, - }, - Name: "my-podinfo-4", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.0.0", - AppVersion: "6.0.0", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "*", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-4 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-4/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, - ValuesApplied: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", -} + expected_detail_with_values = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-4", + Plugin: fluxPlugin, + }, + Name: "my-podinfo-4", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + AppVersion: "6.0.0", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "*", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-4 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-4/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + ValuesApplied: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + } -var create_request_install_fails = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-5/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo-5", - TargetContext: &corev1.Context{ - Namespace: "test-5", - }, - Values: "{\"replicaCount\": \"what we do in the shadows\" }", -} + create_request_install_fails = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-5/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-5", + TargetContext: &corev1.Context{ + Namespace: "test-5", + }, + Values: "{\"replicaCount\": \"what we do in the shadows\" }", + } -var expected_detail_install_fails = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-5", - Plugin: fluxPlugin, - }, - Name: "my-podinfo-5", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.0.0", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "*", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, - UserReason: "InstallFailed: install retries exhausted", - }, - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-5/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, - ValuesApplied: "{\"replicaCount\":\"what we do in the shadows\"}", -} + expected_detail_install_fails = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-5", + Plugin: fluxPlugin, + }, + Name: "my-podinfo-5", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "*", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: &corev1.InstalledPackageStatus{ + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, + UserReason: "InstallFailed: install retries exhausted", + }, + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-5/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + ValuesApplied: "{\"replicaCount\":\"what we do in the shadows\"}", + } -var create_request_podinfo_5_2_1 = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-6/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo-6", - TargetContext: &corev1.Context{ - Namespace: "test-6", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "=5.2.1", - }, -} + create_request_podinfo_5_2_1 = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-6/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-6", + TargetContext: &corev1.Context{ + Namespace: "test-6", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + } -var expected_detail_podinfo_5_2_1 = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-6", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "=5.2.1", - }, - Name: "my-podinfo-6", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "5.2.1", - AppVersion: "5.2.1", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-6 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-6/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_podinfo_5_2_1 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-6", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-6", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-6 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-6/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } -var expected_detail_podinfo_6_0_0 = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-6", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "6.0.0", - }, - Name: "my-podinfo-6", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.0.0", - AppVersion: "6.0.0", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-6 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-6/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_podinfo_6_0_0 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-6", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "6.0.0", + }, + Name: "my-podinfo-6", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.0.0", + AppVersion: "6.0.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-6 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-6/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } -var create_request_podinfo_5_2_1_no_values = &corev1.CreateInstalledPackageRequest{ - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-7/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - }, - Name: "my-podinfo-7", - TargetContext: &corev1.Context{ - Namespace: "test-7", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "=5.2.1", - }, -} + create_request_podinfo_5_2_1_no_values = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-7/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-7", + TargetContext: &corev1.Context{ + Namespace: "test-7", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + } -var expected_detail_podinfo_5_2_1_no_values = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-7", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "=5.2.1", - }, - Name: "my-podinfo-7", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "5.2.1", - AppVersion: "5.2.1", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-7 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-7/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_podinfo_5_2_1_no_values = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-7", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-7", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-7 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-7/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } -var expected_detail_podinfo_5_2_1_values = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", - }, - Identifier: "my-podinfo-7", - Plugin: fluxPlugin, - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "=5.2.1", - }, - Name: "my-podinfo-7", - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "5.2.1", - AppVersion: "5.2.1", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - PostInstallationNotes: "1. Get the application URL by running these commands:\n " + - "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + - "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-7 8080:9898\n", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "podinfo-7/podinfo", - Context: &corev1.Context{ - Namespace: "default", - }, - Plugin: fluxPlugin, - }, -} + expected_detail_podinfo_5_2_1_values = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-7", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-7", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + ValuesApplied: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-7 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-7/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } + + create_request_podinfo_5_2_1_values_2 = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-8/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-8", + TargetContext: &corev1.Context{ + Namespace: "test-8", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + } + + expected_detail_podinfo_5_2_1_values_2 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-8", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-8", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + ValuesApplied: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-8 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-8/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } + + expected_detail_podinfo_5_2_1_values_3 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-8", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-8", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + ValuesApplied: "{\"ui\":{\"message\":\"Le Bureau des Légendes\"}}", + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-8 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-8/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } + + create_request_podinfo_5_2_1_values_4 = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-9/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-9", + TargetContext: &corev1.Context{ + Namespace: "test-9", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + } + + expected_detail_podinfo_5_2_1_values_4 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-9", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-9", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + ValuesApplied: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-9 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-9/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } + + expected_detail_podinfo_5_2_1_values_5 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-9", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-9", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-9 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-9/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } + + create_request_podinfo_5_2_1_values_6 = &corev1.CreateInstalledPackageRequest{ + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-10/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + }, + Name: "my-podinfo-10", + TargetContext: &corev1.Context{ + Namespace: "test-10", + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + } + + expected_detail_podinfo_5_2_1_values_6 = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo-10", + Plugin: fluxPlugin, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Name: "my-podinfo-10", + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "5.2.1", + AppVersion: "5.2.1", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + ValuesApplied: "{\"ui\":{\"message\":\"what we do in the shadows\"}}", + Status: statusInstalled, + PostInstallationNotes: "1. Get the application URL by running these commands:\n " + + "echo \"Visit http://127.0.0.1:8080 to use your application\"\n " + + "kubectl -n @TARGET_NS@ port-forward deploy/@TARGET_NS@-my-podinfo-10 8080:9898\n", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "podinfo-10/podinfo", + Context: &corev1.Context{ + Namespace: "default", + }, + Plugin: fluxPlugin, + }, + } +) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 24b560c2283..360363f5253 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -918,745 +918,729 @@ func newHelmActionConfig(t *testing.T, namespace string, rels []helmReleaseStub) } // misc global vars that get re-used in multiple tests scenarios -var releasesGvr = schema.GroupVersionResource{ - Group: fluxHelmReleaseGroup, - Version: fluxHelmReleaseVersion, - Resource: fluxHelmReleases, -} +var ( + releasesGvr = schema.GroupVersionResource{ + Group: fluxHelmReleaseGroup, + Version: fluxHelmReleaseVersion, + Resource: fluxHelmReleases, + } -var redis_summary_installed = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "6.2.4", - }, - PkgDisplayName: "redis", - ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", - Status: &corev1.InstalledPackageStatus{ + statusInstalled = &corev1.InstalledPackageStatus{ Ready: true, Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.6.1", - AppVersion: "6.2.4", - }, -} - -var redis_summary_failed = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "6.2.4", - }, - PkgDisplayName: "redis", - ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", - Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, - UserReason: "InstallFailed: install retries exhausted", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.6.1", - AppVersion: "6.2.4", - }, -} + } -var redis_summary_pending = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "6.2.4", - }, - PkgDisplayName: "redis", - ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", - Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_PENDING, - UserReason: "Progressing: reconciliation in progress", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.6.1", - AppVersion: "6.2.4", - }, -} + redis_summary_installed = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "6.2.4", + }, + PkgDisplayName: "redis", + ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", + Status: statusInstalled, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.6.1", + AppVersion: "6.2.4", + }, + } -var redis_summary_pending_2 = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "6.2.4", - }, - PkgDisplayName: "redis", - ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", - Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_PENDING, - UserReason: "ArtifactFailed: HelmChart 'default/kubeapps-my-redis' is not ready", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.6.1", - AppVersion: "6.2.4", - }, -} + redis_summary_failed = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "6.2.4", + }, + PkgDisplayName: "redis", + ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", + Status: &corev1.InstalledPackageStatus{ + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, + UserReason: "InstallFailed: install retries exhausted", + }, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.6.1", + AppVersion: "6.2.4", + }, + } -var airflow_summary_installed = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-2", - }, - Identifier: "my-airflow", - Plugin: fluxPlugin, - }, - Name: "my-airflow", - IconUrl: "https://bitnami.com/assets/stacks/airflow/img/airflow-stack-110x117.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "6.7.1", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.7.1", - AppVersion: "1.10.12", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "10.2.1", - AppVersion: "2.1.0", - }, - ShortDescription: "Apache Airflow is a platform to programmatically author, schedule and monitor workflows.", - PkgDisplayName: "airflow", - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, -} + redis_summary_pending = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "6.2.4", + }, + PkgDisplayName: "redis", + ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", + Status: &corev1.InstalledPackageStatus{ + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_PENDING, + UserReason: "Progressing: reconciliation in progress", + }, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.6.1", + AppVersion: "6.2.4", + }, + } -var redis_summary_latest = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "*", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "6.2.4", - }, - PkgDisplayName: "redis", - ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.6.1", - AppVersion: "6.2.4", - }, -} + redis_summary_pending_2 = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "6.2.4", + }, + PkgDisplayName: "redis", + ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", + Status: &corev1.InstalledPackageStatus{ + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_PENDING, + UserReason: "ArtifactFailed: HelmChart 'default/kubeapps-my-redis' is not ready", + }, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.6.1", + AppVersion: "6.2.4", + }, + } -var airflow_summary_semver = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-2", - }, - Identifier: "my-airflow", - Plugin: fluxPlugin, - }, - Name: "my-airflow", - IconUrl: "https://bitnami.com/assets/stacks/airflow/img/airflow-stack-110x117.png", - PkgVersionReference: &corev1.VersionReference{ - Version: "<=6.7.1", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "6.7.1", - AppVersion: "1.10.12", - }, - LatestVersion: &corev1.PackageAppVersion{ - PkgVersion: "10.2.1", - AppVersion: "2.1.0", - }, - ShortDescription: "Apache Airflow is a platform to programmatically author, schedule and monitor workflows.", - PkgDisplayName: "airflow", - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, -} + airflow_summary_installed = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-2", + }, + Identifier: "my-airflow", + Plugin: fluxPlugin, + }, + Name: "my-airflow", + IconUrl: "https://bitnami.com/assets/stacks/airflow/img/airflow-stack-110x117.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "6.7.1", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.7.1", + AppVersion: "1.10.12", + }, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "10.2.1", + AppVersion: "2.1.0", + }, + ShortDescription: "Apache Airflow is a platform to programmatically author, schedule and monitor workflows.", + PkgDisplayName: "airflow", + Status: statusInstalled, + } -var redis_existing_spec_completed = testSpecGetInstalledPackages{ - repoName: "bitnami-1", - repoNamespace: "default", - repoIndex: "testdata/redis-many-versions.yaml", - chartName: "redis", - chartTarGz: "testdata/redis-14.4.0.tgz", - chartSpecVersion: "14.4.0", - chartArtifactVersion: "14.4.0", - releaseName: "my-redis", - releaseNamespace: "namespace-1", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "True", - "reason": "ReconciliationSucceeded", - "message": "Release reconciliation succeeded", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Released", - "status": "True", - "reason": "InstallSucceeded", - "message": "Helm install succeeded", - }, - }, - "lastAppliedRevision": "14.4.0", - "lastAttemptedRevision": "14.4.0", - }, -} + redis_summary_latest = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "*", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "6.2.4", + }, + PkgDisplayName: "redis", + ShortDescription: "Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.", + Status: statusInstalled, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.6.1", + AppVersion: "6.2.4", + }, + } -var redis_existing_stub_completed = helmReleaseStub{ - name: "test-my-redis", - namespace: "test", - chartVersion: "14.4.0", - notes: "some notes", - status: release.StatusDeployed, -} + airflow_summary_semver = &corev1.InstalledPackageSummary{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-2", + }, + Identifier: "my-airflow", + Plugin: fluxPlugin, + }, + Name: "my-airflow", + IconUrl: "https://bitnami.com/assets/stacks/airflow/img/airflow-stack-110x117.png", + PkgVersionReference: &corev1.VersionReference{ + Version: "<=6.7.1", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "6.7.1", + AppVersion: "1.10.12", + }, + LatestVersion: &corev1.PackageAppVersion{ + PkgVersion: "10.2.1", + AppVersion: "2.1.0", + }, + ShortDescription: "Apache Airflow is a platform to programmatically author, schedule and monitor workflows.", + PkgDisplayName: "airflow", + Status: statusInstalled, + } -var redis_existing_spec_completed_with_values_and_reconciliation_options = testSpecGetInstalledPackages{ - repoName: "bitnami-1", - repoNamespace: "default", - repoIndex: "testdata/redis-many-versions.yaml", - chartName: "redis", - chartTarGz: "testdata/redis-14.4.0.tgz", - chartSpecVersion: "14.4.0", - chartArtifactVersion: "14.4.0", - releaseName: "my-redis", - releaseNamespace: "namespace-1", - releaseSuspend: true, - releaseServiceAccountName: "foo", - releaseValues: map[string]interface{}{ - "replica": []interface{}{ - map[string]interface{}{ - "replicaCount": "1", - "configuration": "xyz", - }, - }, - }, - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "True", - "reason": "ReconciliationSucceeded", - "message": "Release reconciliation succeeded", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Released", - "status": "True", - "reason": "InstallSucceeded", - "message": "Helm install succeeded", - }, - }, - "lastAppliedRevision": "14.4.0", - "lastAttemptedRevision": "14.4.0", - }, -} + redis_existing_spec_completed = testSpecGetInstalledPackages{ + repoName: "bitnami-1", + repoNamespace: "default", + repoIndex: "testdata/redis-many-versions.yaml", + chartName: "redis", + chartTarGz: "testdata/redis-14.4.0.tgz", + chartSpecVersion: "14.4.0", + chartArtifactVersion: "14.4.0", + releaseName: "my-redis", + releaseNamespace: "namespace-1", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "True", + "reason": "ReconciliationSucceeded", + "message": "Release reconciliation succeeded", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Released", + "status": "True", + "reason": "InstallSucceeded", + "message": "Helm install succeeded", + }, + }, + "lastAppliedRevision": "14.4.0", + "lastAttemptedRevision": "14.4.0", + }, + } -var redis_existing_spec_failed = testSpecGetInstalledPackages{ - repoName: "bitnami-1", - repoNamespace: "default", - repoIndex: "testdata/redis-many-versions.yaml", - chartName: "redis", - chartTarGz: "testdata/redis-14.4.0.tgz", - chartSpecVersion: "14.4.0", - chartArtifactVersion: "14.4.0", - releaseName: "my-redis", - releaseNamespace: "namespace-1", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-09-06T10:24:34Z", - "type": "Ready", - "status": "False", - "message": "install retries exhausted", - "reason": "InstallFailed", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-09-06T10:24:34Z", - "type": "Released", - "status": "False", - "message": "Helm install failed: unable to build kubernetes objects from release manifest: error validating \"\": error validating data: ValidationError(Deployment.spec.replicas): invalid type for io.k8s.api.apps.v1.DeploymentSpec.replicas: got \"string\", expected \"integer\"", - "reason": "InstallFailed", - }, - }, - "failures": "14", - "installFailures": "1", - "lastAttemptedRevision": "14.4.0", - }, -} + redis_existing_stub_completed = helmReleaseStub{ + name: "test-my-redis", + namespace: "test", + chartVersion: "14.4.0", + notes: "some notes", + status: release.StatusDeployed, + } -var redis_existing_stub_failed = helmReleaseStub{ - name: "test-my-redis", - namespace: "test", - chartVersion: "14.4.0", - notes: "some notes", - status: release.StatusFailed, -} + redis_existing_spec_completed_with_values_and_reconciliation_options = testSpecGetInstalledPackages{ + repoName: "bitnami-1", + repoNamespace: "default", + repoIndex: "testdata/redis-many-versions.yaml", + chartName: "redis", + chartTarGz: "testdata/redis-14.4.0.tgz", + chartSpecVersion: "14.4.0", + chartArtifactVersion: "14.4.0", + releaseName: "my-redis", + releaseNamespace: "namespace-1", + releaseSuspend: true, + releaseServiceAccountName: "foo", + releaseValues: map[string]interface{}{ + "replica": []interface{}{ + map[string]interface{}{ + "replicaCount": "1", + "configuration": "xyz", + }, + }, + }, + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "True", + "reason": "ReconciliationSucceeded", + "message": "Release reconciliation succeeded", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Released", + "status": "True", + "reason": "InstallSucceeded", + "message": "Helm install succeeded", + }, + }, + "lastAppliedRevision": "14.4.0", + "lastAttemptedRevision": "14.4.0", + }, + } -var airflow_existing_spec_completed = testSpecGetInstalledPackages{ - repoName: "bitnami-2", - repoNamespace: "default", - repoIndex: "testdata/airflow-many-versions.yaml", - chartName: "airflow", - chartTarGz: "testdata/airflow-6.7.1.tgz", - chartSpecVersion: "6.7.1", - chartArtifactVersion: "6.7.1", - releaseName: "my-airflow", - releaseNamespace: "namespace-2", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "True", - "reason": "ReconciliationSucceeded", - "message": "Release reconciliation succeeded", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Released", - "status": "True", - "reason": "InstallSucceeded", - "message": "Helm install succeeded", - }, - }, - "lastAppliedRevision": "6.7.1", - "lastAttemptedRevision": "6.7.1", - }, -} + redis_existing_spec_failed = testSpecGetInstalledPackages{ + repoName: "bitnami-1", + repoNamespace: "default", + repoIndex: "testdata/redis-many-versions.yaml", + chartName: "redis", + chartTarGz: "testdata/redis-14.4.0.tgz", + chartSpecVersion: "14.4.0", + chartArtifactVersion: "14.4.0", + releaseName: "my-redis", + releaseNamespace: "namespace-1", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-09-06T10:24:34Z", + "type": "Ready", + "status": "False", + "message": "install retries exhausted", + "reason": "InstallFailed", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-09-06T10:24:34Z", + "type": "Released", + "status": "False", + "message": "Helm install failed: unable to build kubernetes objects from release manifest: error validating \"\": error validating data: ValidationError(Deployment.spec.replicas): invalid type for io.k8s.api.apps.v1.DeploymentSpec.replicas: got \"string\", expected \"integer\"", + "reason": "InstallFailed", + }, + }, + "failures": "14", + "installFailures": "1", + "lastAttemptedRevision": "14.4.0", + }, + } -var airflow_existing_spec_semver = testSpecGetInstalledPackages{ - repoName: "bitnami-2", - repoNamespace: "default", - repoIndex: "testdata/airflow-many-versions.yaml", - chartName: "airflow", - chartTarGz: "testdata/airflow-6.7.1.tgz", - chartSpecVersion: "<=6.7.1", - chartArtifactVersion: "6.7.1", - releaseName: "my-airflow", - releaseNamespace: "namespace-2", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "True", - "reason": "ReconciliationSucceeded", - "message": "Release reconciliation succeeded", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Released", - "status": "True", - "reason": "InstallSucceeded", - "message": "Helm install succeeded", - }, - }, - "lastAppliedRevision": "6.7.1", - "lastAttemptedRevision": "6.7.1", - }, -} + redis_existing_stub_failed = helmReleaseStub{ + name: "test-my-redis", + namespace: "test", + chartVersion: "14.4.0", + notes: "some notes", + status: release.StatusFailed, + } -var redis_existing_spec_pending = testSpecGetInstalledPackages{ - repoName: "bitnami-1", - repoNamespace: "default", - repoIndex: "testdata/redis-many-versions.yaml", - chartName: "redis", - chartTarGz: "testdata/redis-14.4.0.tgz", - chartSpecVersion: "14.4.0", - chartArtifactVersion: "14.4.0", - releaseName: "my-redis", - releaseNamespace: "namespace-1", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "Unknown", - "reason": "Progressing", - "message": "reconciliation in progress", - }, - }, - "lastAttemptedRevision": "14.4.0", - }, -} + airflow_existing_spec_completed = testSpecGetInstalledPackages{ + repoName: "bitnami-2", + repoNamespace: "default", + repoIndex: "testdata/airflow-many-versions.yaml", + chartName: "airflow", + chartTarGz: "testdata/airflow-6.7.1.tgz", + chartSpecVersion: "6.7.1", + chartArtifactVersion: "6.7.1", + releaseName: "my-airflow", + releaseNamespace: "namespace-2", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "True", + "reason": "ReconciliationSucceeded", + "message": "Release reconciliation succeeded", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Released", + "status": "True", + "reason": "InstallSucceeded", + "message": "Helm install succeeded", + }, + }, + "lastAppliedRevision": "6.7.1", + "lastAttemptedRevision": "6.7.1", + }, + } -var redis_existing_spec_pending_2 = testSpecGetInstalledPackages{ - repoName: "bitnami-1", - repoNamespace: "default", - repoIndex: "testdata/redis-many-versions.yaml", - chartName: "redis", - chartTarGz: "testdata/redis-14.4.0.tgz", - chartSpecVersion: "14.4.0", - chartArtifactVersion: "14.4.0", - releaseName: "my-redis", - releaseNamespace: "namespace-1", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-09-06T05:26:52Z", - "message": "HelmChart 'default/kubeapps-my-redis' is not ready", - "reason": "ArtifactFailed", - "status": "False", - "type": "Ready", - }, - }, - "failures": "2", - "lastAttemptedRevision": "14.4.0", - }, -} + airflow_existing_spec_semver = testSpecGetInstalledPackages{ + repoName: "bitnami-2", + repoNamespace: "default", + repoIndex: "testdata/airflow-many-versions.yaml", + chartName: "airflow", + chartTarGz: "testdata/airflow-6.7.1.tgz", + chartSpecVersion: "<=6.7.1", + chartArtifactVersion: "6.7.1", + releaseName: "my-airflow", + releaseNamespace: "namespace-2", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "True", + "reason": "ReconciliationSucceeded", + "message": "Release reconciliation succeeded", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Released", + "status": "True", + "reason": "InstallSucceeded", + "message": "Helm install succeeded", + }, + }, + "lastAppliedRevision": "6.7.1", + "lastAttemptedRevision": "6.7.1", + }, + } -var redis_existing_stub_pending = helmReleaseStub{ - name: "test-my-redis", - namespace: "test", - chartVersion: "14.4.0", - notes: "some notes", - status: release.StatusPendingInstall, -} + redis_existing_spec_pending = testSpecGetInstalledPackages{ + repoName: "bitnami-1", + repoNamespace: "default", + repoIndex: "testdata/redis-many-versions.yaml", + chartName: "redis", + chartTarGz: "testdata/redis-14.4.0.tgz", + chartSpecVersion: "14.4.0", + chartArtifactVersion: "14.4.0", + releaseName: "my-redis", + releaseNamespace: "namespace-1", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "Unknown", + "reason": "Progressing", + "message": "reconciliation in progress", + }, + }, + "lastAttemptedRevision": "14.4.0", + }, + } -var redis_existing_spec_latest = testSpecGetInstalledPackages{ - repoName: "bitnami-1", - repoNamespace: "default", - repoIndex: "testdata/redis-many-versions.yaml", - chartName: "redis", - chartTarGz: "testdata/redis-14.4.0.tgz", - chartSpecVersion: "*", - chartArtifactVersion: "14.4.0", - releaseName: "my-redis", - releaseNamespace: "namespace-1", - releaseStatus: map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "True", - "reason": "ReconciliationSucceeded", - "message": "Release reconciliation succeeded", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Released", - "status": "True", - "reason": "InstallSucceeded", - "message": "Helm install succeeded", - }, - }, - "lastAppliedRevision": "14.4.0", - "lastAttemptedRevision": "14.4.0", - }, -} + redis_existing_spec_pending_2 = testSpecGetInstalledPackages{ + repoName: "bitnami-1", + repoNamespace: "default", + repoIndex: "testdata/redis-many-versions.yaml", + chartName: "redis", + chartTarGz: "testdata/redis-14.4.0.tgz", + chartSpecVersion: "14.4.0", + chartArtifactVersion: "14.4.0", + releaseName: "my-redis", + releaseNamespace: "namespace-1", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-09-06T05:26:52Z", + "message": "HelmChart 'default/kubeapps-my-redis' is not ready", + "reason": "ArtifactFailed", + "status": "False", + "type": "Ready", + }, + }, + "failures": "2", + "lastAttemptedRevision": "14.4.0", + }, + } -var redis_detail_failed = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "1.2.3", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, - UserReason: "InstallFailed: install retries exhausted", - }, - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "bitnami-1/redis", - Context: &corev1.Context{Namespace: "default"}, - Plugin: fluxPlugin, - }, - PostInstallationNotes: "some notes", -} + redis_existing_stub_pending = helmReleaseStub{ + name: "test-my-redis", + namespace: "test", + chartVersion: "14.4.0", + notes: "some notes", + status: release.StatusPendingInstall, + } -var redis_detail_pending = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - CurrentVersion: &corev1.PackageAppVersion{ - PkgVersion: "14.4.0", - AppVersion: "1.2.3", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_PENDING, - UserReason: "Progressing: reconciliation in progress", - }, - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "bitnami-1/redis", - Context: &corev1.Context{Namespace: "default"}, - Plugin: fluxPlugin, - }, - PostInstallationNotes: "some notes", -} + redis_existing_spec_latest = testSpecGetInstalledPackages{ + repoName: "bitnami-1", + repoNamespace: "default", + repoIndex: "testdata/redis-many-versions.yaml", + chartName: "redis", + chartTarGz: "testdata/redis-14.4.0.tgz", + chartSpecVersion: "*", + chartArtifactVersion: "14.4.0", + releaseName: "my-redis", + releaseNamespace: "namespace-1", + releaseStatus: map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "True", + "reason": "ReconciliationSucceeded", + "message": "Release reconciliation succeeded", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Released", + "status": "True", + "reason": "InstallSucceeded", + "message": "Helm install succeeded", + }, + }, + "lastAppliedRevision": "14.4.0", + "lastAttemptedRevision": "14.4.0", + }, + } -var redis_detail_completed = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - CurrentVersion: &corev1.PackageAppVersion{ - AppVersion: "1.2.3", - PkgVersion: "14.4.0", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "bitnami-1/redis", - Context: &corev1.Context{Namespace: "default"}, - Plugin: fluxPlugin, - }, - PostInstallationNotes: "some notes", -} + redis_detail_failed = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "1.2.3", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: &corev1.InstalledPackageStatus{ + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, + UserReason: "InstallFailed: install retries exhausted", + }, + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "bitnami-1/redis", + Context: &corev1.Context{Namespace: "default"}, + Plugin: fluxPlugin, + }, + PostInstallationNotes: "some notes", + } -var redis_detail_completed_with_values_and_reconciliation_options = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - CurrentVersion: &corev1.PackageAppVersion{ - AppVersion: "1.2.3", - PkgVersion: "14.4.0", - }, - PkgVersionReference: &corev1.VersionReference{ - Version: "14.4.0", - }, - ReconciliationOptions: &corev1.ReconciliationOptions{ - Interval: 60, - Suspend: true, - ServiceAccountName: "foo", - }, - Status: &corev1.InstalledPackageStatus{ - Ready: true, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_INSTALLED, - UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", - }, - ValuesApplied: "{\"replica\":[{\"configuration\":\"xyz\",\"replicaCount\":\"1\"}]}", - AvailablePackageRef: &corev1.AvailablePackageReference{ - Identifier: "bitnami-1/redis", - Context: &corev1.Context{Namespace: "default"}, - Plugin: fluxPlugin, - }, - PostInstallationNotes: "some notes", -} + redis_detail_pending = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Identifier: "my-redis", + Plugin: fluxPlugin, + }, + Name: "my-redis", + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + CurrentVersion: &corev1.PackageAppVersion{ + PkgVersion: "14.4.0", + AppVersion: "1.2.3", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: &corev1.InstalledPackageStatus{ + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_PENDING, + UserReason: "Progressing: reconciliation in progress", + }, + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "bitnami-1/redis", + Context: &corev1.Context{Namespace: "default"}, + Plugin: fluxPlugin, + }, + PostInstallationNotes: "some notes", + } -var flux_helm_release_basic = map[string]interface{}{ - "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", - "kind": "HelmRelease", - "metadata": map[string]interface{}{ - "name": "my-podinfo", - "namespace": "kubeapps", - }, - "spec": map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": "podinfo", - "sourceRef": map[string]interface{}{ - "kind": "HelmRepository", - "name": "podinfo", - "namespace": "namespace-1", - }, + redis_detail_completed = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", }, + Identifier: "my-redis", + Plugin: fluxPlugin, }, - "install": map[string]interface{}{ - "createNamespace": true, + Name: "my-redis", + CurrentVersion: &corev1.PackageAppVersion{ + AppVersion: "1.2.3", + PkgVersion: "14.4.0", }, - "interval": "1m", - "targetNamespace": "test", - }, -} + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + }, + Status: statusInstalled, + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "bitnami-1/redis", + Context: &corev1.Context{Namespace: "default"}, + Plugin: fluxPlugin, + }, + PostInstallationNotes: "some notes", + } -var flux_helm_release_semver_constraint = map[string]interface{}{ - "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", - "kind": "HelmRelease", - "metadata": map[string]interface{}{ - "name": "my-podinfo", - "namespace": "kubeapps", - }, - "spec": map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": "podinfo", - "sourceRef": map[string]interface{}{ - "kind": "HelmRepository", - "name": "podinfo", - "namespace": "namespace-1", - }, - "version": "> 5", + redis_detail_completed_with_values_and_reconciliation_options = &corev1.InstalledPackageDetail{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", }, + Identifier: "my-redis", + Plugin: fluxPlugin, }, - "install": map[string]interface{}{ - "createNamespace": true, + Name: "my-redis", + CurrentVersion: &corev1.PackageAppVersion{ + AppVersion: "1.2.3", + PkgVersion: "14.4.0", }, - "interval": "1m", - "targetNamespace": "test", - }, -} + PkgVersionReference: &corev1.VersionReference{ + Version: "14.4.0", + }, + ReconciliationOptions: &corev1.ReconciliationOptions{ + Interval: 60, + Suspend: true, + ServiceAccountName: "foo", + }, + Status: statusInstalled, + ValuesApplied: "{\"replica\":[{\"configuration\":\"xyz\",\"replicaCount\":\"1\"}]}", + AvailablePackageRef: &corev1.AvailablePackageReference{ + Identifier: "bitnami-1/redis", + Context: &corev1.Context{Namespace: "default"}, + Plugin: fluxPlugin, + }, + PostInstallationNotes: "some notes", + } -var flux_helm_release_reconcile_options = map[string]interface{}{ - "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", - "kind": "HelmRelease", - "metadata": map[string]interface{}{ - "name": "my-podinfo", - "namespace": "kubeapps", - }, - "spec": map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": "podinfo", - "sourceRef": map[string]interface{}{ - "kind": "HelmRepository", - "name": "podinfo", - "namespace": "namespace-1", + flux_helm_release_basic = map[string]interface{}{ + "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", + "kind": "HelmRelease", + "metadata": map[string]interface{}{ + "name": "my-podinfo", + "namespace": "kubeapps", + }, + "spec": map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": "podinfo", + "sourceRef": map[string]interface{}{ + "kind": "HelmRepository", + "name": "podinfo", + "namespace": "namespace-1", + }, }, }, + "install": map[string]interface{}{ + "createNamespace": true, + }, + "interval": "1m", + "targetNamespace": "test", }, - "install": map[string]interface{}{ - "createNamespace": true, + } + + flux_helm_release_semver_constraint = map[string]interface{}{ + "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", + "kind": "HelmRelease", + "metadata": map[string]interface{}{ + "name": "my-podinfo", + "namespace": "kubeapps", }, - "interval": "1m0s", - "serviceAccountName": "foo", - "suspend": false, - "targetNamespace": "test", - }, -} + "spec": map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": "podinfo", + "sourceRef": map[string]interface{}{ + "kind": "HelmRepository", + "name": "podinfo", + "namespace": "namespace-1", + }, + "version": "> 5", + }, + }, + "install": map[string]interface{}{ + "createNamespace": true, + }, + "interval": "1m", + "targetNamespace": "test", + }, + } -var flux_helm_release_values = map[string]interface{}{ - "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", - "kind": "HelmRelease", - "metadata": map[string]interface{}{ - "name": "my-podinfo", - "namespace": "kubeapps", - }, - "spec": map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": "podinfo", - "sourceRef": map[string]interface{}{ - "kind": "HelmRepository", - "name": "podinfo", - "namespace": "namespace-1", + flux_helm_release_reconcile_options = map[string]interface{}{ + "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", + "kind": "HelmRelease", + "metadata": map[string]interface{}{ + "name": "my-podinfo", + "namespace": "kubeapps", + }, + "spec": map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": "podinfo", + "sourceRef": map[string]interface{}{ + "kind": "HelmRepository", + "name": "podinfo", + "namespace": "namespace-1", + }, }, }, + "install": map[string]interface{}{ + "createNamespace": true, + }, + "interval": "1m0s", + "serviceAccountName": "foo", + "suspend": false, + "targetNamespace": "test", }, - "install": map[string]interface{}{ - "createNamespace": true, + } + + flux_helm_release_values = map[string]interface{}{ + "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", + "kind": "HelmRelease", + "metadata": map[string]interface{}{ + "name": "my-podinfo", + "namespace": "kubeapps", }, - "interval": "1m", - "targetNamespace": "test", - "values": map[string]interface{}{ - "ui": map[string]interface{}{"message": "what we do in the shadows"}, + "spec": map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": "podinfo", + "sourceRef": map[string]interface{}{ + "kind": "HelmRepository", + "name": "podinfo", + "namespace": "namespace-1", + }, + }, + }, + "install": map[string]interface{}{ + "createNamespace": true, + }, + "interval": "1m", + "targetNamespace": "test", + "values": map[string]interface{}{ + "ui": map[string]interface{}{"message": "what we do in the shadows"}, + }, }, - }, -} + } -var create_installed_package_resp_my_podinfo = &corev1.CreateInstalledPackageResponse{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "kubeapps", + create_installed_package_resp_my_podinfo = &corev1.CreateInstalledPackageResponse{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "kubeapps", + }, + Identifier: "my-podinfo", + Plugin: fluxPlugin, }, - Identifier: "my-podinfo", - Plugin: fluxPlugin, - }, -} + } +) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go index e9c265e19d1..c11adb49248 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go @@ -444,6 +444,8 @@ func (s *Server) UpdateInstalledPackage(ctx context.Context, request *corev1.Upd return nil, status.Errorf(codes.InvalidArgument, "no request InstalledPackageRef provided") } + request.ProtoMessage() + if err := s.updateRelease( ctx, request.InstalledPackageRef, diff --git a/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto b/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto index 1c5966ae6f6..eedad421f79 100644 --- a/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto +++ b/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto @@ -170,19 +170,20 @@ message UpdateInstalledPackageRequest { InstalledPackageReference installed_package_ref = 1; // For helm this will be the exact version in VersionReference.version + // For fluxv2 this could be any semver constraint expression // For other plugins we can extend the VersionReference as needed. Optional - VersionReference pkg_version_reference = 2; + optional VersionReference pkg_version_reference = 2; // An optional serialized values string to be included when templating a // package in the format expected by the plugin. Included when the backend // format doesn't use secrets or configmaps for values or supports both. // These values are layered on top of any values refs above, when // relevant. - string values = 3; + optional string values = 3; // An optional field for specifying data common to systems that reconcile // the package on the cluster. - ReconciliationOptions reconciliation_options = 4; + optional ReconciliationOptions reconciliation_options = 4; } // -- Start definitions of the response messages -- From ace7b225b60f8ecfa4ce774386dca5ff9096dfff Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Mon, 20 Sep 2021 22:02:34 -0700 Subject: [PATCH 3/9] step 3 --- .../docs/kubeapps-apis.swagger.json | 10 +- .../gen/core/packages/v1alpha1/packages.pb.go | 897 +++++++++--------- .../core/packages/v1alpha1/packages.pb.gw.go | 4 +- .../fluxv2/packages/v1alpha1/fluxv2.pb.go | 2 +- .../fluxv2/packages/v1alpha1/fluxv2.pb.gw.go | 34 +- .../plugins/helm/packages/v1alpha1/helm.pb.go | 2 +- .../helm/packages/v1alpha1/helm.pb.gw.go | 34 +- .../packages/v1alpha1/kapp_controller.pb.go | 2 +- .../v1alpha1/kapp_controller.pb.gw.go | 4 +- .../fluxv2/packages/v1alpha1/release.go | 59 +- .../v1alpha1/release_integration_test.go | 68 +- .../core/packages/v1alpha1/packages.proto | 22 +- .../fluxv2/packages/v1alpha1/fluxv2.proto | 2 +- .../plugins/helm/packages/v1alpha1/helm.proto | 2 +- .../packages/v1alpha1/kapp_controller.proto | 2 +- 15 files changed, 579 insertions(+), 565 deletions(-) diff --git a/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json b/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json index 5731281ce49..8db06548e0e 100644 --- a/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json +++ b/cmd/kubeapps-apis/docs/kubeapps-apis.swagger.json @@ -378,7 +378,7 @@ "PackagesService" ] }, - "patch": { + "put": { "operationId": "PackagesService_UpdateInstalledPackage", "responses": { "200": { @@ -840,7 +840,7 @@ "FluxV2PackagesService" ] }, - "patch": { + "put": { "summary": "UpdateInstalledPackage updates an installed package based on the request.", "operationId": "FluxV2PackagesService_UpdateInstalledPackage", "responses": { @@ -1320,7 +1320,7 @@ "HelmPackagesService" ] }, - "patch": { + "put": { "summary": "UpdateInstalledPackage updates an installed package based on the request.", "operationId": "HelmPackagesService_UpdateInstalledPackage", "responses": { @@ -1757,7 +1757,7 @@ "KappControllerPackagesService" ] }, - "patch": { + "put": { "summary": "UpdateInstalledPackage updates an installed package based on the request.", "operationId": "KappControllerPackagesService_UpdateInstalledPackage", "responses": { @@ -2690,7 +2690,7 @@ "description": "An optional field for specifying data common to systems that reconcile\nthe package on the cluster." } }, - "description": "Request for UpdateInstalledPackage. Partial resource updates are supported. \nFor example, to change the package version one only needs to specify the version reference. \nSimilarly to update the values, one only needs to specify that field", + "description": "Request for UpdateInstalledPackage. The intent is to reach the desired state specified\nby the fields in the request, while leaving other fields intact. This is a whole \nobject \"Update\" semantics rather than \"Patch\" semantics. The caller will provide the \nvalues for the fields fields below, which will replace, or be overlayed onto, the \ncorresponding fields in the existing resource. For example, with the\nUpdateInstalledPackageRequest, it is not possible to change just the 'package version \nreference' without also specifying 'values' field. As a side effect, not specifying the \n'values' field in the request means there are no values specified in the desired state. \nSo the meaning of each field is describing the desired state of the corresponding field \nin the resource. If the desired state already matches the current state, no resources \nare changed.", "title": "UpdateInstalledPackageRequest" }, "v1alpha1UpdateInstalledPackageResponse": { diff --git a/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go b/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go index b051ceba8ec..95cf9dca6f5 100644 --- a/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go +++ b/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.go @@ -13,7 +13,6 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" anypb "google.golang.org/protobuf/types/known/anypb" - _ "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -495,9 +494,17 @@ func (x *CreateInstalledPackageRequest) GetReconciliationOptions() *Reconciliati // UpdateInstalledPackageRequest // -// Request for UpdateInstalledPackage. Partial resource updates are supported. -// For example, to change the package version one only needs to specify the version reference. -// Similarly to update the values, one only needs to specify that field +// Request for UpdateInstalledPackage. The intent is to reach the desired state specified +// by the fields in the request, while leaving other fields intact. This is a whole +// object "Update" semantics rather than "Patch" semantics. The caller will provide the +// values for the fields fields below, which will replace, or be overlayed onto, the +// corresponding fields in the existing resource. For example, with the +// UpdateInstalledPackageRequest, it is not possible to change just the 'package version +// reference' without also specifying 'values' field. As a side effect, not specifying the +// 'values' field in the request means there are no values specified in the desired state. +// So the meaning of each field is describing the desired state of the corresponding field +// in the resource. If the desired state already matches the current state, no resources +// are changed. type UpdateInstalledPackageRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -509,16 +516,16 @@ type UpdateInstalledPackageRequest struct { // For helm this will be the exact version in VersionReference.version // For fluxv2 this could be any semver constraint expression // For other plugins we can extend the VersionReference as needed. Optional - PkgVersionReference *VersionReference `protobuf:"bytes,2,opt,name=pkg_version_reference,json=pkgVersionReference,proto3,oneof" json:"pkg_version_reference,omitempty"` + PkgVersionReference *VersionReference `protobuf:"bytes,2,opt,name=pkg_version_reference,json=pkgVersionReference,proto3" json:"pkg_version_reference,omitempty"` // An optional serialized values string to be included when templating a // package in the format expected by the plugin. Included when the backend // format doesn't use secrets or configmaps for values or supports both. // These values are layered on top of any values refs above, when // relevant. - Values *string `protobuf:"bytes,3,opt,name=values,proto3,oneof" json:"values,omitempty"` + Values string `protobuf:"bytes,3,opt,name=values,proto3" json:"values,omitempty"` // An optional field for specifying data common to systems that reconcile // the package on the cluster. - ReconciliationOptions *ReconciliationOptions `protobuf:"bytes,4,opt,name=reconciliation_options,json=reconciliationOptions,proto3,oneof" json:"reconciliation_options,omitempty"` + ReconciliationOptions *ReconciliationOptions `protobuf:"bytes,4,opt,name=reconciliation_options,json=reconciliationOptions,proto3" json:"reconciliation_options,omitempty"` } func (x *UpdateInstalledPackageRequest) Reset() { @@ -568,8 +575,8 @@ func (x *UpdateInstalledPackageRequest) GetPkgVersionReference() *VersionReferen } func (x *UpdateInstalledPackageRequest) GetValues() string { - if x != nil && x.Values != nil { - return *x.Values + if x != nil { + return x.Values } return "" } @@ -2442,8 +2449,6 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaf, 0x02, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x07, @@ -2541,7 +2546,7 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xd8, 0x03, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x73, 0x22, 0x89, 0x03, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, @@ -2550,326 +2555,289 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x6e, 0x0a, 0x15, 0x70, 0x6b, 0x67, 0x5f, 0x76, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x69, 0x0a, 0x15, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, - 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, - 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, - 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x48, 0x02, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, - 0x5f, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xec, 0x01, 0x0a, - 0x24, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, 0x62, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x70, + 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, - 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x21, - 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x75, 0x0a, 0x18, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x16, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x8f, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x68, 0x0a, 0x14, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x70, 0x70, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x24, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, - 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, - 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x21, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x75, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x16, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x94, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, - 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x22, 0x94, 0x01, - 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x66, 0x22, 0x8b, 0x03, 0x0a, 0x17, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, + 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xec, 0x01, + 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, + 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x9a, 0x01, 0x0a, + 0x21, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x75, 0x0a, 0x18, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x16, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x8f, 0x01, 0x0a, 0x23, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x68, 0x0a, 0x14, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x70, 0x70, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, - 0x65, 0x73, 0x22, 0xf1, 0x05, 0x0a, 0x16, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, 0x0a, - 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, - 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55, - 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x6f, 0x6d, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x6f, 0x6e, 0x67, - 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0b, - 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x83, 0x06, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x15, 0x70, 0x6b, - 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x24, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, - 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x6b, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6b, 0x67, - 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x21, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x75, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, + 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x94, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, + 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, - 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x22, 0x94, + 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x66, 0x22, 0x8b, 0x03, 0x0a, 0x17, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, - 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, + 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, + 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x22, 0xf1, 0x05, 0x0a, 0x16, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, + 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, + 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x91, 0x08, 0x0a, - 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, - 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x69, 0x0a, 0x15, 0x70, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, + 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x6f, 0x6d, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, + 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x6f, 0x6e, + 0x67, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0b, 0x6d, 0x61, 0x69, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0d, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x83, 0x06, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x15, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x12, 0x71, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, - 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, - 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x6f, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, - 0x65, 0x73, 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, + 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x6b, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6b, + 0x67, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, + 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, + 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, + 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x91, 0x08, + 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x72, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, - 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x22, 0x41, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x69, 0x0a, 0x15, + 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6b, 0x75, + 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x13, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, + 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x15, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, + 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, + 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x6f, + 0x73, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x12, 0x72, 0x0a, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75, 0x62, 0x65, - 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, 0x36, 0x0a, - 0x0a, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xab, 0x01, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x11, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x22, 0x41, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, @@ -2880,153 +2848,185 @@ var file_kubeappsapis_core_packages_v1alpha1_packages_proto_rawDesc = []byte{ 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, 0x2c, - 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x02, 0x0a, - 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x60, 0x0a, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, 0x2e, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, 0x36, + 0x0a, 0x0a, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xab, 0x01, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x11, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x19, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x06, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6b, 0x75, + 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x22, + 0x2c, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x02, + 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x60, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, + 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1d, + 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, + 0x14, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, + 0x10, 0x04, 0x22, 0x7f, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, + 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, + 0x6b, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xe0, 0x0c, 0x0a, 0x0f, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xee, + 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, + 0xe3, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x45, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, - 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, - 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, - 0x4e, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x22, 0x7f, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, - 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6b, 0x67, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6b, - 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0xe0, 0x0c, 0x0a, 0x0f, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xee, 0x01, - 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x48, + 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xea, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, + 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0xe3, - 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x45, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, + 0x12, 0x30, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0xee, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x12, 0xea, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x48, 0x2e, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, - 0x30, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0xee, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x48, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, + 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, + 0x12, 0x31, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x12, 0xe3, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x12, 0x45, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, + 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x22, 0x29, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x42, + 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, - 0x31, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x1a, + 0x29, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0xe3, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x12, 0x45, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, - 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x12, 0x42, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, - 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2e, 0x22, 0x29, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, - 0x01, 0x2a, 0x12, 0xd7, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x42, 0x2e, - 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x43, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x32, 0x29, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x4b, 0x5a, 0x49, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, - 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x63, 0x6d, 0x64, - 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, - 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x4b, 0x5a, + 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, + 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x63, 0x6d, + 0x64, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x70, 0x70, 0x73, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -3489,7 +3489,6 @@ func file_kubeappsapis_core_packages_v1alpha1_packages_proto_init() { } } } - file_kubeappsapis_core_packages_v1alpha1_packages_proto_msgTypes[6].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.gw.go b/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.gw.go index 38736238c68..ba3c1b0c010 100644 --- a/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.gw.go +++ b/cmd/kubeapps-apis/gen/core/packages/v1alpha1/packages.pb.gw.go @@ -423,7 +423,7 @@ func RegisterPackagesServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PATCH", pattern_PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -607,7 +607,7 @@ func RegisterPackagesServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PATCH", pattern_PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) diff --git a/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.go b/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.go index 2785aedad57..65f5ebb5b60 100644 --- a/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.go +++ b/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.go @@ -391,7 +391,7 @@ var file_kubeappsapis_plugins_fluxv2_packages_v1alpha1_fluxv2_proto_rawDesc = [] 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x32, 0x33, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x1a, 0x33, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x66, 0x6c, 0x75, 0x78, 0x76, 0x32, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x55, diff --git a/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.gw.go b/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.gw.go index da10183612c..860f601be88 100644 --- a/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.gw.go +++ b/cmd/kubeapps-apis/gen/plugins/fluxv2/packages/v1alpha1/fluxv2.pb.gw.go @@ -15,7 +15,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" - v1alpha1_1 "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" + v1alpha1_0 "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" @@ -37,7 +37,7 @@ var ( ) func request_FluxV2PackagesService_GetAvailablePackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetAvailablePackageSummariesRequest + var protoReq v1alpha1_0.GetAvailablePackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -53,7 +53,7 @@ func request_FluxV2PackagesService_GetAvailablePackageSummaries_0(ctx context.Co } func local_request_FluxV2PackagesService_GetAvailablePackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetAvailablePackageSummariesRequest + var protoReq v1alpha1_0.GetAvailablePackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -73,7 +73,7 @@ var ( ) func request_FluxV2PackagesService_GetAvailablePackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetAvailablePackageDetailRequest + var protoReq v1alpha1_0.GetAvailablePackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -89,7 +89,7 @@ func request_FluxV2PackagesService_GetAvailablePackageDetail_0(ctx context.Conte } func local_request_FluxV2PackagesService_GetAvailablePackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetAvailablePackageDetailRequest + var protoReq v1alpha1_0.GetAvailablePackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -109,7 +109,7 @@ var ( ) func request_FluxV2PackagesService_GetAvailablePackageVersions_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetAvailablePackageVersionsRequest + var protoReq v1alpha1_0.GetAvailablePackageVersionsRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -125,7 +125,7 @@ func request_FluxV2PackagesService_GetAvailablePackageVersions_0(ctx context.Con } func local_request_FluxV2PackagesService_GetAvailablePackageVersions_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetAvailablePackageVersionsRequest + var protoReq v1alpha1_0.GetAvailablePackageVersionsRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -181,7 +181,7 @@ var ( ) func request_FluxV2PackagesService_GetInstalledPackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetInstalledPackageSummariesRequest + var protoReq v1alpha1_0.GetInstalledPackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -197,7 +197,7 @@ func request_FluxV2PackagesService_GetInstalledPackageSummaries_0(ctx context.Co } func local_request_FluxV2PackagesService_GetInstalledPackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetInstalledPackageSummariesRequest + var protoReq v1alpha1_0.GetInstalledPackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -217,7 +217,7 @@ var ( ) func request_FluxV2PackagesService_GetInstalledPackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetInstalledPackageDetailRequest + var protoReq v1alpha1_0.GetInstalledPackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -233,7 +233,7 @@ func request_FluxV2PackagesService_GetInstalledPackageDetail_0(ctx context.Conte } func local_request_FluxV2PackagesService_GetInstalledPackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.GetInstalledPackageDetailRequest + var protoReq v1alpha1_0.GetInstalledPackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -249,7 +249,7 @@ func local_request_FluxV2PackagesService_GetInstalledPackageDetail_0(ctx context } func request_FluxV2PackagesService_CreateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.CreateInstalledPackageRequest + var protoReq v1alpha1_0.CreateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -266,7 +266,7 @@ func request_FluxV2PackagesService_CreateInstalledPackage_0(ctx context.Context, } func local_request_FluxV2PackagesService_CreateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.CreateInstalledPackageRequest + var protoReq v1alpha1_0.CreateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -283,7 +283,7 @@ func local_request_FluxV2PackagesService_CreateInstalledPackage_0(ctx context.Co } func request_FluxV2PackagesService_UpdateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, client FluxV2PackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.UpdateInstalledPackageRequest + var protoReq v1alpha1_0.UpdateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -300,7 +300,7 @@ func request_FluxV2PackagesService_UpdateInstalledPackage_0(ctx context.Context, } func local_request_FluxV2PackagesService_UpdateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, server FluxV2PackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_1.UpdateInstalledPackageRequest + var protoReq v1alpha1_0.UpdateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -483,7 +483,7 @@ func RegisterFluxV2PackagesServiceHandlerServer(ctx context.Context, mux *runtim }) - mux.Handle("PATCH", pattern_FluxV2PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_FluxV2PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -687,7 +687,7 @@ func RegisterFluxV2PackagesServiceHandlerClient(ctx context.Context, mux *runtim }) - mux.Handle("PATCH", pattern_FluxV2PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_FluxV2PackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) diff --git a/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.go b/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.go index fc2af3b8a24..fb788ff1814 100644 --- a/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.go +++ b/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.go @@ -206,7 +206,7 @@ var file_kubeappsapis_plugins_helm_packages_v1alpha1_helm_proto_rawDesc = []byte 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x36, 0x32, 0x31, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x68, + 0xe4, 0x93, 0x02, 0x36, 0x1a, 0x31, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x68, 0x65, 0x6c, 0x6d, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0x53, 0x5a, 0x51, 0x67, 0x69, diff --git a/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go b/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go index 7aa659caaa3..4bb7691d067 100644 --- a/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go +++ b/cmd/kubeapps-apis/gen/plugins/helm/packages/v1alpha1/helm.pb.gw.go @@ -15,7 +15,7 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" - v1alpha1_0 "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" + "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" @@ -37,7 +37,7 @@ var ( ) func request_HelmPackagesService_GetAvailablePackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetAvailablePackageSummariesRequest + var protoReq v1alpha1.GetAvailablePackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -53,7 +53,7 @@ func request_HelmPackagesService_GetAvailablePackageSummaries_0(ctx context.Cont } func local_request_HelmPackagesService_GetAvailablePackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetAvailablePackageSummariesRequest + var protoReq v1alpha1.GetAvailablePackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -73,7 +73,7 @@ var ( ) func request_HelmPackagesService_GetAvailablePackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetAvailablePackageDetailRequest + var protoReq v1alpha1.GetAvailablePackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -89,7 +89,7 @@ func request_HelmPackagesService_GetAvailablePackageDetail_0(ctx context.Context } func local_request_HelmPackagesService_GetAvailablePackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetAvailablePackageDetailRequest + var protoReq v1alpha1.GetAvailablePackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -109,7 +109,7 @@ var ( ) func request_HelmPackagesService_GetAvailablePackageVersions_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetAvailablePackageVersionsRequest + var protoReq v1alpha1.GetAvailablePackageVersionsRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -125,7 +125,7 @@ func request_HelmPackagesService_GetAvailablePackageVersions_0(ctx context.Conte } func local_request_HelmPackagesService_GetAvailablePackageVersions_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetAvailablePackageVersionsRequest + var protoReq v1alpha1.GetAvailablePackageVersionsRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -145,7 +145,7 @@ var ( ) func request_HelmPackagesService_GetInstalledPackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetInstalledPackageSummariesRequest + var protoReq v1alpha1.GetInstalledPackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -161,7 +161,7 @@ func request_HelmPackagesService_GetInstalledPackageSummaries_0(ctx context.Cont } func local_request_HelmPackagesService_GetInstalledPackageSummaries_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetInstalledPackageSummariesRequest + var protoReq v1alpha1.GetInstalledPackageSummariesRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -181,7 +181,7 @@ var ( ) func request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetInstalledPackageDetailRequest + var protoReq v1alpha1.GetInstalledPackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -197,7 +197,7 @@ func request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.Context } func local_request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.GetInstalledPackageDetailRequest + var protoReq v1alpha1.GetInstalledPackageDetailRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { @@ -213,7 +213,7 @@ func local_request_HelmPackagesService_GetInstalledPackageDetail_0(ctx context.C } func request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.CreateInstalledPackageRequest + var protoReq v1alpha1.CreateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -230,7 +230,7 @@ func request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Context, m } func local_request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.CreateInstalledPackageRequest + var protoReq v1alpha1.CreateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -247,7 +247,7 @@ func local_request_HelmPackagesService_CreateInstalledPackage_0(ctx context.Cont } func request_HelmPackagesService_UpdateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, client HelmPackagesServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.UpdateInstalledPackageRequest + var protoReq v1alpha1.UpdateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -264,7 +264,7 @@ func request_HelmPackagesService_UpdateInstalledPackage_0(ctx context.Context, m } func local_request_HelmPackagesService_UpdateInstalledPackage_0(ctx context.Context, marshaler runtime.Marshaler, server HelmPackagesServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq v1alpha1_0.UpdateInstalledPackageRequest + var protoReq v1alpha1.UpdateInstalledPackageRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -424,7 +424,7 @@ func RegisterHelmPackagesServiceHandlerServer(ctx context.Context, mux *runtime. }) - mux.Handle("PATCH", pattern_HelmPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_HelmPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -608,7 +608,7 @@ func RegisterHelmPackagesServiceHandlerClient(ctx context.Context, mux *runtime. }) - mux.Handle("PATCH", pattern_HelmPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_HelmPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) diff --git a/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.go b/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.go index 9a20dc98ae0..bfe6c5f2e22 100644 --- a/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.go +++ b/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.go @@ -399,7 +399,7 @@ var file_kubeappsapis_plugins_kapp_controller_packages_v1alpha1_kapp_controller_ 0x67, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x41, 0x32, 0x3c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x6b, 0x61, + 0x93, 0x02, 0x41, 0x1a, 0x3c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x6b, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, diff --git a/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.gw.go b/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.gw.go index 24e5964ef7b..80b3411ae3d 100644 --- a/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.gw.go +++ b/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1/kapp_controller.pb.gw.go @@ -483,7 +483,7 @@ func RegisterKappControllerPackagesServiceHandlerServer(ctx context.Context, mux }) - mux.Handle("PATCH", pattern_KappControllerPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_KappControllerPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -687,7 +687,7 @@ func RegisterKappControllerPackagesServiceHandlerClient(ctx context.Context, mux }) - mux.Handle("PATCH", pattern_KappControllerPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_KappControllerPackagesService_UpdateInstalledPackage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go index 63255605553..c5406ba8c8c 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go @@ -376,60 +376,47 @@ func (s *Server) newRelease(ctx context.Context, packageRef *corev1.AvailablePac }, nil } -func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString *string) error { +func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString string) error { ifc, err := s.getReleasesResourceInterface(ctx, packageRef.Context.Namespace) if err != nil { return err } - // for now we'll use types.MergePatchType, since - // - JSONPatchType requires existing value for 'replace' to exist, so we'd need to do a Get(...) first. Yuck - // - patchMap := map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{}, - }, - }, + unstructuredRel, err := ifc.Get(ctx, packageRef.Identifier, metav1.GetOptions{}) + if err != nil { + return err } if versionRef.GetVersion() != "" { - unstructured.SetNestedField(patchMap, versionRef.GetVersion(), "spec", "chart", "spec", "version") - } - - if valuesString != nil { - if *valuesString != "" { - values := make(map[string]interface{}) - if err = yaml.Unmarshal([]byte(*valuesString), &values); err != nil { - return err - } - unstructured.SetNestedMap(patchMap, values, "spec", "values") - } else { - // the semantics of this is a remove operation for a 'values' field - unstructured.SetNestedField(patchMap, nil, "spec", "values") - } + unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version") + } else { + unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "chart", "spec", "version") } - if reconcile != nil { - if reconcile.Interval > 0 { - reconcileInterval := (time.Duration(reconcile.Interval) * time.Second).String() - unstructured.SetNestedField(patchMap, reconcileInterval, "spec", "interval") + if valuesString != "" { + values := make(map[string]interface{}) + if err = yaml.Unmarshal([]byte(valuesString), &values); err != nil { + return err } + unstructured.SetNestedMap(unstructuredRel.Object, values, "spec", "values") + } else { + unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "values") } - bytes, err := json.Marshal(patchMap) - if err != nil { - return err - } - - log.Infof("About to patch release: %s", string(bytes)) + // TODO + // if reconcile != nil { + // if reconcile.Interval > 0 { + // reconcileInterval := (time.Duration(reconcile.Interval) * time.Second).String() + // unstructured.SetNestedField(patchMap, reconcileInterval, "spec", "interval") + // } + //} - patchedRel, err := ifc.Patch(ctx, packageRef.Identifier, types.MergePatchType, bytes, metav1.PatchOptions{}) + unstructuredRel, err = ifc.Update(ctx, unstructuredRel, metav1.UpdateOptions{}) if err != nil { return err } - log.Infof("Patched release: %s", prettyPrintMap(patchedRel.Object)) + log.Infof("Updated release: %s", prettyPrintMap(unstructuredRel.Object)) return nil } diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go index 1738dc2d02b..6d8e644ffa3 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go @@ -112,9 +112,6 @@ type integrationTestUpdateSpec struct { func TestKindClusterUpdateInstalledPackage(t *testing.T) { fluxPluginClient := checkEnv(t) - valuesString1 := "{\"ui\": { \"message\": \"what we do in the shadows\" } }" - valuesString2 := "{\"ui\": { \"message\": \"Le Bureau des Légendes\" } }" - valuesString3 := "" testCases := []integrationTestUpdateSpec{ { @@ -125,12 +122,7 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { expectedDetail: expected_detail_podinfo_5_2_1, expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, - request: &corev1.UpdateInstalledPackageRequest{ - // InstalledPackageRef will be filled in by the code below after a call to create(...) completes - PkgVersionReference: &corev1.VersionReference{ - Version: "6.0.0", - }, - }, + request: update_request_1, expectedDetailAfterUpdate: expected_detail_podinfo_6_0_0, }, { @@ -141,10 +133,7 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { expectedDetail: expected_detail_podinfo_5_2_1_no_values, expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, - request: &corev1.UpdateInstalledPackageRequest{ - // InstalledPackageRef will be filled in by the code below after a call to create(...) completes - Values: &valuesString1, - }, + request: update_request_2, expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values, }, { @@ -155,10 +144,7 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { expectedDetail: expected_detail_podinfo_5_2_1_values_2, expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, - request: &corev1.UpdateInstalledPackageRequest{ - // InstalledPackageRef will be filled in by the code below after a call to create(...) completes - Values: &valuesString2, - }, + request: update_request_3, expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values_3, }, { @@ -169,10 +155,7 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { expectedDetail: expected_detail_podinfo_5_2_1_values_4, expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, - request: &corev1.UpdateInstalledPackageRequest{ - // InstalledPackageRef will be filled in by the code below after a call to create(...) completes - Values: &valuesString3, - }, + request: update_request_4, expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values_5, }, { @@ -183,9 +166,7 @@ func TestKindClusterUpdateInstalledPackage(t *testing.T) { expectedDetail: expected_detail_podinfo_5_2_1_values_6, expectedPodPrefix: "@TARGET_NS@-my-podinfo-", }, - request: &corev1.UpdateInstalledPackageRequest{ - // InstalledPackageRef will be filled in by the code below after a call to create(...) completes - }, + request: update_request_5, expectedDetailAfterUpdate: expected_detail_podinfo_5_2_1_values_6, }, } @@ -971,4 +952,43 @@ var ( Plugin: fluxPlugin, }, } + + update_request_1 = &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + PkgVersionReference: &corev1.VersionReference{ + Version: "6.0.0", + }, + } + + update_request_2 = &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "{\"ui\": { \"message\": \"what we do in the shadows\" } }", + } + + update_request_3 = &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "{\"ui\": { \"message\": \"Le Bureau des Légendes\" } }", + } + + update_request_4 = &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "", + } + + update_request_5 = &corev1.UpdateInstalledPackageRequest{ + // InstalledPackageRef will be filled in by the code below after a call to create(...) completes + PkgVersionReference: &corev1.VersionReference{ + Version: "=5.2.1", + }, + Values: "{\"ui\": { \"message\": \"what we do in the shadows\" } }", + } ) diff --git a/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto b/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto index eedad421f79..9b1d53b6e92 100644 --- a/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto +++ b/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto @@ -50,7 +50,7 @@ service PackagesService { rpc UpdateInstalledPackage(UpdateInstalledPackageRequest) returns (UpdateInstalledPackageResponse) { option (google.api.http) = { - patch: "/core/packages/v1alpha1/installedpackages" + put: "/core/packages/v1alpha1/installedpackages" body: "*" }; } @@ -161,9 +161,17 @@ message CreateInstalledPackageRequest { // UpdateInstalledPackageRequest // -// Request for UpdateInstalledPackage. Partial resource updates are supported. -// For example, to change the package version one only needs to specify the version reference. -// Similarly to update the values, one only needs to specify that field +// Request for UpdateInstalledPackage. The intent is to reach the desired state specified +// by the fields in the request, while leaving other fields intact. This is a whole +// object "Update" semantics rather than "Patch" semantics. The caller will provide the +// values for the fields fields below, which will replace, or be overlayed onto, the +// corresponding fields in the existing resource. For example, with the +// UpdateInstalledPackageRequest, it is not possible to change just the 'package version +// reference' without also specifying 'values' field. As a side effect, not specifying the +// 'values' field in the request means there are no values specified in the desired state. +// So the meaning of each field is describing the desired state of the corresponding field +// in the resource. If the desired state already matches the current state, no resources +// are changed. message UpdateInstalledPackageRequest { // A reference uniquely identifying the installed package being updated. // Required @@ -172,18 +180,18 @@ message UpdateInstalledPackageRequest { // For helm this will be the exact version in VersionReference.version // For fluxv2 this could be any semver constraint expression // For other plugins we can extend the VersionReference as needed. Optional - optional VersionReference pkg_version_reference = 2; + VersionReference pkg_version_reference = 2; // An optional serialized values string to be included when templating a // package in the format expected by the plugin. Included when the backend // format doesn't use secrets or configmaps for values or supports both. // These values are layered on top of any values refs above, when // relevant. - optional string values = 3; + string values = 3; // An optional field for specifying data common to systems that reconcile // the package on the cluster. - optional ReconciliationOptions reconciliation_options = 4; + ReconciliationOptions reconciliation_options = 4; } // -- Start definitions of the response messages -- diff --git a/cmd/kubeapps-apis/proto/kubeappsapis/plugins/fluxv2/packages/v1alpha1/fluxv2.proto b/cmd/kubeapps-apis/proto/kubeappsapis/plugins/fluxv2/packages/v1alpha1/fluxv2.proto index fc041db1d09..52db45f8830 100644 --- a/cmd/kubeapps-apis/proto/kubeappsapis/plugins/fluxv2/packages/v1alpha1/fluxv2.proto +++ b/cmd/kubeapps-apis/proto/kubeappsapis/plugins/fluxv2/packages/v1alpha1/fluxv2.proto @@ -58,7 +58,7 @@ service FluxV2PackagesService { // UpdateInstalledPackage updates an installed package based on the request. rpc UpdateInstalledPackage(kubeappsapis.core.packages.v1alpha1.UpdateInstalledPackageRequest) returns (kubeappsapis.core.packages.v1alpha1.UpdateInstalledPackageResponse) { option (google.api.http) = { - patch: "/plugins/fluxv2/packages/v1alpha1/installedpackages" + put: "/plugins/fluxv2/packages/v1alpha1/installedpackages" body: "*" }; } diff --git a/cmd/kubeapps-apis/proto/kubeappsapis/plugins/helm/packages/v1alpha1/helm.proto b/cmd/kubeapps-apis/proto/kubeappsapis/plugins/helm/packages/v1alpha1/helm.proto index 891755575bb..1565aa71634 100644 --- a/cmd/kubeapps-apis/proto/kubeappsapis/plugins/helm/packages/v1alpha1/helm.proto +++ b/cmd/kubeapps-apis/proto/kubeappsapis/plugins/helm/packages/v1alpha1/helm.proto @@ -54,7 +54,7 @@ service HelmPackagesService { // UpdateInstalledPackage updates an installed package based on the request. rpc UpdateInstalledPackage(kubeappsapis.core.packages.v1alpha1.UpdateInstalledPackageRequest) returns (kubeappsapis.core.packages.v1alpha1.UpdateInstalledPackageResponse) { option (google.api.http) = { - patch: "/plugins/helm/packages/v1alpha1/installedpackages" + put: "/plugins/helm/packages/v1alpha1/installedpackages" body: "*" }; } diff --git a/cmd/kubeapps-apis/proto/kubeappsapis/plugins/kapp_controller/packages/v1alpha1/kapp_controller.proto b/cmd/kubeapps-apis/proto/kubeappsapis/plugins/kapp_controller/packages/v1alpha1/kapp_controller.proto index 4457562744c..81e169c5843 100644 --- a/cmd/kubeapps-apis/proto/kubeappsapis/plugins/kapp_controller/packages/v1alpha1/kapp_controller.proto +++ b/cmd/kubeapps-apis/proto/kubeappsapis/plugins/kapp_controller/packages/v1alpha1/kapp_controller.proto @@ -61,7 +61,7 @@ service KappControllerPackagesService { // UpdateInstalledPackage updates an installed package based on the request. rpc UpdateInstalledPackage(kubeappsapis.core.packages.v1alpha1.UpdateInstalledPackageRequest) returns (kubeappsapis.core.packages.v1alpha1.UpdateInstalledPackageResponse) { option (google.api.http) = { - patch: "/plugins/kapp_controller/packages/v1alpha1/installedpackages" + put: "/plugins/kapp_controller/packages/v1alpha1/installedpackages" body: "*" }; } From a3cff67bf0555c46f8faa7839e7279267fac7af8 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Tue, 21 Sep 2021 02:09:58 -0700 Subject: [PATCH 4/9] step 4 --- .../fluxv2/packages/v1alpha1/release.go | 106 +++-- .../fluxv2/packages/v1alpha1/release_test.go | 373 +++++++++++------- .../fluxv2/packages/v1alpha1/server.go | 4 +- 3 files changed, 312 insertions(+), 171 deletions(-) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go index c5406ba8c8c..392651af992 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go @@ -45,6 +45,8 @@ const ( fluxHelmRelease = "HelmRelease" fluxHelmReleases = "helmreleases" fluxHelmReleaseList = "HelmReleaseList" + + defaultReconcileInterval = "1m" ) func (s *Server) getReleasesResourceInterface(ctx context.Context, namespace string) (dynamic.ResourceInterface, error) { @@ -359,7 +361,10 @@ func (s *Server) newRelease(ctx context.Context, packageRef *corev1.AvailablePac } } - fluxHelmRelease := newFluxHelmRelease(chart, kubeappsNamespace, targetName, versionRef, reconcile, values) + fluxHelmRelease, err := newFluxHelmRelease(chart, kubeappsNamespace, targetName, versionRef, reconcile, values) + if err != nil { + return nil, err + } newRelease, err := resourceIfc.Create(ctx, fluxHelmRelease, metav1.CreateOptions{}) if err != nil { return nil, err @@ -376,48 +381,81 @@ func (s *Server) newRelease(ctx context.Context, packageRef *corev1.AvailablePac }, nil } -func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString string) error { +func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.InstalledPackageReference, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, valuesString string) (*corev1.InstalledPackageReference, error) { ifc, err := s.getReleasesResourceInterface(ctx, packageRef.Context.Namespace) if err != nil { - return err + return nil, err } unstructuredRel, err := ifc.Get(ctx, packageRef.Identifier, metav1.GetOptions{}) if err != nil { - return err + return nil, err } + // TODO: call newFluxRelease() with existing values OR at least + // get rid of the status before sending to update?? + if versionRef.GetVersion() != "" { - unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version") - } else { - unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "chart", "spec", "version") + if err = unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version"); err != nil { + return nil, err + } + } else if err = unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "chart", "spec", "version"); err != nil { + return nil, err } if valuesString != "" { values := make(map[string]interface{}) if err = yaml.Unmarshal([]byte(valuesString), &values); err != nil { - return err + return nil, err + } else if err = unstructured.SetNestedMap(unstructuredRel.Object, values, "spec", "values"); err != nil { + return nil, err + } + } else if err = unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "values"); err != nil { + return nil, err + } + + setInterval, setServiceAccount := false, false + if reconcile != nil { + if reconcile.Interval > 0 { + reconcileInterval := (time.Duration(reconcile.Interval) * time.Second).String() + if err := unstructured.SetNestedField(unstructuredRel.Object, reconcileInterval, "spec", "interval"); err != nil { + return nil, err + } + setInterval = true + } + if reconcile.ServiceAccountName != "" { + if err = unstructured.SetNestedField(unstructuredRel.Object, reconcile.ServiceAccountName, "spec", "serviceAccountName"); err != nil { + setServiceAccount = true + } + } + if err = unstructured.SetNestedField(unstructuredRel.Object, reconcile.Suspend, "spec", "suspend"); err != nil { + return nil, err } - unstructured.SetNestedMap(unstructuredRel.Object, values, "spec", "values") - } else { - unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "values") } - // TODO - // if reconcile != nil { - // if reconcile.Interval > 0 { - // reconcileInterval := (time.Duration(reconcile.Interval) * time.Second).String() - // unstructured.SetNestedField(patchMap, reconcileInterval, "spec", "interval") - // } - //} + if !setInterval { + if err = unstructured.SetNestedField(unstructuredRel.Object, defaultReconcileInterval, "spec", "interval"); err != nil { + return nil, err + } + } + if !setServiceAccount { + if err = unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "serviceAccountName"); err != nil { + return nil, err + } + } unstructuredRel, err = ifc.Update(ctx, unstructuredRel, metav1.UpdateOptions{}) if err != nil { - return err + return nil, err } - log.Infof("Updated release: %s", prettyPrintMap(unstructuredRel.Object)) - return nil + log.V(4).Infof("Updated release: %s", prettyPrintMap(unstructuredRel.Object)) + + return &corev1.InstalledPackageReference{ + Context: &corev1.Context{Namespace: packageRef.Context.Namespace}, + Identifier: packageRef.Identifier, + Plugin: GetPluginDetail(), + }, nil } // returns 3 things: @@ -538,7 +576,7 @@ func installedPackageAvailablePackageRefFromUnstructured(unstructuredRelease map // 1. spec.chart.spec.sourceRef.namespace, where HelmRepository CRD object referenced exists // 2. metadata.namespace, where this HelmRelease CRD will exist // 3. spec.targetNamespace, where flux will install any artifacts from the release -func newFluxHelmRelease(chart *models.Chart, releaseNamespace string, targetName types.NamespacedName, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, values map[string]interface{}) *unstructured.Unstructured { +func newFluxHelmRelease(chart *models.Chart, releaseNamespace string, targetName types.NamespacedName, versionRef *corev1.VersionReference, reconcile *corev1.ReconciliationOptions, values map[string]interface{}) (*unstructured.Unstructured, error) { unstructuredRel := unstructured.Unstructured{ Object: map[string]interface{}{ "apiVersion": fmt.Sprintf("%s/%s", fluxHelmReleaseGroup, fluxHelmReleaseVersion), @@ -566,23 +604,33 @@ func newFluxHelmRelease(chart *models.Chart, releaseNamespace string, targetName }, } if versionRef.GetVersion() != "" { - unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version") + if err := unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version"); err != nil { + return nil, err + } } - reconcileInterval := "1m" // unless explictly specified + reconcileInterval := defaultReconcileInterval // unless explictly specified if reconcile != nil { if reconcile.Interval > 0 { reconcileInterval = (time.Duration(reconcile.Interval) * time.Second).String() } - unstructured.SetNestedField(unstructuredRel.Object, reconcile.Suspend, "spec", "suspend") + if err := unstructured.SetNestedField(unstructuredRel.Object, reconcile.Suspend, "spec", "suspend"); err != nil { + return nil, err + } if reconcile.ServiceAccountName != "" { - unstructured.SetNestedField(unstructuredRel.Object, reconcile.ServiceAccountName, "spec", "serviceAccountName") + if err := unstructured.SetNestedField(unstructuredRel.Object, reconcile.ServiceAccountName, "spec", "serviceAccountName"); err != nil { + return nil, err + } } } if values != nil { - unstructured.SetNestedMap(unstructuredRel.Object, values, "spec", "values") + if err := unstructured.SetNestedMap(unstructuredRel.Object, values, "spec", "values"); err != nil { + return nil, err + } } // required fields, without which flux controller will fail to create the CRD - unstructured.SetNestedField(unstructuredRel.Object, reconcileInterval, "spec", "interval") - return &unstructuredRel + if err := unstructured.SetNestedField(unstructuredRel.Object, reconcileInterval, "spec", "interval"); err != nil { + return nil, err + } + return &unstructuredRel, nil } diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 360363f5253..16cd373f050 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -61,6 +61,7 @@ type testSpecGetInstalledPackages struct { releaseSuspend bool releaseServiceAccountName string releaseStatus map[string]interface{} + targetNamespace string } func TestGetInstalledPackageSummaries(t *testing.T) { @@ -243,76 +244,12 @@ func TestGetInstalledPackageSummaries(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - runtimeObjs := []runtime.Object{} - for _, existing := range tc.existingObjs { - tarGzBytes, err := ioutil.ReadFile(existing.chartTarGz) - if err != nil { - t.Fatalf("%+v", err) - } - - // stand up an http server just for the duration of this test - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(200) - w.Write(tarGzBytes) - })) - defer ts.Close() - - chartSpec := map[string]interface{}{ - "chart": existing.chartName, - "sourceRef": map[string]interface{}{ - "name": existing.repoName, - "kind": fluxHelmRepository, - }, - "version": existing.chartSpecVersion, - "interval": "10m", - } - chartStatus := map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "type": "Ready", - "status": "True", - "reason": "ChartPullSucceeded", - }, - }, - "artifact": map[string]interface{}{ - "revision": existing.chartArtifactVersion, - }, - "url": ts.URL, - } - chart := newChart(existing.chartName, existing.repoNamespace, chartSpec, chartStatus) - runtimeObjs = append(runtimeObjs, chart) - - releaseSpec := map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": existing.chartName, - "version": existing.chartSpecVersion, - "sourceRef": map[string]interface{}{ - "name": existing.repoName, - "kind": fluxHelmRepository, - "namespace": existing.repoNamespace, - }, - }, - }, - "interval": "1m", - } - if len(existing.releaseValues) != 0 { - unstructured.SetNestedMap(releaseSpec, existing.releaseValues, "values") - } - if existing.releaseSuspend { - unstructured.SetNestedField(releaseSpec, existing.releaseSuspend, "suspend") - } - if len(existing.releaseServiceAccountName) != 0 { - unstructured.SetNestedField(releaseSpec, existing.releaseServiceAccountName, "serviceAccountName") - } - release := newRelease(existing.releaseName, existing.releaseNamespace, releaseSpec, existing.releaseStatus) - runtimeObjs = append(runtimeObjs, release) - } - + runtimeObjs, cleanup := newRuntimeObjects(t, tc.existingObjs) s, mock, _, err := newServerWithChartsAndReleases(nil, runtimeObjs...) if err != nil { t.Fatalf("%+v", err) } + defer cleanup() for i, existing := range tc.existingObjs { if tc.request.GetPaginationOptions().GetPageSize() > 0 { @@ -405,7 +342,6 @@ func TestGetInstalledPackageDetail(t *testing.T) { existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_failed, }, - targetNamespace: "test", existingHelmStubs: []helmReleaseStub{ redis_existing_stub_failed, }, @@ -425,7 +361,6 @@ func TestGetInstalledPackageDetail(t *testing.T) { existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_pending, }, - targetNamespace: "test", existingHelmStubs: []helmReleaseStub{ redis_existing_stub_pending, }, @@ -445,7 +380,6 @@ func TestGetInstalledPackageDetail(t *testing.T) { existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_completed, }, - targetNamespace: "test", existingHelmStubs: []helmReleaseStub{ redis_existing_stub_completed, }, @@ -465,7 +399,6 @@ func TestGetInstalledPackageDetail(t *testing.T) { existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_completed, }, - targetNamespace: "test", expectedStatusCode: codes.NotFound, }, { @@ -481,7 +414,6 @@ func TestGetInstalledPackageDetail(t *testing.T) { existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_completed_with_values_and_reconciliation_options, }, - targetNamespace: "test", existingHelmStubs: []helmReleaseStub{ redis_existing_stub_completed, }, @@ -492,75 +424,8 @@ func TestGetInstalledPackageDetail(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - runtimeObjs := []runtime.Object{} - for _, existing := range tc.existingK8sObjs { - tarGzBytes, err := ioutil.ReadFile(existing.chartTarGz) - if err != nil { - t.Fatalf("%+v", err) - } - - // stand up an http server just for the duration of this test - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(200) - w.Write(tarGzBytes) - })) - defer ts.Close() - - chartSpec := map[string]interface{}{ - "chart": existing.chartName, - "sourceRef": map[string]interface{}{ - "name": existing.repoName, - "kind": fluxHelmRepository, - }, - "version": existing.chartSpecVersion, - "interval": "1m", - } - chartStatus := map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-12T03:25:38Z", - "message": "Fetched revision: " + existing.chartSpecVersion, - "type": "Ready", - "status": "True", - "reason": "ChartPullSucceeded", - }, - }, - "artifact": map[string]interface{}{ - "revision": existing.chartArtifactVersion, - }, - "url": ts.URL, - } - chart := newChart(existing.chartName, existing.repoNamespace, chartSpec, chartStatus) - runtimeObjs = append(runtimeObjs, chart) - - releaseSpec := map[string]interface{}{ - "chart": map[string]interface{}{ - "spec": map[string]interface{}{ - "chart": existing.chartName, - "version": existing.chartSpecVersion, - "sourceRef": map[string]interface{}{ - "name": existing.repoName, - "kind": fluxHelmRepository, - "namespace": existing.repoNamespace, - }, - }, - }, - "interval": "1m", - "targetNamespace": tc.targetNamespace, - } - if len(existing.releaseValues) != 0 { - unstructured.SetNestedMap(releaseSpec, existing.releaseValues, "values") - } - if existing.releaseSuspend { - unstructured.SetNestedField(releaseSpec, existing.releaseSuspend, "suspend") - } - if len(existing.releaseServiceAccountName) != 0 { - unstructured.SetNestedField(releaseSpec, existing.releaseServiceAccountName, "serviceAccountName") - } - release := newRelease(existing.releaseName, existing.releaseNamespace, releaseSpec, existing.releaseStatus) - runtimeObjs = append(runtimeObjs, release) - } - + runtimeObjs, cleanup := newRuntimeObjects(t, tc.existingK8sObjs) + defer cleanup() actionConfig := newHelmActionConfig(t, tc.targetNamespace, tc.existingHelmStubs) s, mock, _, err := newServerWithChartsAndReleases(actionConfig, runtimeObjs...) if err != nil { @@ -783,6 +648,178 @@ func TestCreateInstalledPackage(t *testing.T) { } } +func TestUpdateInstalledPackage(t *testing.T) { + testCases := []struct { + name string + request *corev1.UpdateInstalledPackageRequest + existingK8sObjs []testSpecGetInstalledPackages + expectedStatusCode codes.Code + expectedResponse *corev1.UpdateInstalledPackageResponse + expectedRelease map[string]interface{} + }{ + { + name: "update package (simple)", + request: &corev1.UpdateInstalledPackageRequest{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Identifier: "my-redis", + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + }, + PkgVersionReference: &corev1.VersionReference{ + Version: ">14.4.0", + }, + }, + existingK8sObjs: []testSpecGetInstalledPackages{ + redis_existing_spec_completed, + }, + expectedStatusCode: codes.OK, + expectedResponse: &corev1.UpdateInstalledPackageResponse{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Identifier: "my-redis", + Context: &corev1.Context{ + Namespace: "namespace-1", + }, + Plugin: fluxPlugin, + }, + }, + expectedRelease: flux_helm_release_updated_1, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + runtimeObjs, cleanup := newRuntimeObjects(t, tc.existingK8sObjs) + defer cleanup() + s, mock, _, err := newServerWithChartsAndReleases(nil, runtimeObjs...) + if err != nil { + t.Fatalf("%+v", err) + } + + response, err := s.UpdateInstalledPackage(context.Background(), tc.request) + + if got, want := status.Code(err), tc.expectedStatusCode; got != want { + t.Fatalf("got: %+v, want: %+v, err: %+v", got, want, err) + } + + // We don't need to check anything else for non-OK codes. + if tc.expectedStatusCode != codes.OK { + return + } + + opts := cmpopts.IgnoreUnexported( + corev1.UpdateInstalledPackageResponse{}, + corev1.InstalledPackageReference{}, + plugins.Plugin{}, + corev1.Context{}) + + if got, want := response, tc.expectedResponse; !cmp.Equal(want, got, opts) { + t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got, opts)) + } + + // we make sure that all expectations were met + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } + + // check expected HelmReleass CRD has been updated + dynamicClient, _, err = s.clientGetter(context.Background()) + if err != nil { + t.Fatalf("%+v", err) + } + + releaseObj, err := dynamicClient.Resource(releasesGvr). + Namespace(tc.expectedResponse.InstalledPackageRef.Context.Namespace).Get( + context.Background(), + tc.expectedResponse.InstalledPackageRef.Identifier, + v1.GetOptions{}) + if err != nil { + t.Fatalf("%+v", err) + } + + if got, want := releaseObj.Object, tc.expectedRelease; !cmp.Equal(want, got) { + t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got)) + } + }) + } +} + +func newRuntimeObjects(t *testing.T, existingK8sObjs []testSpecGetInstalledPackages) (runtimeObjs []runtime.Object, cleanup func()) { + for _, existing := range existingK8sObjs { + tarGzBytes, err := ioutil.ReadFile(existing.chartTarGz) + if err != nil { + t.Fatalf("%+v", err) + } + + // stand up an http server just for the duration of this test + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) + w.Write(tarGzBytes) + })) + cleanup = func() { ts.Close() } + + chartSpec := map[string]interface{}{ + "chart": existing.chartName, + "sourceRef": map[string]interface{}{ + "name": existing.repoName, + "kind": fluxHelmRepository, + }, + "version": existing.chartSpecVersion, + "interval": "1m", + } + chartStatus := map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-12T03:25:38Z", + "message": "Fetched revision: " + existing.chartSpecVersion, + "type": "Ready", + "status": "True", + "reason": "ChartPullSucceeded", + }, + }, + "artifact": map[string]interface{}{ + "revision": existing.chartArtifactVersion, + }, + "url": ts.URL, + } + chart := newChart(existing.chartName, existing.repoNamespace, chartSpec, chartStatus) + runtimeObjs = append(runtimeObjs, chart) + + releaseSpec := map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": existing.chartName, + "version": existing.chartSpecVersion, + "sourceRef": map[string]interface{}{ + "name": existing.repoName, + "kind": fluxHelmRepository, + "namespace": existing.repoNamespace, + }, + }, + }, + "interval": "1m", + "install": map[string]interface{}{ + "createNamespace": true, + }, + } + if len(existing.targetNamespace) != 0 { + unstructured.SetNestedField(releaseSpec, existing.targetNamespace, "targetNamespace") + } + if len(existing.releaseValues) != 0 { + unstructured.SetNestedMap(releaseSpec, existing.releaseValues, "values") + } + if existing.releaseSuspend { + unstructured.SetNestedField(releaseSpec, existing.releaseSuspend, "suspend") + } + if len(existing.releaseServiceAccountName) != 0 { + unstructured.SetNestedField(releaseSpec, existing.releaseServiceAccountName, "serviceAccountName") + } + release := newRelease(existing.releaseName, existing.releaseNamespace, releaseSpec, existing.releaseStatus) + runtimeObjs = append(runtimeObjs, release) + } + return runtimeObjs, cleanup +} + func compareActualVsExpectedGetInstalledPackageDetailResponse(t *testing.T, actualResp *corev1.GetInstalledPackageDetailResponse, expectedResp *corev1.GetInstalledPackageDetailResponse) { opts := cmpopts.IgnoreUnexported( corev1.GetInstalledPackageDetailResponse{}, @@ -1155,6 +1192,7 @@ var ( "lastAppliedRevision": "14.4.0", "lastAttemptedRevision": "14.4.0", }, + targetNamespace: "test", } redis_existing_stub_completed = helmReleaseStub{ @@ -1205,6 +1243,7 @@ var ( "lastAppliedRevision": "14.4.0", "lastAttemptedRevision": "14.4.0", }, + targetNamespace: "test", } redis_existing_spec_failed = testSpecGetInstalledPackages{ @@ -1238,6 +1277,7 @@ var ( "installFailures": "1", "lastAttemptedRevision": "14.4.0", }, + targetNamespace: "test", } redis_existing_stub_failed = helmReleaseStub{ @@ -1334,6 +1374,7 @@ var ( }, "lastAttemptedRevision": "14.4.0", }, + targetNamespace: "test", } redis_existing_spec_pending_2 = testSpecGetInstalledPackages{ @@ -1643,4 +1684,56 @@ var ( Plugin: fluxPlugin, }, } + + flux_helm_release_updated_1 = map[string]interface{}{ + "apiVersion": "helm.toolkit.fluxcd.io/v2beta1", + "kind": "HelmRelease", + "metadata": map[string]interface{}{ + "name": "my-redis", + "namespace": "namespace-1", + "generation": int64(1), + "resourceVersion": "1", + }, + "spec": map[string]interface{}{ + "chart": map[string]interface{}{ + "spec": map[string]interface{}{ + "chart": "redis", + "sourceRef": map[string]interface{}{ + "kind": "HelmRepository", + "name": "bitnami-1", + "namespace": "default", + }, + "version": ">14.4.0", + }, + }, + "install": map[string]interface{}{ + "createNamespace": true, + }, + "interval": "1m", + "targetNamespace": "test", + "values": nil, + "serviceAccountName": nil, + }, + "status": map[string]interface{}{ + "conditions": []interface{}{ + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Ready", + "status": "True", + "reason": "ReconciliationSucceeded", + "message": "Release reconciliation succeeded", + }, + map[string]interface{}{ + "lastTransitionTime": "2021-08-11T08:46:03Z", + "type": "Released", + "status": "True", + "reason": "InstallSucceeded", + "message": "Helm install succeeded", + }, + }, + "lastAppliedRevision": "14.4.0", + "lastAttemptedRevision": "14.4.0", + "observedGeneration": int64(1), + }, + } ) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go index c11adb49248..f0c5a916863 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go @@ -446,7 +446,7 @@ func (s *Server) UpdateInstalledPackage(ctx context.Context, request *corev1.Upd request.ProtoMessage() - if err := s.updateRelease( + if installedRef, err := s.updateRelease( ctx, request.InstalledPackageRef, request.PkgVersionReference, @@ -455,7 +455,7 @@ func (s *Server) UpdateInstalledPackage(ctx context.Context, request *corev1.Upd return nil, err } else { return &corev1.UpdateInstalledPackageResponse{ - InstalledPackageRef: request.InstalledPackageRef, + InstalledPackageRef: installedRef, }, nil } } From 5116eb009738367bb26b68f806e14f02f29ad343 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Tue, 21 Sep 2021 19:31:37 -0700 Subject: [PATCH 5/9] step 5 --- .../fluxv2/packages/v1alpha1/release.go | 22 ++-- .../v1alpha1/release_integration_test.go | 13 +- .../fluxv2/packages/v1alpha1/release_test.go | 113 ++++++------------ .../core/packages/v1alpha1/packages.proto | 5 +- 4 files changed, 58 insertions(+), 95 deletions(-) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go index 392651af992..19b0a126d46 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go @@ -392,15 +392,12 @@ func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.Installed return nil, err } - // TODO: call newFluxRelease() with existing values OR at least - // get rid of the status before sending to update?? - if versionRef.GetVersion() != "" { if err = unstructured.SetNestedField(unstructuredRel.Object, versionRef.GetVersion(), "spec", "chart", "spec", "version"); err != nil { return nil, err } - } else if err = unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "chart", "spec", "version"); err != nil { - return nil, err + } else { + unstructured.RemoveNestedField(unstructuredRel.Object, "spec", "chart", "spec", "version") } if valuesString != "" { @@ -410,8 +407,8 @@ func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.Installed } else if err = unstructured.SetNestedMap(unstructuredRel.Object, values, "spec", "values"); err != nil { return nil, err } - } else if err = unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "values"); err != nil { - return nil, err + } else { + unstructured.RemoveNestedField(unstructuredRel.Object, "spec", "values") } setInterval, setServiceAccount := false, false @@ -434,16 +431,21 @@ func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.Installed } if !setInterval { + // interval is a required field if err = unstructured.SetNestedField(unstructuredRel.Object, defaultReconcileInterval, "spec", "interval"); err != nil { return nil, err } } if !setServiceAccount { - if err = unstructured.SetNestedField(unstructuredRel.Object, nil, "spec", "serviceAccountName"); err != nil { - return nil, err - } + unstructured.RemoveNestedField(unstructuredRel.Object, "spec", "serviceAccountName") } + // get rid of the status field, since now there will be a new reconciliation process and the current status no + // longer applies. metadata and spec I want to keep, as they may have had added labels and/or annotations and/or + // even other changes made by the user. + unstructured.RemoveNestedField(unstructuredRel.Object, "status") + + // replace the object in k8s with a new desired state unstructuredRel, err = ifc.Update(ctx, unstructuredRel, metav1.UpdateOptions{}) if err != nil { return nil, err diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go index 6d8e644ffa3..6655d7a3cac 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go @@ -563,9 +563,16 @@ var ( Interval: 60, }, Status: &corev1.InstalledPackageStatus{ - Ready: false, - Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, - UserReason: "InstallFailed: install retries exhausted", + Ready: false, + Reason: corev1.InstalledPackageStatus_STATUS_REASON_FAILED, + // most of the time it fails with + // "InstallFailed: install retries exhausted", + // but every once in a while you get + // "InstallFailed: Helm install failed: unable to build kubernetes objects from release manifest: error + // validating "": error validating data: ValidationError(Deployment.spec.replicas): invalid type for + // io.k8s.api.apps.v1.DeploymentSpec.replicas: got "string"" + // so we'll just test the prefix + UserReason: "InstallFailed: ", }, AvailablePackageRef: &corev1.AvailablePackageReference{ Identifier: "podinfo-5/podinfo", diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 16cd373f050..3d708a864d9 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -19,6 +19,7 @@ import ( "io/ioutil" "net/http" "net/http/httptest" + "strings" "testing" redismock "github.com/go-redis/redismock/v8" @@ -675,13 +676,7 @@ func TestUpdateInstalledPackage(t *testing.T) { }, expectedStatusCode: codes.OK, expectedResponse: &corev1.UpdateInstalledPackageResponse{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Identifier: "my-redis", - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Plugin: fluxPlugin, - }, + InstalledPackageRef: my_redis_ref, }, expectedRelease: flux_helm_release_updated_1, }, @@ -832,8 +827,13 @@ func compareActualVsExpectedGetInstalledPackageDetailResponse(t *testing.T, actu plugins.Plugin{}, corev1.ReconciliationOptions{}, corev1.AvailablePackageReference{}) - if got, want := actualResp, expectedResp; !cmp.Equal(want, got, opts) { - t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got, opts)) + // see comment in release_intergration_test.go. Intermittently we get an inconsistent error message from flux + opts2 := cmpopts.IgnoreFields(corev1.InstalledPackageStatus{}, "UserReason") + if got, want := actualResp, expectedResp; !cmp.Equal(want, got, opts, opts2) { + t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got, opts, opts2)) + } + if !strings.Contains(actualResp.InstalledPackageDetail.Status.UserReason, expectedResp.InstalledPackageDetail.Status.UserReason) { + t.Errorf("substring mismatch (-want: %s\n+got: %s):\n", expectedResp.InstalledPackageDetail.Status.UserReason, actualResp.InstalledPackageDetail.Status.UserReason) } } @@ -968,16 +968,18 @@ var ( UserReason: "ReconciliationSucceeded: Release reconciliation succeeded", } - redis_summary_installed = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, + my_redis_ref = &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "namespace-1", }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + Identifier: "my-redis", + Plugin: fluxPlugin, + } + + redis_summary_installed = &corev1.InstalledPackageSummary{ + InstalledPackageRef: my_redis_ref, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", PkgVersionReference: &corev1.VersionReference{ Version: "14.4.0", }, @@ -995,15 +997,9 @@ var ( } redis_summary_failed = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", PkgVersionReference: &corev1.VersionReference{ Version: "14.4.0", }, @@ -1025,15 +1021,9 @@ var ( } redis_summary_pending = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", PkgVersionReference: &corev1.VersionReference{ Version: "14.4.0", }, @@ -1055,15 +1045,9 @@ var ( } redis_summary_pending_2 = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", PkgVersionReference: &corev1.VersionReference{ Version: "14.4.0", }, @@ -1111,15 +1095,9 @@ var ( } redis_summary_latest = &corev1.InstalledPackageSummary{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", - IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", + IconUrl: "https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png", PkgVersionReference: &corev1.VersionReference{ Version: "*", }, @@ -1709,31 +1687,8 @@ var ( "install": map[string]interface{}{ "createNamespace": true, }, - "interval": "1m", - "targetNamespace": "test", - "values": nil, - "serviceAccountName": nil, - }, - "status": map[string]interface{}{ - "conditions": []interface{}{ - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Ready", - "status": "True", - "reason": "ReconciliationSucceeded", - "message": "Release reconciliation succeeded", - }, - map[string]interface{}{ - "lastTransitionTime": "2021-08-11T08:46:03Z", - "type": "Released", - "status": "True", - "reason": "InstallSucceeded", - "message": "Helm install succeeded", - }, - }, - "lastAppliedRevision": "14.4.0", - "lastAttemptedRevision": "14.4.0", - "observedGeneration": int64(1), + "interval": "1m", + "targetNamespace": "test", }, } ) diff --git a/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto b/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto index 9b1d53b6e92..8c4ecbd197b 100644 --- a/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto +++ b/cmd/kubeapps-apis/proto/kubeappsapis/core/packages/v1alpha1/packages.proto @@ -169,9 +169,8 @@ message CreateInstalledPackageRequest { // UpdateInstalledPackageRequest, it is not possible to change just the 'package version // reference' without also specifying 'values' field. As a side effect, not specifying the // 'values' field in the request means there are no values specified in the desired state. -// So the meaning of each field is describing the desired state of the corresponding field -// in the resource. If the desired state already matches the current state, no resources -// are changed. +// So the meaning of each field value is describing the desired state of the corresponding +// field in the resource after the update operation has completed the renconciliation. message UpdateInstalledPackageRequest { // A reference uniquely identifying the installed package being updated. // Required From d0b3fee255be0eb02a1401f06d3bdf0e37a06d77 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Tue, 21 Sep 2021 20:08:53 -0700 Subject: [PATCH 6/9] step 6 --- .../fluxv2/packages/v1alpha1/release_test.go | 75 ++++--------------- 1 file changed, 13 insertions(+), 62 deletions(-) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 3d708a864d9..32e236e622b 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -333,12 +333,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { { name: "returns installed package detail when install fails", request: &corev1.GetInstalledPackageDetailRequest{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Identifier: "my-redis", - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - }, + InstalledPackageRef: my_redis_ref, }, existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_failed, @@ -352,12 +347,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { { name: "returns installed package detail when install is in progress", request: &corev1.GetInstalledPackageDetailRequest{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Identifier: "my-redis", - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - }, + InstalledPackageRef: my_redis_ref, }, existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_pending, @@ -371,12 +361,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { { name: "returns installed package detail when install is successful", request: &corev1.GetInstalledPackageDetailRequest{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Identifier: "my-redis", - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - }, + InstalledPackageRef: my_redis_ref, }, existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_completed, @@ -405,12 +390,7 @@ func TestGetInstalledPackageDetail(t *testing.T) { { name: "returns values and reconciliation options in package detail", request: &corev1.GetInstalledPackageDetailRequest{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - }, + InstalledPackageRef: my_redis_ref, }, existingK8sObjs: []testSpecGetInstalledPackages{ redis_existing_spec_completed_with_values_and_reconciliation_options, @@ -661,12 +641,7 @@ func TestUpdateInstalledPackage(t *testing.T) { { name: "update package (simple)", request: &corev1.UpdateInstalledPackageRequest{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Identifier: "my-redis", - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - }, + InstalledPackageRef: my_redis_ref, PkgVersionReference: &corev1.VersionReference{ Version: ">14.4.0", }, @@ -1421,14 +1396,8 @@ var ( } redis_detail_failed = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", PkgVersionReference: &corev1.VersionReference{ Version: "14.4.0", }, @@ -1453,14 +1422,8 @@ var ( } redis_detail_pending = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", PkgVersionReference: &corev1.VersionReference{ Version: "14.4.0", }, @@ -1485,14 +1448,8 @@ var ( } redis_detail_completed = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", CurrentVersion: &corev1.PackageAppVersion{ AppVersion: "1.2.3", PkgVersion: "14.4.0", @@ -1513,14 +1470,8 @@ var ( } redis_detail_completed_with_values_and_reconciliation_options = &corev1.InstalledPackageDetail{ - InstalledPackageRef: &corev1.InstalledPackageReference{ - Context: &corev1.Context{ - Namespace: "namespace-1", - }, - Identifier: "my-redis", - Plugin: fluxPlugin, - }, - Name: "my-redis", + InstalledPackageRef: my_redis_ref, + Name: "my-redis", CurrentVersion: &corev1.PackageAppVersion{ AppVersion: "1.2.3", PkgVersion: "14.4.0", From 4c0d67760eba759a0bc4bb1128f74abbf3124753 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Tue, 21 Sep 2021 20:42:24 -0700 Subject: [PATCH 7/9] step 6 --- .../fluxv2/packages/v1alpha1/release.go | 6 +++++- .../fluxv2/packages/v1alpha1/release_test.go | 21 ++++++++++++++++++- .../fluxv2/packages/v1alpha1/server.go | 2 -- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go index 19b0a126d46..e22e1526e1d 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release.go @@ -389,7 +389,11 @@ func (s *Server) updateRelease(ctx context.Context, packageRef *corev1.Installed unstructuredRel, err := ifc.Get(ctx, packageRef.Identifier, metav1.GetOptions{}) if err != nil { - return nil, err + if errors.IsNotFound(err) { + return nil, status.Errorf(codes.NotFound, "%q", err) + } else { + return nil, status.Errorf(codes.Internal, "%q", err) + } } if versionRef.GetVersion() != "" { diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 32e236e622b..6b81687ae24 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -655,6 +655,18 @@ func TestUpdateInstalledPackage(t *testing.T) { }, expectedRelease: flux_helm_release_updated_1, }, + { + name: "returns invalid if installed package doesn't exist", + request: &corev1.UpdateInstalledPackageRequest{ + InstalledPackageRef: &corev1.InstalledPackageReference{ + Context: &corev1.Context{ + Namespace: "default", + }, + Identifier: "not-a-valid-identifier", + }, + }, + expectedStatusCode: codes.NotFound, + }, } for _, tc := range testCases { @@ -715,6 +727,13 @@ func TestUpdateInstalledPackage(t *testing.T) { } func newRuntimeObjects(t *testing.T, existingK8sObjs []testSpecGetInstalledPackages) (runtimeObjs []runtime.Object, cleanup func()) { + httpServers := []*httptest.Server{} + cleanup = func() { + for _, ts := range httpServers { + ts.Close() + } + } + for _, existing := range existingK8sObjs { tarGzBytes, err := ioutil.ReadFile(existing.chartTarGz) if err != nil { @@ -726,7 +745,7 @@ func newRuntimeObjects(t *testing.T, existingK8sObjs []testSpecGetInstalledPacka w.WriteHeader(200) w.Write(tarGzBytes) })) - cleanup = func() { ts.Close() } + httpServers = append(httpServers, ts) chartSpec := map[string]interface{}{ "chart": existing.chartName, diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go index f0c5a916863..65ba16d53ab 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/server.go @@ -444,8 +444,6 @@ func (s *Server) UpdateInstalledPackage(ctx context.Context, request *corev1.Upd return nil, status.Errorf(codes.InvalidArgument, "no request InstalledPackageRef provided") } - request.ProtoMessage() - if installedRef, err := s.updateRelease( ctx, request.InstalledPackageRef, From 682df8c6a9f0a4af5a9acced0206b9ff49e8020c Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Tue, 21 Sep 2021 23:07:09 -0700 Subject: [PATCH 8/9] Michael feedback #1 --- .../fluxv2/packages/v1alpha1/integration_utils_test.go | 8 +++++--- .../plugins/fluxv2/packages/v1alpha1/release_test.go | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go index 96e1dd99e58..eeb7b29c9cb 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go @@ -332,6 +332,8 @@ func randSeq(n int) string { } // global vars -var letters = []rune("abcdefghijklmnopqrstuvwxyz0123456789") -var typedClient kubernetes.Interface -var dynamicClient dynamic.Interface +var ( + dynamicClient dynamic.Interface + typedClient kubernetes.Interface + letters = []rune("abcdefghijklmnopqrstuvwxyz0123456789") +) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go index 6b81687ae24..e12f1e6f404 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_test.go @@ -656,7 +656,7 @@ func TestUpdateInstalledPackage(t *testing.T) { expectedRelease: flux_helm_release_updated_1, }, { - name: "returns invalid if installed package doesn't exist", + name: "returns not found if installed package doesn't exist", request: &corev1.UpdateInstalledPackageRequest{ InstalledPackageRef: &corev1.InstalledPackageReference{ Context: &corev1.Context{ From b12702fb77b11d3815a53e60101bfb6b2136e906 Mon Sep 17 00:00:00 2001 From: gfichtenholt Date: Tue, 21 Sep 2021 23:12:43 -0700 Subject: [PATCH 9/9] Michael's feedback #1a --- .../fluxv2/packages/v1alpha1/integration_utils_test.go | 5 +++++ .../fluxv2/packages/v1alpha1/release_integration_test.go | 8 +++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go index eeb7b29c9cb..14a33759453 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/integration_utils_test.go @@ -38,6 +38,11 @@ import ( "k8s.io/client-go/tools/clientcmd" ) +const ( + // EnvvarFluxIntegrationTests enables tests that run against a local kind cluster + envVarFluxIntegrationTests = "ENABLE_FLUX_INTEGRATION_TESTS" +) + func checkEnv(t *testing.T) fluxplugin.FluxV2PackagesServiceClient { enableEnvVar := os.Getenv(envVarFluxIntegrationTests) runTests := false diff --git a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go index 6655d7a3cac..fd5c0a24ebf 100644 --- a/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go +++ b/cmd/kubeapps-apis/plugins/fluxv2/packages/v1alpha1/release_integration_test.go @@ -36,11 +36,9 @@ import ( // 3) run ./kind-cluster-setup.sh once prior to these tests const ( - // EnvvarFluxIntegrationTests enables tests that run against a local kind cluster - envVarFluxIntegrationTests = "ENABLE_FLUX_INTEGRATION_TESTS" - - // the only repo this test uses so far. Enough for this test. This is local copy of the first few entries - // on "https://stefanprodan.github.io/podinfo/index.yaml" on Sept 10 2021. + // the only repo these tests use so far. This is local copy of the first few entries + // on "https://stefanprodan.github.io/podinfo/index.yaml" as of Sept 10 2021 with the chart + // urls modified to link to .tgz files also within the local cluster. // If we want other repos, we'll have add directories and tinker with ./Dockerfile and NGINX conf. // This relies on fluxv2plugin-testdata-svc service stood up by testdata/kind-cluster-setup.sh podinfo_repo_url = "http://fluxv2plugin-testdata-svc.default.svc.cluster.local:80"