diff --git a/internal/build/imgsrc/docker.go b/internal/build/imgsrc/docker.go index 61ce402627..962b78588a 100644 --- a/internal/build/imgsrc/docker.go +++ b/internal/build/imgsrc/docker.go @@ -38,6 +38,7 @@ import ( "github.com/superfly/flyctl/internal/metrics" "github.com/superfly/flyctl/internal/sentry" "github.com/superfly/flyctl/internal/tracing" + "github.com/superfly/flyctl/internal/uiex" "github.com/superfly/flyctl/internal/uiexutil" "github.com/superfly/flyctl/iostreams" "github.com/superfly/flyctl/terminal" @@ -780,13 +781,13 @@ func ResolveDockerfile(cwd string) string { return "" } -func EagerlyEnsureRemoteBuilder(ctx context.Context, apiClient flyutil.Client, org *fly.Organization, recreateBuilder bool) { +func EagerlyEnsureRemoteBuilder(ctx context.Context, org *uiex.Organization, recreateBuilder bool) { // skip if local docker is available if _, err := NewLocalDockerClient(); err == nil { return } - provisioner := NewProvisioner(org) + provisioner := NewProvisionerUiexOrg(org) _, app, err := provisioner.EnsureBuilder(ctx, os.Getenv("FLY_REMOTE_BUILDER_REGION"), recreateBuilder) if err != nil { terminal.Debugf("error ensuring remote builder for organization: %s", err) diff --git a/internal/build/imgsrc/ensure_builder.go b/internal/build/imgsrc/ensure_builder.go index 3bc3f9c306..50300ef5ad 100644 --- a/internal/build/imgsrc/ensure_builder.go +++ b/internal/build/imgsrc/ensure_builder.go @@ -23,6 +23,7 @@ import ( type Provisioner struct { orgID string orgSlug string + orgTrial bool orgPaidPlan bool orgRemoteBuilderImage string useVolume bool @@ -30,21 +31,11 @@ type Provisioner struct { buildkitImage string } -// NewProvisioner is deprecated and will be replaced by NewProvisionerUiexOrg -func NewProvisioner(org *fly.Organization) *Provisioner { - return &Provisioner{ - orgID: org.ID, - orgSlug: org.Slug, - orgPaidPlan: org.PaidPlan, - orgRemoteBuilderImage: org.RemoteBuilderImage, - useVolume: true, - } -} - func NewProvisionerUiexOrg(org *uiex.Organization) *Provisioner { return &Provisioner{ orgID: org.ID, orgSlug: org.Slug, + orgTrial: org.BillingStatus == uiex.BillingStatusTrialActive, orgPaidPlan: org.PaidPlan, orgRemoteBuilderImage: org.RemoteBuilderImage, useVolume: true, @@ -397,7 +388,7 @@ func (p *Provisioner) createBuilder(ctx context.Context, region, builderName str CPUs: 4, MemoryMB: 4096, } - if p.orgPaidPlan { + if p.orgPaidPlan && !p.orgTrial { guest = fly.MachineGuest{ CPUKind: "shared", CPUs: 8, diff --git a/internal/build/imgsrc/ensure_builder_test.go b/internal/build/imgsrc/ensure_builder_test.go index 2fcad84a71..8afe17ea78 100644 --- a/internal/build/imgsrc/ensure_builder_test.go +++ b/internal/build/imgsrc/ensure_builder_test.go @@ -14,6 +14,7 @@ import ( "github.com/superfly/flyctl/internal/flyutil" "github.com/superfly/flyctl/internal/mock" "github.com/superfly/flyctl/internal/state" + "github.com/superfly/flyctl/internal/uiex" "go.uber.org/mock/gomock" ) @@ -27,7 +28,7 @@ func testingContext(t *testing.T) context.Context { func TestValidateBuilder(t *testing.T) { ctx := testingContext(t) - p := NewProvisioner(&fly.Organization{}) + p := NewProvisionerUiexOrg(&uiex.Organization{}) hasVolumes := false hasMachines := false @@ -71,7 +72,7 @@ func TestValidateBuilder(t *testing.T) { func TestValidateBuilderAPIErrors(t *testing.T) { ctx := testingContext(t) - p := NewProvisioner(&fly.Organization{}) + p := NewProvisionerUiexOrg(&uiex.Organization{}) maxVolumeRetries := 3 volumeRetries := 0 @@ -166,7 +167,7 @@ func TestValidateBuilderNotStarted(t *testing.T) { ctx := testingContext(t) ctx = flapsutil.NewContextWithClient(ctx, client) - provisioner := NewProvisioner(&fly.Organization{}) + provisioner := NewProvisionerUiexOrg(&uiex.Organization{}) provisioner.useVolume = false client.EXPECT().List(gomock.Any(), gomock.Eq(""), gomock.Any()).Return([]*fly.Machine{ @@ -179,10 +180,10 @@ func TestValidateBuilderNotStarted(t *testing.T) { func TestCreateBuilder(t *testing.T) { ctx := testingContext(t) - org := &fly.Organization{ + org := &uiex.Organization{ Slug: "bigorg", } - p := NewProvisioner(org) + p := NewProvisionerUiexOrg(org) createAppShouldFail := false allocateIPAddressShouldFail := false diff --git a/internal/command/command_run.go b/internal/command/command_run.go index a43ccf8d6d..831d76ca7a 100644 --- a/internal/command/command_run.go +++ b/internal/command/command_run.go @@ -28,6 +28,7 @@ import ( "github.com/superfly/flyctl/internal/flyutil" "github.com/superfly/flyctl/internal/launchdarkly" "github.com/superfly/flyctl/internal/state" + "github.com/superfly/flyctl/internal/uiexutil" ) func DetermineImage(ctx context.Context, appName string, imageOrPath string) (img *imgsrc.DeploymentImage, err error) { @@ -37,7 +38,8 @@ func DetermineImage(ctx context.Context, appName string, imageOrPath string) (im cfg = appconfig.ConfigFromContext(ctx) ) - appCompact, err := client.GetAppCompact(ctx, appName) + flapsClient := flapsutil.ClientFromContext(ctx) + app, err := flapsClient.GetApp(ctx, appName) if err != nil { return nil, err } @@ -45,7 +47,7 @@ func DetermineImage(ctx context.Context, appName string, imageOrPath string) (im // Start the feature flag client, if we haven't already if launchdarkly.ClientFromContext(ctx) == nil { ffClient, err := launchdarkly.NewClient(ctx, launchdarkly.UserInfo{ - OrganizationID: appCompact.Organization.InternalNumericID, + OrganizationID: fmt.Sprint(app.Organization.InternalNumericID), UserID: 0, }) if err != nil { @@ -54,7 +56,8 @@ func DetermineImage(ctx context.Context, appName string, imageOrPath string) (im ctx = launchdarkly.NewContextWithClient(ctx, ffClient) } - org, err := client.GetOrganizationByApp(ctx, appName) + uiexClient := uiexutil.ClientFromContext(ctx) + org, err := uiexClient.GetOrganization(ctx, app.Organization.Slug) if err != nil { return nil, err } @@ -64,7 +67,7 @@ func DetermineImage(ctx context.Context, appName string, imageOrPath string) (im daemonType := imgsrc.NewDockerDaemonType(!flag.GetBool(ctx, "build-remote-only"), !flag.GetBool(ctx, "build-local-only"), env.IsCI(), flag.GetBool(ctx, "build-depot"), flag.GetBool(ctx, "build-nixpacks"), useManagedBuilder) resolver := imgsrc.NewResolver( daemonType, client, appName, io, flag.GetWireguard(ctx), false, - imgsrc.WithProvisioner(imgsrc.NewProvisioner(org)), + imgsrc.WithProvisioner(imgsrc.NewProvisionerUiexOrg(org)), ) // build if relative or absolute path diff --git a/internal/command/launch/plan_builder.go b/internal/command/launch/plan_builder.go index 1f0865aec6..83fac2625e 100644 --- a/internal/command/launch/plan_builder.go +++ b/internal/command/launch/plan_builder.go @@ -25,6 +25,7 @@ import ( "github.com/superfly/flyctl/internal/haikunator" "github.com/superfly/flyctl/internal/launchdarkly" "github.com/superfly/flyctl/internal/prompt" + "github.com/superfly/flyctl/internal/uiexutil" "github.com/superfly/flyctl/iostreams" "github.com/superfly/flyctl/scanner" ) @@ -325,12 +326,10 @@ func nudgeTowardsDeploy(ctx context.Context, appName string) (bool, error) { } func stateFromManifest(ctx context.Context, m LaunchManifest, optionalCache *planBuildCache, recoverableErrors *recoverableErrorBuilder) (*launchState, error) { - var ( - io = iostreams.FromContext(ctx) - client = flyutil.ClientFromContext(ctx) - ) + io := iostreams.FromContext(ctx) - org, err := client.GetOrganizationRemoteBuilderBySlug(ctx, m.Plan.OrgSlug) + uiexClient := uiexutil.ClientFromContext(ctx) + org, err := uiexClient.GetOrganization(ctx, m.Plan.OrgSlug) if err != nil { return nil, err } @@ -338,7 +337,7 @@ func stateFromManifest(ctx context.Context, m LaunchManifest, optionalCache *pla // If we potentially are deploying, launch a remote builder to prepare for deployment. if !flag.GetBool(ctx, "no-deploy") { // TODO: determine if eager remote builder is still required here - go imgsrc.EagerlyEnsureRemoteBuilder(ctx, client, org, flag.GetRecreateBuilder(ctx)) + go imgsrc.EagerlyEnsureRemoteBuilder(ctx, org, flag.GetRecreateBuilder(ctx)) } var (