Przeglądaj źródła

Merge branch 'master' of github.com:porter-dev/porter into stacks-v1

Feroze Mohideen 3 lat temu
rodzic
commit
42f9852ef9

+ 1 - 1
.github/workflows/prerelease.yaml

@@ -342,7 +342,7 @@ jobs:
         uses: softprops/action-gh-release@v1
         with:
           tag_name: ${{ github.ref }}
-          name: Release ${{ github.ref }}
+          name: Release ${{ github.ref_name }}
           token: ${{ secrets.GITHUB_TOKEN }}
           draft: false
           prerelease: true

+ 9 - 19
Tiltfile

@@ -62,12 +62,19 @@ local_resource(
   labels=["z_binaries"]
 )
 
+local_resource(
+    name="migrations-binary",
+    cmd='''GOWORK=off CGO_ENABLED=0 %s go build -mod vendor -gcflags '-N -l' -tags ee -o ./bin/migrate ./cmd/migrate/main.go ./cmd/migrate/migrate_ee.go''' % build_args,
+    resource_deps=["postgresql"],
+    labels=["z_binaries"],
+)
+
 docker_build_with_restart(
     ref="porter1/porter-server",
     context=".",
     dockerfile="zarf/docker/Dockerfile.server.tilt",
     # entrypoint='dlv --listen=:40000 --api-version=2 --headless=true --log=true exec /porter/bin/app',
-    entrypoint='/app/porter',
+    entrypoint='/app/migrate && /app/porter',
     build_args={},
     only=[
         "bin",
@@ -75,7 +82,7 @@ docker_build_with_restart(
     live_update=[
         sync('./bin/porter', '/app/'),
         sync('./bin/migrate', '/app/'),
-    ], 
+    ]
 ) 
 
 local_resource(
@@ -101,20 +108,3 @@ local_resource(
 )
 # local_resource('public-url', serve_cmd='lt --subdomain "$(whoami)" --port 8080', resource_deps=["porter-dashboard"], labels=["porter"])
 # local_resource('public-url', serve_cmd='ngrok http 8081 --log=stdout', resource_deps=["porter-dashboard"], labels=["porter"])
-
-# Migrations
-local_resource(
-    name="migrations-binary",
-    cmd='''GOWORK=off CGO_ENABLED=0 %s go build -mod vendor -gcflags '-N -l' -tags ee -o ./bin/migrate ./cmd/migrate/main.go ./cmd/migrate/migrate_ee.go''' % build_args,
-    resource_deps=["postgresql"],
-    labels=["z_binaries"],
-)
-local_resource(
-    name="run-migrations",
-    cmd='''kubectl exec -it deploy/porter-server-web -- /app/migrate''',
-    resource_deps=["migrations-binary", "porter-binary", "porter-server-web", "postgresql"],
-    deps=["postgresql"],
-    labels=["porter"],
-    trigger_mode=TRIGGER_MODE_MANUAL,
-    auto_init=False
-)

+ 19 - 0
api/client/stack.go

@@ -39,3 +39,22 @@ func (c *Client) UpdateStack(
 		nil,
 	)
 }
+
+func (c *Client) GetStack(
+	ctx context.Context,
+	projectID, clusterID uint,
+	stackName string,
+) (*types.PorterApp, error) {
+	resp := &types.PorterApp{}
+
+	err := c.getRequest(
+		fmt.Sprintf(
+			"/projects/%d/clusters/%d/stacks/%s",
+			projectID, clusterID, stackName,
+		),
+		nil,
+		resp,
+	)
+
+	return resp, err
+}

+ 1 - 1
api/server/handlers/project/create.go

@@ -41,7 +41,7 @@ func (p *ProjectCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
 
 	proj := &models.Project{
 		Name:                   request.Name,
-		// CapiProvisionerEnabled: true,
+		CapiProvisionerEnabled: true,
 	}
 
 	var err error

+ 1 - 1
api/server/handlers/project/create_test.go

@@ -42,7 +42,7 @@ func TestCreateProjectSuccessful(t *testing.T) {
 				ProjectID: 1,
 			},
 		},
-		CapiProvisionerEnabled: false,
+		CapiProvisionerEnabled: true,
 	}
 
 	gotProject := &types.CreateProjectResponse{}

+ 1 - 1
api/server/shared/config/env/envconfs.go

@@ -23,7 +23,7 @@ type ServerConf struct {
 	CookieInsecure       bool          `env:"COOKIE_INSECURE,default=false"`
 	TokenGeneratorSecret string        `env:"TOKEN_GENERATOR_SECRET,default=secret"`
 	TimeoutRead          time.Duration `env:"SERVER_TIMEOUT_READ,default=5s"`
-	TimeoutWrite         time.Duration `env:"SERVER_TIMEOUT_WRITE,default=10s"`
+	TimeoutWrite         time.Duration `env:"SERVER_TIMEOUT_WRITE,default=30s"`
 	TimeoutIdle          time.Duration `env:"SERVER_TIMEOUT_IDLE,default=15s"`
 	IsLocal              bool          `env:"IS_LOCAL,default=false"`
 	IsTesting            bool          `env:"IS_TESTING,default=false"`

+ 2 - 0
api/types/stack.go

@@ -22,3 +22,5 @@ type CreateSecretAndOpenGHPRRequest struct {
 type CreateSecretAndOpenGHPRResponse struct {
 	URL string `json:"url"`
 }
+
+type GetStackResponse PorterApp

+ 1 - 1
cli/cmd/apply.go

@@ -157,7 +157,7 @@ func apply(_ *types.GetAuthenticatedUserResponse, client *api.Client, _ []string
 			return fmt.Errorf("environment variable PORTER_STACK_NAME must be set")
 		}
 
-		resGroup, err = stack.CreateV1BuildResources(client, fileBytes)
+		resGroup, err = stack.CreateV1BuildResources(client, fileBytes, stackName, cliConf.Project, cliConf.Cluster)
 		if err != nil {
 			return fmt.Errorf("error parsing porter.yaml for build resources: %w", err)
 		}

+ 123 - 15
cli/cmd/stack/apply.go

@@ -1,53 +1,66 @@
 package stack
 
 import (
+	"context"
 	"fmt"
+	"strings"
 
+	"github.com/fatih/color"
 	api "github.com/porter-dev/porter/api/client"
+	"github.com/porter-dev/porter/api/types"
 	"github.com/porter-dev/porter/cli/cmd/config"
-	"github.com/porter-dev/switchboard/pkg/types"
+	switchboardTypes "github.com/porter-dev/switchboard/pkg/types"
 	"gopkg.in/yaml.v2"
 )
 
 type StackConf struct {
-	apiClient *api.Client
-	rawBytes  []byte
-	parsed    *PorterStackYAML
+	apiClient            *api.Client
+	rawBytes             []byte
+	parsed               *PorterStackYAML
+	stackName            string
+	projectID, clusterID uint
 }
 
-func CreateV1BuildResources(client *api.Client, raw []byte) (*types.ResourceGroup, error) {
-	stackConf, err := createStackConf(client, raw)
+func CreateV1BuildResources(client *api.Client, raw []byte, stackName string, projectID uint, clusterID uint) (*switchboardTypes.ResourceGroup, error) {
+	stackConf, err := createStackConf(client, raw, stackName, projectID, clusterID)
 	if err != nil {
 		return nil, err
 	}
 
-	v1File := &types.ResourceGroup{
+	v1File := &switchboardTypes.ResourceGroup{
 		Version: "v1",
-		Resources: []*types.Resource{
+		Resources: []*switchboardTypes.Resource{
 			{
 				Name:   "get-env",
 				Driver: "os-env",
 			},
 		},
 	}
+
+	var bi, pi *switchboardTypes.Resource
+
 	if stackConf.parsed.Build != nil {
-		bi, err := stackConf.parsed.Build.getV1BuildImage(stackConf.parsed.Env)
+		bi, pi, err = createV1BuildResourcesFromPorterYaml(stackConf)
 		if err != nil {
-			return nil, err
+			color.New(color.FgRed).Printf("Could not build using values specified in porter.yaml (%s), attempting to load stack build settings instead \n", err.Error())
+			bi, pi, err = createV1BuildResourcesFromDB(client, stackConf)
+			if err != nil {
+				return nil, err
+			}
 		}
-
-		pi, err := stackConf.parsed.Build.getV1PushImage()
+	} else {
+		bi, pi, err = createV1BuildResourcesFromDB(client, stackConf)
 		if err != nil {
 			return nil, err
 		}
-
-		v1File.Resources = append(v1File.Resources, bi, pi)
 	}
 
+	v1File.Resources = append(v1File.Resources, bi, pi)
+
 	return v1File, nil
 }
 
-func createStackConf(client *api.Client, raw []byte) (*StackConf, error) {
+func createStackConf(client *api.Client, raw []byte, stackName string, projectID uint, clusterID uint) (*StackConf, error) {
 	parsed := &PorterStackYAML{}
 
 	err := yaml.Unmarshal(raw, parsed)
@@ -66,5 +79,100 @@ func createStackConf(client *api.Client, raw []byte) (*StackConf, error) {
 		apiClient: client,
 		rawBytes:  raw,
 		parsed:    parsed,
+		stackName: stackName,
+		projectID: projectID,
+		clusterID: clusterID,
 	}, nil
 }
+
+func createV1BuildResourcesFromPorterYaml(stackConf *StackConf) (*switchboardTypes.Resource, *switchboardTypes.Resource, error) {
+	bi, err := stackConf.parsed.Build.getV1BuildImage(stackConf.parsed.Env)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	pi, err := stackConf.parsed.Build.getV1PushImage()
+	if err != nil {
+		return nil, nil, err
+	}
+
+	return bi, pi, nil
+}
+
+func createV1BuildResourcesFromDB(client *api.Client, stackConf *StackConf) (*switchboardTypes.Resource, *switchboardTypes.Resource, error) {
+	res, err := client.GetStack(context.Background(), stackConf.projectID, stackConf.clusterID, stackConf.stackName)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	if res == nil {
+		return nil, nil, fmt.Errorf("stack %s not found", stackConf.stackName)
+	}
+
+	build := convertToBuild(res)
+
+	bi, err := build.getV1BuildImage(stackConf.parsed.Env)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	pi, err := build.getV1PushImage()
+	if err != nil {
+		return nil, nil, err
+	}
+
+	return bi, pi, nil
+}
+
+func convertToBuild(porterApp *types.PorterApp) Build {
+	var context *string
+	if porterApp.BuildContext != "" {
+		context = &porterApp.BuildContext
+	}
+
+	var method *string
+	var m string
+	if porterApp.RepoName == "" {
+		m = "registry"
+		method = &m
+	} else if porterApp.Dockerfile == "" {
+		m = "pack"
+		method = &m
+	} else {
+		m = "docker"
+		method = &m
+	}
+
+	var builder *string
+	if porterApp.Builder != "" {
+		builder = &porterApp.Builder
+	}
+
+	var buildpacks []*string
+	if porterApp.Buildpacks != "" {
+		bpSlice := strings.Split(porterApp.Buildpacks, ",")
+		buildpacks = make([]*string, len(bpSlice))
+		for i, bp := range bpSlice {
+			buildpacks[i] = &bp
+		}
+	}
+
+	var dockerfile *string
+	if porterApp.Dockerfile != "" {
+		dockerfile = &porterApp.Dockerfile
+	}
+
+	var image *string
+	if porterApp.ImageRepoURI != "" {
+		image = &porterApp.ImageRepoURI
+	}
+
+	return Build{
+		Context:    context,
+		Method:     method,
+		Builder:    builder,
+		Buildpacks: buildpacks,
+		Dockerfile: dockerfile,
+		Image:      image,
+	}
+}

+ 2 - 2
dashboard/src/components/ProvisionerSettings.tsx

@@ -153,9 +153,9 @@ const ProvisionerSettings: React.FC<Props> = (props) => {
               new EKSNodeGroup({
                 instanceType: "t3.large",
                 minInstances: 1,
-                maxInstances: 5,
+                maxInstances: 1,
                 nodeGroupType: NodeGroupType.MONITORING,
-                isStateful: false,
+                isStateful: true,
               }),
               new EKSNodeGroup({
                 instanceType: machineType,

+ 29 - 29
dashboard/src/main/home/cluster-dashboard/dashboard/ProvisionerStatus.tsx

@@ -21,47 +21,47 @@ const ProvisionerStatus: React.FC<Props> = ({ provisionFailureReason }) => {
   const [progress, setProgress] = useState(1);
 
   // Continuously poll provisioning status and cluster status
-  const pollProvisioningAndClusterStatus = async () => {
+  const pollProvisioningAndClusterStatus = async (currentProgress) => {
     try {
-      const [resState, resStatus] = await Promise.all([
-        api.getClusterState(
+      if (currentProgress < 4) {
+        const resState = await api.getClusterState(
           "<token>",
           {},
           {
             project_id: currentProject.id,
             cluster_id: currentCluster.id,
           }
-        ),
-        api.getCluster(
+        );
+        const {
+          is_control_plane_ready,
+          is_infrastructure_ready,
+          phase,
+        } = resState.data;
+        let newProgress = 1;
+        if (is_control_plane_ready) {
+          newProgress += 1;
+        }
+        if (is_infrastructure_ready) {
+          newProgress += 1;
+        }
+        if (phase === "Provisioned") {
+          newProgress += 1;
+        }
+        setProgress(newProgress);
+      } else {
+        const resStatus = await api.getCluster(
           "<token>",
           {},
           {
             project_id: currentProject.id,
             cluster_id: currentCluster.id,
           }
-        ),
-      ]);
-
-      const {
-        is_control_plane_ready,
-        is_infrastructure_ready,
-        phase,
-      } = resState.data;
-      const status = resStatus.data.status;
-      let progress = 1;
-      if (is_control_plane_ready) {
-        progress += 1;
-      }
-      if (is_infrastructure_ready) {
-        progress += 1;
-      }
-      if (phase === "Provisioned") {
-        progress += 1;
-      }
-      if (status === "READY") {
-        window.location.reload();
+        );
+        const status = resStatus.data.status;
+        if (status === "READY") {
+          window.location.reload();
+        }
       }
-      setProgress(progress);
     } catch (err) {
       console.log(err);
     }
@@ -72,7 +72,7 @@ const ProvisionerStatus: React.FC<Props> = ({ provisionFailureReason }) => {
       pollProvisioningAndClusterStatus,
       PROVISIONING_STATUS_POLL_INTERVAL
     );
-    pollProvisioningAndClusterStatus();
+    pollProvisioningAndClusterStatus(progress);
     return () => clearInterval(intervalId);
   }, []);
 
@@ -87,7 +87,7 @@ const ProvisionerStatus: React.FC<Props> = ({ provisionFailureReason }) => {
         <LoadingBar
           color={provisionFailureReason ? "failed" : undefined}
           completed={progress}
-          total={4}
+          total={5}
         />
         <Spacer height="18px" />
         <Text color="#aaaabb">

+ 1 - 1
dashboard/tsconfig.json

@@ -13,4 +13,4 @@
     "removeComments": true,
     "moduleResolution": "node"
   }
-}
+}

+ 9 - 0
internal/registry/registry.go

@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"net/http"
 	"net/url"
+	"sort"
 	"strings"
 	"sync"
 	"time"
@@ -1057,6 +1058,14 @@ func (r *Registry) GetECRPaginatedImages(
 		res = append(res, v)
 	}
 
+	sort.Slice(res, func(i, j int) bool {
+		if res[i].PushedAt == nil || res[j].PushedAt == nil {
+			return false
+		}
+
+		return res[i].PushedAt.After(*res[j].PushedAt)
+	})
+
 	return res, resp.NextToken, nil
 }
 

+ 2 - 1
zarf/docker/Dockerfile.server.tilt

@@ -7,4 +7,5 @@ FROM debian:bullseye-slim as runner
 WORKDIR /app
 COPY --from=installer /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
 COPY --from=installer /go/bin/dlv /
-COPY ./bin/porter /app
+COPY ./bin/porter /app
+COPY ./bin/migrate /app

+ 0 - 7
zarf/helm/.serverenv

@@ -1,7 +1,6 @@
 # Fill out this file, and renamed to '.server.env' in order to run this with Tilt
 
 # Required parameters
-
 SQL_LITE=false
 DB_NAME=porter
 DB_USER=porter
@@ -10,17 +9,14 @@ DB_HOST=postgresql
 DB_PORT=5432
 
 # Required for accessing cluster control plane. If ENABLE_CAPI_PROVISIONER=false, nothing in this section will be used
-
 ENABLE_CAPI_PROVISIONER=false
 NATS_URL=nats:4222
 CLUSTER_CONTROL_PLANE_ADDRESS=http://ccp-web:7833
 
 # Github Login OAuth
-
 GITHUB_LOGIN_ENABLED=false
 
 # Github App for repo deployments, and preview environments. Remove these if you are not using preview environments or deploying from a repo locally
-
 GITHUB_APP_CLIENT_ID=<github_app_id>
 GITHUB_APP_CLIENT_SECRET=<github_secret>
 GITHUB_APP_WEBHOOK_SECRET=<webhook_secret>
@@ -28,14 +24,11 @@ GITHUB_APP_NAME=<github_app_name>
 GITHUB_APP_ID=<github_app_id>
 
 # GITHUB_APP_SECRET_PATH is the path to your secret within the container. Tilt will sync your ~/.ssh/ folder into /app/ssh automatically. This will likely be /app/ssh/your_ssh_pem_name
-
 GITHUB_APP_SECRET_PATH=<path_to_secret>
 
 # Optional parameters
-
 HELM_APP_REPO_URL=https://charts.getporter.dev
 HELM_ADD_ON_REPO_URL=https://charts.getporter.dev
 
 # SERVER_URL must be set to your ngrok url, If you are using ngrok for your github app setup on the backend
-
 # SERVER_URL=