Skip to content
Closed
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
11 changes: 10 additions & 1 deletion client/building_block_definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package client

import (
"context"
"encoding/json/jsontext"
"iter"

"github.com/meshcloud/meshstack-cli/client/internal"
"github.com/meshcloud/meshstack-cli/client/types"
Expand Down Expand Up @@ -151,7 +153,7 @@ type meshBuildingBlockDefinitionClient struct {
meshObject internal.MeshObjectClient[MeshBuildingBlockDefinition]
}

func newBuildingBlockDefinitionClient(ctx context.Context, httpClient internal.HttpClient) MeshBuildingBlockDefinitionClient {
func newBuildingBlockDefinitionClient(ctx context.Context, httpClient internal.HttpClient) meshBuildingBlockDefinitionClient {
return meshBuildingBlockDefinitionClient{
meshObject: internal.NewMeshObjectClient[MeshBuildingBlockDefinition](ctx, httpClient, "v1-preview"),
}
Expand All @@ -172,6 +174,13 @@ func (c meshBuildingBlockDefinitionClient) List(ctx context.Context, workspaceId
}))
}

func (c meshBuildingBlockDefinitionClient) ListRawSeq(ctx context.Context, workspaceIdentifier *string) iter.Seq2[jsontext.Value, error] {
return c.meshObject.ListSeqAs[jsontext.Value](ctx, http.WithUrlQuery(meshBuildingBlockDefinitionListQuery{
IncludeAllPublished: true,
OwnedByWorkspace: workspaceIdentifier,
}))
}

func (c meshBuildingBlockDefinitionClient) Read(ctx context.Context, uuid string) (*MeshBuildingBlockDefinition, error) {
return c.meshObject.Get(ctx, uuid)
}
Expand Down
10 changes: 9 additions & 1 deletion client/building_block_definition_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package client

import (
"context"
"encoding/json/jsontext"
"encoding/json/v2"
"errors"
"iter"

"github.com/meshcloud/meshstack-cli/client/internal"
"github.com/meshcloud/meshstack-cli/client/types"
Expand Down Expand Up @@ -232,7 +234,7 @@ type meshBuildingBlockDefinitionVersionClient struct {
meshObject internal.MeshObjectClient[MeshBuildingBlockDefinitionVersion]
}

func newBuildingBlockDefinitionVersionClient(ctx context.Context, httpClient internal.HttpClient) MeshBuildingBlockDefinitionVersionClient {
func newBuildingBlockDefinitionVersionClient(ctx context.Context, httpClient internal.HttpClient) meshBuildingBlockDefinitionVersionClient {
return meshBuildingBlockDefinitionVersionClient{
meshObject: internal.NewMeshObjectClient[MeshBuildingBlockDefinitionVersion](ctx, httpClient, "v1-preview"),
}
Expand All @@ -248,6 +250,12 @@ func (c meshBuildingBlockDefinitionVersionClient) List(ctx context.Context, buil
}))
}

func (c meshBuildingBlockDefinitionVersionClient) ListRawSeq(ctx context.Context, buildingBlockDefinitionUuid string) iter.Seq2[jsontext.Value, error] {
return c.meshObject.ListSeqAs[jsontext.Value](ctx, http.WithUrlQuery(meshBuildingBlockDefinitionVersionListQuery{
BuildingBlockDefinitionUuid: buildingBlockDefinitionUuid,
}))
}

func (c meshBuildingBlockDefinitionVersionClient) Create(ctx context.Context, ownedByWorkspace string, versionSpec MeshBuildingBlockDefinitionVersionSpec) (*MeshBuildingBlockDefinitionVersion, error) {
return c.meshObject.Post(ctx, MeshBuildingBlockDefinitionVersion{
Metadata: MeshBuildingBlockDefinitionVersionMetadata{
Expand Down
5 changes: 5 additions & 0 deletions client/building_block_run.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,8 @@ func (c meshBuildingBlockRunClient) ListRawSeq(ctx context.Context, filter MeshB
func (c meshBuildingBlockRunClient) GetLogs(ctx context.Context, runUuid string) (MeshBuildingBlockRunLogs, error) {
return c.meshObject.GetAtPath[MeshBuildingBlockRunLogs](ctx, runUuid, "logs")
}

// GetLogsRaw is GetLogs without decoding, so that a caller passes the answer on as the server sent it.
func (c meshBuildingBlockRunClient) GetLogsRaw(ctx context.Context, runUuid string) (jsontext.Value, error) {
return c.meshObject.GetAtPath[jsontext.Value](ctx, runUuid, "logs")
}
14 changes: 9 additions & 5 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,17 @@ func New(ctx context.Context, endpoint xurl.URL, userAgent string, auth Authoriz
EndpointUrl: endpoint,
}
buildingBlockV2 := newBuildingBlockV2Client(ctx, authorizedClient)
buildingBlockDefinition := newBuildingBlockDefinitionClient(ctx, authorizedClient)
buildingBlockDefinitionVersion := newBuildingBlockDefinitionVersionClient(ctx, authorizedClient)
buildingBlockRun := newBuildingBlockRunClient(ctx, authorizedClient)
workspace := newWorkspaceClient(ctx, authorizedClient)
return Client{
ApiKey: newApiKeyClient(ctx, authorizedClient),
BuildingBlock: newBuildingBlockClient(ctx, authorizedClient),
BuildingBlockV2: buildingBlockV2,
BuildingBlockRun: buildingBlockRun,
BuildingBlockDefinition: newBuildingBlockDefinitionClient(ctx, authorizedClient),
BuildingBlockDefinitionVersion: newBuildingBlockDefinitionVersionClient(ctx, authorizedClient),
BuildingBlockDefinition: buildingBlockDefinition,
BuildingBlockDefinitionVersion: buildingBlockDefinitionVersion,
BuildingBlockRunner: newBuildingBlockRunnerClient(ctx, authorizedClient),
Integration: newIntegrationClient(ctx, authorizedClient),
LandingZone: newLandingZoneClient(ctx, authorizedClient),
Expand All @@ -85,9 +87,11 @@ func New(ctx context.Context, endpoint xurl.URL, userAgent string, auth Authoriz
WorkspaceGroupBinding: newWorkspaceGroupBindingClient(ctx, authorizedClient),
WorkspaceUserBinding: newWorkspaceUserBindingClient(ctx, authorizedClient),
Listing: meshListingClient{
workspace: workspace,
buildingBlockV2: buildingBlockV2,
buildingBlockRun: buildingBlockRun,
workspace: workspace,
buildingBlockV2: buildingBlockV2,
buildingBlockRun: buildingBlockRun,
buildingBlockDefinition: buildingBlockDefinition,
buildingBlockDefinitionVersion: buildingBlockDefinitionVersion,
},

Endpoint: endpoint,
Expand Down
23 changes: 20 additions & 3 deletions client/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,17 @@ type MeshListingClient interface {
Workspaces(ctx context.Context) iter.Seq2[jsontext.Value, error]
BuildingBlocksV2(ctx context.Context, filter MeshBuildingBlockV2ListFilter) iter.Seq2[jsontext.Value, error]
BuildingBlockRuns(ctx context.Context, filter MeshBuildingBlockRunListFilter) iter.Seq2[jsontext.Value, error]
BuildingBlockRunLogs(ctx context.Context, runUuid string) (jsontext.Value, error)
BuildingBlockDefinitions(ctx context.Context, workspaceIdentifier *string) iter.Seq2[jsontext.Value, error]
BuildingBlockDefinitionVersions(ctx context.Context, buildingBlockDefinitionUuid string) iter.Seq2[jsontext.Value, error]
}

type meshListingClient struct {
workspace meshWorkspaceClient
buildingBlockV2 meshBuildingBlockV2Client
buildingBlockRun meshBuildingBlockRunClient
workspace meshWorkspaceClient
buildingBlockV2 meshBuildingBlockV2Client
buildingBlockRun meshBuildingBlockRunClient
buildingBlockDefinition meshBuildingBlockDefinitionClient
buildingBlockDefinitionVersion meshBuildingBlockDefinitionVersionClient
}

func (c meshListingClient) Workspaces(ctx context.Context) iter.Seq2[jsontext.Value, error] {
Expand All @@ -43,3 +48,15 @@ func (c meshListingClient) BuildingBlocksV2(ctx context.Context, filter MeshBuil
func (c meshListingClient) BuildingBlockRuns(ctx context.Context, filter MeshBuildingBlockRunListFilter) iter.Seq2[jsontext.Value, error] {
return c.buildingBlockRun.ListRawSeq(ctx, filter)
}

func (c meshListingClient) BuildingBlockDefinitions(ctx context.Context, workspaceIdentifier *string) iter.Seq2[jsontext.Value, error] {
return c.buildingBlockDefinition.ListRawSeq(ctx, workspaceIdentifier)
}

func (c meshListingClient) BuildingBlockDefinitionVersions(ctx context.Context, buildingBlockDefinitionUuid string) iter.Seq2[jsontext.Value, error] {
return c.buildingBlockDefinitionVersion.ListRawSeq(ctx, buildingBlockDefinitionUuid)
}

func (c meshListingClient) BuildingBlockRunLogs(ctx context.Context, runUuid string) (jsontext.Value, error) {
return c.buildingBlockRun.GetLogsRaw(ctx, runUuid)
}
21 changes: 21 additions & 0 deletions cmd/buildingblockdefinition/buildingblockdefinition.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package buildingblockdefinition

import (
"github.com/spf13/cobra"
)

func New() *cobra.Command {
cmd := &cobra.Command{
Use: "buildingblockdefinition",
Aliases: []string{"bbd"},
Short: "Work with building block definitions",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
return cmd.Help()
},
}

cmd.AddCommand(newList())

return cmd
}
39 changes: 39 additions & 0 deletions cmd/buildingblockdefinition/list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package buildingblockdefinition

import (
"context"
"encoding/json/jsontext"
"iter"

"github.com/spf13/cobra"

"github.com/meshcloud/meshstack-cli/client"
"github.com/meshcloud/meshstack-cli/cmd/internal"
)

func newList() *cobra.Command {
var flags internal.ListFlags

cmd := &cobra.Command{
Use: "list",
Short: "List building block definitions",
Long: `List building block definitions.

--workspace, or MESHSTACK_WORKSPACE, lists the definitions that workspace owns. Without it the
backend lists the ones published across the platform as well.`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
workspace, err := internal.ListWorkspace(cmd.Context())
if err != nil {
return err
}
return flags.Run(cmd, func(ctx context.Context, meshStack client.Client) iter.Seq2[jsontext.Value, error] {
return meshStack.Listing.BuildingBlockDefinitions(ctx, workspace)
})
},
}

flags.Register(cmd.Flags())

return cmd
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package buildingblockdefinitionversion

import (
"github.com/spf13/cobra"
)

func New() *cobra.Command {
cmd := &cobra.Command{
Use: "buildingblockdefinitionversion",
Aliases: []string{"bbdv"},
Short: "Work with building block definition versions",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
return cmd.Help()
},
}

cmd.AddCommand(newList())

return cmd
}
41 changes: 41 additions & 0 deletions cmd/buildingblockdefinitionversion/list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package buildingblockdefinitionversion

import (
"context"
"encoding/json/jsontext"
"iter"

"github.com/spf13/cobra"

"github.com/meshcloud/meshstack-cli/client"
"github.com/meshcloud/meshstack-cli/cmd/internal"
)

func newList() *cobra.Command {
var (
flags internal.ListFlags
definitionUuid string
)

cmd := &cobra.Command{
Use: "list",
Short: "List the versions of a building block definition",
Long: `List the versions of a building block definition.

The definition is named by its uuid, which "meshstack buildingblockdefinition list" reports as
metadata.uuid. It is required: the backend serves the versions of one definition at a time, and
reading them takes a permission on the workspace that owns it.`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
return flags.Run(cmd, func(ctx context.Context, meshStack client.Client) iter.Seq2[jsontext.Value, error] {
return meshStack.Listing.BuildingBlockDefinitionVersions(ctx, definitionUuid)
})
},
}

cmd.Flags().StringVar(&definitionUuid, "definition", "", "list the versions of the building block definition with this uuid")
_ = cmd.MarkFlagRequired("definition")
flags.Register(cmd.Flags())

return cmd
}
1 change: 1 addition & 0 deletions cmd/buildingblockrun/buildingblockrun.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ func New() *cobra.Command {
}

cmd.AddCommand(newList())
cmd.AddCommand(newLogs())

return cmd
}
38 changes: 38 additions & 0 deletions cmd/buildingblockrun/logs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package buildingblockrun

import (
"github.com/spf13/cobra"

"github.com/meshcloud/meshstack-cli/cmd/internal"
)

func newLogs() *cobra.Command {
var output internal.OutputFlag

cmd := &cobra.Command{
Use: "logs <run-uuid>",
Short: "Show the logs of a building block run",
Long: `Show the logs of a building block run.

The run is named by its uuid, which "meshstack buildingblockrun list" reports as metadata.uuid.
Each step of the run carries its own status and messages: systemMessage holds what the runner
produced, userMessage what the run reported back to the user.`,
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()
meshStack, err := internal.ResolveClient(ctx)
if err != nil {
return err
}
logs, err := meshStack.Listing.BuildingBlockRunLogs(ctx, args[0])
if err != nil {
return err
}
return internal.WriteItem(cmd.OutOrStdout(), output.Format, logs)
},
}

output.Register(cmd.Flags())

return cmd
}
13 changes: 13 additions & 0 deletions cmd/internal/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,16 @@ func listFormatOf(format OutputFormat) (listFormat, error) {
return listFormat{}, fmt.Errorf("%q is no output format, write %s or %s", format, OutputJson, OutputNdjson)
}
}

// WriteItem writes a single item as an object of its own, for a command whose result is not a listing.
func WriteItem(w io.Writer, format OutputFormat, item jsontext.Value) error {
list, err := listFormatOf(format)
if err != nil {
return err
}
if err = list.format(&item); err != nil {
return err
}
_, err = fmt.Fprintf(w, "%s\n", item)
return err
}
4 changes: 4 additions & 0 deletions cmd/meshstack/meshstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (

"github.com/meshcloud/meshstack-cli/cmd/auth"
"github.com/meshcloud/meshstack-cli/cmd/buildingblock"
"github.com/meshcloud/meshstack-cli/cmd/buildingblockdefinition"
"github.com/meshcloud/meshstack-cli/cmd/buildingblockdefinitionversion"
"github.com/meshcloud/meshstack-cli/cmd/buildingblockrun"
"github.com/meshcloud/meshstack-cli/cmd/internal"
"github.com/meshcloud/meshstack-cli/cmd/workspace"
Expand Down Expand Up @@ -62,6 +64,8 @@ func newRootCommand() *cobra.Command {
// time is the only way to get one: cobra's Aliases rename a command inside its own parent.
cmd.AddCommand(auth.NewLogin())
cmd.AddCommand(buildingblock.New())
cmd.AddCommand(buildingblockdefinition.New())
cmd.AddCommand(buildingblockdefinitionversion.New())
cmd.AddCommand(buildingblockrun.New())
cmd.AddCommand(workspace.New())

Expand Down
Loading