Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions cli/internal/api/platform.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package api

import (
"encoding/json"
"fmt"
"io"

"github.com/nitrictech/nitric/engines/terraform"
)

type PlatformRevisionResponse struct {
Content terraform.PlatformSpec `json:"content"`
}

// FIXME: Because of the difference in fields between identity and resource plugins we need to return an interface
func (c *NitricApiClient) GetPlatform(team, name string, revision int) (*terraform.PlatformSpec, error) {
response, err := c.get(fmt.Sprintf("/api/platforms/%s/%s/revisions/%d", team, name, revision), true)
if err != nil {
return nil, fmt.Errorf("failed to connect to nitric auth details endpoint: %v", err)
}

if response.StatusCode != 200 {
return nil, fmt.Errorf("received non 200 response from nitric plugin details endpoint: %d", response.StatusCode)
}

body, err := io.ReadAll(response.Body)
if err != nil {
return nil, fmt.Errorf("failed to read response from nitric auth details endpoint: %v", err)
}

var platformSpec PlatformRevisionResponse
err = json.Unmarshal(body, &platformSpec)
if err != nil {
return nil, fmt.Errorf("unexpected response from nitric plugin details endpoint: %v", err)
}
return &platformSpec.Content, nil
}
1 change: 0 additions & 1 deletion cli/internal/api/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (

// FIXME: Because of the difference in fields between identity and resource plugins we need to return an interface
func (c *NitricApiClient) GetPluginManifest(team, lib, version, name string) (interface{}, error) {
fmt.Println("Getting plugin manifest for", team, lib, version, name)
response, err := c.get(fmt.Sprintf("/api/plugin_libraries/%s/%s/versions/%s/plugins/%s", team, lib, version, name), true)
if err != nil {
return nil, fmt.Errorf("failed to connect to nitric auth details endpoint: %v", err)
Expand Down
50 changes: 50 additions & 0 deletions cli/internal/platforms/repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package platforms

import (
"fmt"
"regexp"
"strconv"

"github.com/nitrictech/nitric/cli/internal/api"
"github.com/nitrictech/nitric/engines/terraform"
)

type PlatformRepository struct {
apiClient *api.NitricApiClient
}

var _ terraform.PlatformRepository = (*PlatformRepository)(nil)

func (r *PlatformRepository) GetPlatform(name string) (*terraform.PlatformSpec, error) {
// Split the name into team, lib, and revision using a regex <team>/<lib>@<revision>
re := regexp.MustCompile(`^(?P<team>[^/]+)/(?P<platform>[^@]+)@(?P<revision>\d+)$`)
matches := re.FindStringSubmatch(name)

if matches == nil {
return nil, fmt.Errorf("invalid platform name format: %s. Expected format: <team>/<lib>@<revision> e.g. nitric/aws@1", name)
}

// Extract named groups
team := matches[re.SubexpIndex("team")]
platform := matches[re.SubexpIndex("platform")]
revisionStr := matches[re.SubexpIndex("revision")]

// Convert revision string to integer
revision, err := strconv.Atoi(revisionStr)
if err != nil {
return nil, fmt.Errorf("invalid revision format: %s. Expected integer", revisionStr)
}

platformSpec, err := r.apiClient.GetPlatform(team, platform, revision)
if err != nil {
return nil, err
}

return platformSpec, nil
}

func NewPlatformRepository(apiClient *api.NitricApiClient) *PlatformRepository {
return &PlatformRepository{
apiClient: apiClient,
}
}
4 changes: 2 additions & 2 deletions cli/internal/plugins/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ func (r *PluginRepository) GetIdentityPlugin(team, libname, version, name string
return identityPluginManifest, nil
}

func NewPluginRepository(client *api.NitricApiClient) *PluginRepository {
func NewPluginRepository(apiClient *api.NitricApiClient) *PluginRepository {
return &PluginRepository{
apiClient: client,
apiClient: apiClient,
}
}
5 changes: 3 additions & 2 deletions cli/pkg/app/nitric.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/nitrictech/nitric/cli/internal/browser"
"github.com/nitrictech/nitric/cli/internal/config"
"github.com/nitrictech/nitric/cli/internal/devserver"
"github.com/nitrictech/nitric/cli/internal/platforms"
"github.com/nitrictech/nitric/cli/internal/plugins"
"github.com/nitrictech/nitric/cli/internal/simulation"
"github.com/nitrictech/nitric/cli/internal/style/colors"
Expand Down Expand Up @@ -226,12 +227,12 @@ func (c *NitricApp) Build() error {
return err
}

mockPlatformRepository := terraform.NewMockPlatformRepository()
platformRepository := platforms.NewPlatformRepository(c.apiClient)

// TODO:prompt for platform selection if multiple targets are specified
targetPlatform := appSpec.Targets[0]

platform, err := terraform.PlatformFromId(fs, targetPlatform, mockPlatformRepository)
platform, err := terraform.PlatformFromId(fs, targetPlatform, platformRepository)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion engines/terraform/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package terraform
import "fmt"

type PlatformRepository interface {
// terraform/nitric-aws
// <team>/<platform>/<revision>
GetPlatform(string) (*PlatformSpec, error)
}

Expand Down
Loading