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
19 changes: 19 additions & 0 deletions playground/components_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,25 @@ func TestRecipeBuilderHub(t *testing.T) {
require.Equal(t, resp.StatusCode, http.StatusOK)
}

func TestRecipeBuilderHub_RegisterBuilder(t *testing.T) {
tt := newTestFramework(t)
defer tt.Close()

manifest := tt.test(&BuilderHub{}, nil)

apiPort := manifest.MustGetService("builder-hub-api").MustGetPort("admin")
endpoint := fmt.Sprintf("http://localhost:%d", apiPort.HostPort)

err := registerBuilder(endpoint, &builderHubRegisterBuilderInput{
BuilderID: "test_builder",
BuilderIP: "1.2.3.4",
MeasurementID: "test",
Network: "playground",
Config: "{}",
})
require.NoError(t, err)
}

func TestRecipeBuilderNet(t *testing.T) {
tt := newTestFramework(t)
defer tt.Close()
Expand Down
100 changes: 100 additions & 0 deletions playground/recipe_buildernet.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package playground

import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"

flag "github.com/spf13/pflag"
)
Expand Down Expand Up @@ -60,3 +64,99 @@ func (b *BuilderNetRecipe) Output(manifest *Manifest) map[string]interface{} {

return output
}

func postRequest(endpoint, path string, input interface{}) error {
var data []byte
if dataBytes, ok := input.([]byte); ok {
data = dataBytes
} else if dataMap, ok := input.(map[string]interface{}); ok {
dataBytes, err := json.Marshal(dataMap)
if err != nil {
return err
}
data = dataBytes
} else if dataStr, ok := input.(string); ok {
data = []byte(dataStr)
} else {
return fmt.Errorf("input type not expected")
}

fullEndpoint := endpoint + path

resp, err := http.Post(fullEndpoint, "application/json", bytes.NewReader(data))
if err != nil {
return fmt.Errorf("failed to request endpoint '%s': %v", fullEndpoint, err)
}
defer resp.Body.Close()

dataResp, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("incorrect status code %s: %s", resp.Status, string(dataResp))
}
return nil
}

type builderHubRegisterBuilderInput struct {
BuilderID string
BuilderIP string
MeasurementID string
Network string
Config string
}

func registerBuilder(httpEndpoint string, input *builderHubRegisterBuilderInput) error {
httpEndpoint = httpEndpoint + "/api/admin/v1"

// Validate input.Config, it must be a valid json file
var configMap map[string]interface{}
if err := json.Unmarshal([]byte(input.Config), &configMap); err != nil {
return err
}

// Create Allow-All Measurements
err := postRequest(httpEndpoint, "/measurements", map[string]interface{}{
"measurement_id": input.MeasurementID,
"attestation_type": "test",
"measurements": map[string]interface{}{},
})
if err != nil {
return err
}

// Enable Measurements
err = postRequest(httpEndpoint, fmt.Sprintf("/measurements/activation/%s", input.MeasurementID), map[string]interface{}{
"enabled": true,
})
if err != nil {
return err
}

// create the builder
err = postRequest(httpEndpoint, "/builders", map[string]interface{}{
"name": input.BuilderID,
"ip_address": input.BuilderIP,
"network": input.Network,
})
if err != nil {
return err
}

// Create Builder Configuration
err = postRequest(httpEndpoint, fmt.Sprintf("/builders/configuration/%s", input.BuilderID), input.Config)
if err != nil {
return err
}

// Enable Builder
err = postRequest(httpEndpoint, fmt.Sprintf("/builders/activation/%s", input.BuilderID), map[string]interface{}{
"enabled": true,
})
if err != nil {
return err
}

return nil
}