From db171f73fb6b65d03ad67f3540f18a36dd16c655 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Sat, 12 Sep 2020 15:55:58 -0700 Subject: [PATCH] Fix issues with agent deployment --- modules/agent/pkg/deployer/monitor.go | 4 +-- modules/agent/pkg/register/register.go | 9 ++++- modules/cli/agentmanifest/agent.go | 33 +++++++------------ pkg/agent/manifest.go | 12 +++++-- pkg/controllers/display/displaycontrollers.go | 2 +- pkg/controllers/manageagent/manageagent.go | 2 +- pkg/helmdeployer/deployer.go | 30 +++++++++++++++++ 7 files changed, 63 insertions(+), 29 deletions(-) diff --git a/modules/agent/pkg/deployer/monitor.go b/modules/agent/pkg/deployer/monitor.go index 081020b5f4..3ea43713e0 100644 --- a/modules/agent/pkg/deployer/monitor.go +++ b/modules/agent/pkg/deployer/monitor.go @@ -3,10 +3,9 @@ package deployer import ( "sort" - "github.com/rancher/wrangler/pkg/name" - fleet "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" "github.com/rancher/wrangler/pkg/apply" + "github.com/rancher/wrangler/pkg/name" "github.com/rancher/wrangler/pkg/summary" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) @@ -23,6 +22,7 @@ func (m *Manager) getApply(bd *fleet.BundleDeployment, ns string) apply.Apply { ns = m.defaultNamespace } return m.apply. + WithIgnorePreviousApplied(). WithSetID(name.SafeConcatName(m.labelPrefix, bd.Name)). WithDefaultNamespace(ns) } diff --git a/modules/agent/pkg/register/register.go b/modules/agent/pkg/register/register.go index 3e4d54abcd..b90684f1aa 100644 --- a/modules/agent/pkg/register/register.go +++ b/modules/agent/pkg/register/register.go @@ -210,7 +210,14 @@ func createClusterSecret(ctx context.Context, clusterID string, k8s corecontroll }, } - return k8s.Secret().Create(updatedSecret) + secret, err := k8s.Secret().Create(updatedSecret) + if apierrors.IsAlreadyExists(err) { + if err = k8s.Secret().Delete(updatedSecret.Namespace, updatedSecret.Name, &metav1.DeleteOptions{}); err != nil { + return nil, err + } + secret, err = k8s.Secret().Create(updatedSecret) + } + return secret, err } } diff --git a/modules/cli/agentmanifest/agent.go b/modules/cli/agentmanifest/agent.go index cadf42fe41..860d18be5c 100644 --- a/modules/cli/agentmanifest/agent.go +++ b/modules/cli/agentmanifest/agent.go @@ -33,12 +33,13 @@ var ( ) type Options struct { - CA []byte - Host string - NoCA bool - NoCheck bool - Labels map[string]string - ClientID string + CA []byte + Host string + NoCA bool + NoCheck bool + Labels map[string]string + ClientID string + Generation string } func AgentToken(ctx context.Context, controllerNamespace, kubeConfigFile string, client *client.Client, tokenName string, opts *Options) ([]runtime.Object, error) { @@ -133,7 +134,7 @@ func AgentManifest(ctx context.Context, systemNamespace, controllerNamespace str return err } - objs = append(objs, agent.Manifest(controllerNamespace, cfg.AgentImage, cfg.AgentImagePullPolicy)...) + objs = append(objs, agent.Manifest(controllerNamespace, cfg.AgentImage, cfg.AgentImagePullPolicy, opts.Generation)...) data, err := yaml.Export(objs...) if err != nil { @@ -162,6 +163,8 @@ func getKubeConfig(kubeConfig string, namespace string, token []byte, host strin return "", err } + customHost := len(host) > 0 + host, doCheckHost, err := getHost(host, cfg) if err != nil { return "", err @@ -175,7 +178,7 @@ func getKubeConfig(kubeConfig string, namespace string, token []byte, host strin if noCA { ca = nil - } else { + } else if !customHost { ca, err = getCA(ca, cfg) if err != nil { return "", err @@ -208,20 +211,6 @@ func getKubeConfig(kubeConfig string, namespace string, token []byte, host strin return string(data), err } -func getCluster(cfg clientcmdapi.Config) (*clientcmdapi.Cluster, error) { - ctx := cfg.Contexts[cfg.CurrentContext] - if ctx == nil { - return nil, fmt.Errorf("failed to find host for agent access, context not found") - } - - cluster := cfg.Clusters[ctx.Cluster] - if cluster == nil { - return nil, fmt.Errorf("failed to find host for agent access, cluster not found") - } - - return cluster, nil -} - func getHost(host string, cfg clientcmdapi.Config) (string, bool, error) { if host != "" { return host, false, nil diff --git a/pkg/agent/manifest.go b/pkg/agent/manifest.go index c1152ca0a6..e405d53f46 100644 --- a/pkg/agent/manifest.go +++ b/pkg/agent/manifest.go @@ -3,6 +3,7 @@ package agent import ( "github.com/rancher/fleet/pkg/basic" "github.com/rancher/fleet/pkg/config" + corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/runtime" ) @@ -11,7 +12,7 @@ const ( DefaultName = "fleet-agent" ) -func Manifest(namespace, image, pullPolicy string) []runtime.Object { +func Manifest(namespace, image, pullPolicy, generation string) []runtime.Object { if image == "" { image = config.DefaultAgentImage } @@ -26,8 +27,15 @@ func Manifest(namespace, image, pullPolicy string) []runtime.Object { }, ) + dep := basic.Deployment(namespace, DefaultName, image, pullPolicy, DefaultName) + dep.Spec.Template.Spec.Containers[0].Env = append(dep.Spec.Template.Spec.Containers[0].Env, + corev1.EnvVar{ + Name: "GENERATION", + Value: generation, + }) + objs := []runtime.Object{ - basic.Deployment(namespace, DefaultName, image, pullPolicy, DefaultName), + dep, sa, } objs = append(objs, clusterRole...) diff --git a/pkg/controllers/display/displaycontrollers.go b/pkg/controllers/display/displaycontrollers.go index ef34319233..01ac4b83c7 100644 --- a/pkg/controllers/display/displaycontrollers.go +++ b/pkg/controllers/display/displaycontrollers.go @@ -62,7 +62,7 @@ func (h *handler) OnClusterChange(cluster *fleet.Cluster, status fleet.ClusterSt } status.Display.State = string(state) - if status.Agent.LastSeen.IsZero() && (status.AgentDeployed == nil || !*status.AgentDeployed) { + if status.Agent.LastSeen.IsZero() && status.AgentLastDeployed == nil { status.Display.State = "ErrNoAgent" } return status, nil diff --git a/pkg/controllers/manageagent/manageagent.go b/pkg/controllers/manageagent/manageagent.go index 19f96079ef..4e1b36da3c 100644 --- a/pkg/controllers/manageagent/manageagent.go +++ b/pkg/controllers/manageagent/manageagent.go @@ -84,7 +84,7 @@ func (h *handler) getAgentBundle(ns string) ([]runtime.Object, error) { return nil, nil } - objs := agent.Manifest(h.systemNamespace, cfg.AgentImage, cfg.AgentImagePullPolicy) + objs := agent.Manifest(h.systemNamespace, cfg.AgentImage, cfg.AgentImagePullPolicy, "") agentYAML, err := yaml.Export(objs...) if err != nil { return nil, err diff --git a/pkg/helmdeployer/deployer.go b/pkg/helmdeployer/deployer.go index efa3b755e7..32b5cd8aec 100644 --- a/pkg/helmdeployer/deployer.go +++ b/pkg/helmdeployer/deployer.go @@ -259,6 +259,9 @@ func (h *helm) install(bundleID string, manifest *manifest.Manifest, chart *char u.Timeout = timeout u.DryRun = dryRun u.PostRenderer = pr + if !dryRun { + logrus.Infof("Helm: Installing %s", bundleID) + } return u.Run(chart, vals) } @@ -270,6 +273,9 @@ func (h *helm) install(bundleID string, manifest *manifest.Manifest, chart *char u.Atomic = true u.DryRun = dryRun u.PostRenderer = pr + if !dryRun { + logrus.Infof("Helm: Upgrading %s", bundleID) + } return u.Run(bundleID, chart, vals) } @@ -353,14 +359,38 @@ func (h *helm) delete(bundleID string, options fleet.BundleDeploymentOptions, dr return err } + if bundleID == "fleet-agent" { + // Never uninstall the fleet-agent, just "forget" it + return deleteHistory(cfg, bundleID) + } + u := action.NewUninstall(&cfg) u.DryRun = dryRun u.Timeout = timeout + if !dryRun { + logrus.Infof("Helm: Uninstalling %s", bundleID) + } _, err = u.Run(bundleID) return err } +func deleteHistory(cfg action.Configuration, bundleID string) error { + releases, err := cfg.Releases.List(func(r *release.Release) bool { + return r.Name == bundleID && r.Chart.Metadata.Annotations[BundleIDAnnotation] == bundleID + }) + if err != nil { + return err + } + for _, release := range releases { + logrus.Infof("Helm: Deleting release %s %d", release.Name, release.Version) + if _, err := cfg.Releases.Delete(release.Name, release.Version); err != nil { + return err + } + } + return nil +} + func releaseToResources(release *release.Release) (*deployer.Resources, error) { var ( err error