|
|
@@ -1,6 +1,7 @@
|
|
|
package cluster
|
|
|
|
|
|
import (
|
|
|
+ "context"
|
|
|
"fmt"
|
|
|
"net/http"
|
|
|
|
|
|
@@ -13,7 +14,14 @@ import (
|
|
|
"github.com/porter-dev/porter/internal/auth/token"
|
|
|
"github.com/porter-dev/porter/internal/helm"
|
|
|
"github.com/porter-dev/porter/internal/helm/loader"
|
|
|
+ "github.com/porter-dev/porter/internal/kubernetes"
|
|
|
"github.com/porter-dev/porter/internal/models"
|
|
|
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ monitoringNodeLabel = "porter.run/workload-kind=monitoring"
|
|
|
+ olderAgentLabel = "control-plane=controller-manager"
|
|
|
)
|
|
|
|
|
|
type InstallAgentHandler struct {
|
|
|
@@ -36,6 +44,21 @@ func (c *InstallAgentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
|
|
proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
|
|
|
user, _ := r.Context().Value(types.UserScope).(*models.User)
|
|
|
cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
|
|
|
+
|
|
|
+ k8sAgent, err := c.GetAgent(r, cluster, "porter-agent-system")
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ err = checkAndDeleteOlderAgent(k8sAgent)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
helmAgent, err := c.GetHelmAgent(r, cluster, "porter-agent-system")
|
|
|
|
|
|
if err != nil {
|
|
|
@@ -87,6 +110,13 @@ func (c *InstallAgentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
|
|
},
|
|
|
}
|
|
|
|
|
|
+ if exists, err := checkIfMonitoringNodeExists(k8sAgent); err != nil {
|
|
|
+ c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
|
|
|
+ return
|
|
|
+ } else if exists {
|
|
|
+ porterAgentValues["monitoringWorkload"] = true
|
|
|
+ }
|
|
|
+
|
|
|
conf := &helm.InstallChartConfig{
|
|
|
Chart: chart,
|
|
|
Name: "porter-agent",
|
|
|
@@ -100,8 +130,7 @@ func (c *InstallAgentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
|
|
|
|
|
if err != nil {
|
|
|
c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(
|
|
|
- fmt.Errorf("error installing a new chart: %s", err.Error()),
|
|
|
- http.StatusBadRequest,
|
|
|
+ fmt.Errorf("error installing porter-agent: %w", err), http.StatusBadRequest,
|
|
|
))
|
|
|
|
|
|
return
|
|
|
@@ -109,3 +138,61 @@ func (c *InstallAgentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
|
|
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
}
|
|
|
+
|
|
|
+func checkAndDeleteOlderAgent(k8sAgent *kubernetes.Agent) error {
|
|
|
+ namespaceList, err := k8sAgent.Clientset.CoreV1().Namespaces().List(context.Background(), v1.ListOptions{})
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("error listing namespaces: %w", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ nsExists := false
|
|
|
+
|
|
|
+ for _, namespace := range namespaceList.Items {
|
|
|
+ if namespace.Name == "porter-agent-system" {
|
|
|
+ nsExists = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if !nsExists {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ podList, err := k8sAgent.Clientset.CoreV1().Pods("porter-agent-system").List(context.Background(), v1.ListOptions{
|
|
|
+ LabelSelector: olderAgentLabel,
|
|
|
+ })
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("error listing pods for older porter-agent: %w", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(podList.Items) > 0 {
|
|
|
+ // older porter-agent exists, delete the entire namespace
|
|
|
+ err := k8sAgent.Clientset.CoreV1().Namespaces().Delete(
|
|
|
+ context.Background(), "porter-agent-system", v1.DeleteOptions{},
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("error deleting older porter-agent's namespace: %w", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func checkIfMonitoringNodeExists(k8sAgent *kubernetes.Agent) (bool, error) {
|
|
|
+ nodeList, err := k8sAgent.Clientset.CoreV1().Nodes().List(context.Background(), v1.ListOptions{
|
|
|
+ LabelSelector: monitoringNodeLabel,
|
|
|
+ })
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return false, fmt.Errorf("error listing nodes: %w", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(nodeList.Items) > 0 {
|
|
|
+ return true, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ return false, nil
|
|
|
+}
|