debian-forge-composer/internal/weldrcheck/blueprints.go
Brian C. Lane e3d1a34ab6 weldr: Fix blueprints/depsolve response
The response always returns a 200 with a JSON response. Any errors will
be in the errors list.
2020-03-12 01:55:45 +01:00

1479 lines
40 KiB
Go

// Package weldrcheck - blueprints contains functions to check the blueprints API
// Copyright (C) 2020 by Red Hat, Inc.
package weldrcheck
import (
"log"
"net/http"
"reflect"
"sort"
"strings"
"github.com/BurntSushi/toml"
"github.com/osbuild/osbuild-composer/internal/client"
)
type checkBlueprintsV0 struct {
socket *http.Client
}
// Run will execute the API V0 Blueprint check functions
// This will call all of the methods that start with 'Check', passing them a pointer to a
// checkBlueprintsV0 struct and expecting a bool to be returned to indicate whether or not the test
// passed.
// If any of the tests fail it will return false.
func (c *checkBlueprintsV0) Run() bool {
pass := true
// Construct a reflect.Type to use for checking method type signatures
boolType := reflect.TypeOf(true)
structType := reflect.TypeOf(c)
funcType := reflect.FuncOf([]reflect.Type{structType}, []reflect.Type{boolType}, false)
structValue := reflect.ValueOf(c)
// Get all the exported methods on this struct named 'Check*' and run them
for i := 0; i < structType.NumMethod(); i++ {
method := structType.Method(i)
// Make sure it starts with Check and matches the type signature
if strings.HasPrefix(method.Name, "Check") {
if method.Type != funcType {
log.Printf("ERROR: Check function '%s' has wrong type: %s", method.Name, method.Type)
pass = false
continue
}
r := structValue.Method(i).Call(nil)
if !r[0].Bool() {
pass = false
}
}
}
return pass
}
// POST a new TOML blueprint
func (c *checkBlueprintsV0) CheckPostTOML() bool {
name := "POST of a TOML blueprint"
bp := `
name="test-toml-blueprint-v0"
description="postTOMLBlueprintV0"
version="0.0.1"
[[packages]]
name="bash"
version="*"
[[modules]]
name="util-linux"
version="*"
[[customizations.user]]
name="root"
password="qweqweqwe"
`
resp, err := client.PostTOMLBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an invalid TOML blueprint
func (c *checkBlueprintsV0) CheckPostInvalidTOML() bool {
name := "POST of an invalid TOML blueprint"
bp := `
name="test-invalid-toml-blueprint-v0"
version="0.0.1"
[package
name="bash"
version="*"
`
resp, err := client.PostTOMLBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an empty TOML blueprint
func (c *checkBlueprintsV0) CheckPostEmptyTOML() bool {
name := "POST of an empty TOML blueprint"
resp, err := client.PostTOMLBlueprintV0(c.socket, "")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST a new JSON blueprint
func (c *checkBlueprintsV0) CheckPostJSON() bool {
name := "POST of a JSON blueprint"
bp := `{
"name": "test-json-blueprint-v0",
"description": "postJSONBlueprintV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an invalid JSON blueprint
func (c *checkBlueprintsV0) CheckPostInvalidJSON() bool {
name := "POST of an invalid JSON blueprint"
bp := `{
"name": "test-invalid-json-blueprint-v0",
"version": "0.0.1",
"modules": [{"name: "util-linux", "version": "*"}],
}`
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an empty JSON blueprint
func (c *checkBlueprintsV0) CheckPostEmptyJSON() bool {
name := "POST of an empty JSON blueprint"
resp, err := client.PostJSONBlueprintV0(c.socket, "")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST a blueprint to the workspace as TOML
func (c *checkBlueprintsV0) CheckPostTOMLWS() bool {
name := "POST TOML blueprint to workspace"
bp := `
name="test-toml-blueprint-ws-v0"
description="postTOMLBlueprintWSV0"
version="0.0.1"
[[packages]]
name="bash"
version="*"
[[modules]]
name="util-linux"
version="*"
[[customizations.user]]
name="root"
password="qweqweqwe"
`
resp, err := client.PostTOMLWorkspaceV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an invalid TOML blueprint to the workspace
func (c *checkBlueprintsV0) CheckPostInvalidTOMLWS() bool {
name := "POST of an invalid TOML blueprint to workspace"
bp := `
name="test-invalid-toml-blueprint-ws-v0"
version="0.0.1"
[package
name="bash"
version="*"
`
resp, err := client.PostTOMLWorkspaceV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an empty TOML blueprint to the workspace
func (c *checkBlueprintsV0) CheckPostEmptyTOMLWS() bool {
name := "POST of an empty TOML blueprint to workspace"
resp, err := client.PostTOMLWorkspaceV0(c.socket, "")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST a blueprint to the workspace as JSON
func (c *checkBlueprintsV0) CheckPostJSONWS() bool {
name := "POST JSON blueprint to workspace"
bp := `{
"name": "test-json-blueprint-ws-v0",
"description": "postJSONBlueprintWSV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
resp, err := client.PostJSONWorkspaceV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an invalid JSON blueprint to the workspace
func (c *checkBlueprintsV0) CheckPostInvalidJSONWS() bool {
name := "POST of an invalid JSON blueprint to workspace"
bp := `{
"name": "test-invalid-json-blueprint-ws-v0",
"version": "0.0.1",
"modules": [{"name: "util-linux", "version": "*"}],
}`
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// POST an empty JSON blueprint to the workspace
func (c *checkBlueprintsV0) CheckPostEmptyJSONWS() bool {
name := "POST of an empty JSON blueprint to workspace"
resp, err := client.PostJSONBlueprintV0(c.socket, "")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// delete a blueprint
func (c *checkBlueprintsV0) CheckDelete() bool {
name := "DELETE blueprint"
// POST a blueprint to delete
bp := `{
"name": "test-delete-blueprint-v0",
"description": "deleteBlueprintV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Delete the blueprint
resp, err = client.DeleteBlueprintV0(c.socket, "test-delete-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// delete a non-existent blueprint
func (c *checkBlueprintsV0) CheckDeleteNonBlueprint() bool {
name := "DELETE a non-existent blueprint"
resp, err := client.DeleteBlueprintV0(c.socket, "test-delete-non-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// delete a new blueprint from the workspace
func (c *checkBlueprintsV0) CheckDeleteNewWS() bool {
name := "DELETE new blueprint from workspace"
// POST a blueprint to delete
bp := `{
"name": "test-delete-new-blueprint-ws-v0",
"description": "deleteNewBlueprintWSV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
resp, err := client.PostJSONWorkspaceV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Delete the blueprint
resp, err = client.DeleteWorkspaceV0(c.socket, "test-delete-new-blueprint-ws-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// delete blueprint changes from the workspace
func (c *checkBlueprintsV0) CheckDeleteChangesWS() bool {
name := "DELETE blueprint changes from workspace"
// POST a blueprint first
bp := `{
"name": "test-delete-blueprint-changes-ws-v0",
"description": "deleteBlueprintChangesWSV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Post blueprint changes to the workspace
bp = `{
"name": "test-delete-blueprint-changes-ws-v0",
"description": "workspace copy",
"version": "0.2.0",
"packages": [{"name": "frobozz", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
resp, err = client.PostJSONWorkspaceV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the blueprint, make sure it is the modified one and that changes = true
info, api, err := client.GetBlueprintsInfoJSONV0(c.socket, "test-delete-blueprint-changes-ws-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s BlueprintsInfo request failed: %s", name, api)
return false
}
if len(info.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprints returned", name)
return false
}
if len(info.Changes) < 1 {
log.Printf("FAIL: %s failed: No change states returned", name)
return false
}
if info.Blueprints[0].Name != "test-delete-blueprint-changes-ws-v0" {
log.Printf("FAIL: %s failed: wrong blueprint returned", name)
return false
}
if info.Changes[0].Name != "test-delete-blueprint-changes-ws-v0" {
log.Printf("FAIL: %s failed: wrong change state returned", name)
return false
}
if !info.Changes[0].Changed {
log.Printf("FAIL: %s failed: wrong change state returned (false)", name)
return false
}
if info.Blueprints[0].Description != "workspace copy" {
log.Printf("FAIL: %s failed: workspace copy not returned", name)
return false
}
// Delete the blueprint from the workspace
resp, err = client.DeleteWorkspaceV0(c.socket, "test-delete-blueprint-changes-ws-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the blueprint, make sure it is the un-modified one
info, api, err = client.GetBlueprintsInfoJSONV0(c.socket, "test-delete-blueprint-changes-ws-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s BlueprintsInfo request failed: %s", name, api)
return false
}
if len(info.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprints returned", name)
return false
}
if len(info.Changes) < 1 {
log.Printf("FAIL: %s failed: No change states returned", name)
return false
}
if info.Blueprints[0].Name != "test-delete-blueprint-changes-ws-v0" {
log.Printf("FAIL: %s failed: wrong blueprint returned", name)
return false
}
if info.Changes[0].Name != "test-delete-blueprint-changes-ws-v0" {
log.Printf("FAIL: %s failed: wrong change state returned", name)
return false
}
if info.Changes[0].Changed {
log.Printf("FAIL: %s failed: wrong change state returned (true)", name)
return false
}
if info.Blueprints[0].Description != "deleteBlueprintChangesWSV0" {
log.Printf("FAIL: %s failed: original blueprint not returned", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// list blueprints
func (c *checkBlueprintsV0) CheckList() bool {
name := "List blueprints"
// Post a couple of blueprints
bps := []string{`{
"name": "test-list-blueprint-1-v0",
"description": "listBlueprintsV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`,
`{
"name": "test-list-blueprint-2-v0",
"description": "listBlueprintsV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`}
for i := range bps {
resp, err := client.PostJSONBlueprintV0(c.socket, bps[i])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
}
// Get the list of blueprints
list, api, err := client.ListBlueprintsV0(c.socket)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err.Error())
return false
}
if api != nil {
log.Printf("FAIL: %s ListBlueprints failed: %s", name, api)
return false
}
// Make sure the blueprints are in the list
sorted := sort.StringSlice(list)
if !isStringInSlice(sorted, "test-list-blueprint-1-v0") ||
!isStringInSlice(sorted, "test-list-blueprint-2-v0") {
log.Printf("FAIL: %s failed", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// get blueprint contents as TOML
func (c *checkBlueprintsV0) CheckGetTOML() bool {
name := "Get TOML Blueprint"
bp := `{
"name": "test-get-blueprint-1-v0",
"description": "getTOMLBlueprintV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
// Post a blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get it as TOML
body, api, err := client.GetBlueprintInfoTOMLV0(c.socket, "test-get-blueprint-1-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintInfo failed: %s", name, api)
return false
}
if len(body) == 0 {
log.Printf("FAIL: %s failed: body of response is empty", name)
return false
}
// Can it be decoded as TOML?
var decoded interface{}
if _, err := toml.Decode(body, &decoded); err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// get non-existent blueprint contents as TOML
func (c *checkBlueprintsV0) CheckGetNonTOML() bool {
name := "Get non-existent TOML Blueprint"
_, api, err := client.GetBlueprintInfoTOMLV0(c.socket, "test-get-non-blueprint-1-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api == nil || api.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// get blueprint contents as JSON
func (c *checkBlueprintsV0) CheckGetJSON() bool {
name := "Get JSON Blueprint"
bp := `{
"name": "test-get-blueprint-2-v0",
"description": "getJSONBlueprintV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
// Post a blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the blueprint and its changed state
info, api, err := client.GetBlueprintsInfoJSONV0(c.socket, "test-get-blueprint-2-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsInfo failed: %s", name, api)
return false
}
if len(info.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprints returned", name)
return false
}
if len(info.Changes) < 1 {
log.Printf("FAIL: %s failed: No change states returned", name)
return false
}
if info.Blueprints[0].Name != "test-get-blueprint-2-v0" {
log.Printf("FAIL: %s failed: wrong blueprint returned", name)
return false
}
if info.Changes[0].Name != "test-get-blueprint-2-v0" {
log.Printf("FAIL: %s failed: wrong change state returned", name)
return false
}
if info.Changes[0].Changed {
log.Printf("FAIL: %s failed: unexpected changes", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// get non-existent blueprint contents as JSON
func (c *checkBlueprintsV0) CheckGetNonJSON() bool {
name := "Get non-existent JSON Blueprint"
resp, api, err := client.GetBlueprintsInfoJSONV0(c.socket, "test-get-non-blueprint-1-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s failed: %s", name, api)
return false
}
if len(resp.Errors) == 0 {
log.Printf("FAIL: %s failed with no error: %v", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// pushing the same blueprint bumps the version number returned by show
func (c *checkBlueprintsV0) CheckBumpVersion() bool {
name := "Bump Blueprint Version number"
bp := `{
"name": "test-bump-blueprint-1-v0",
"description": "bumpBlueprintVersionV0",
"version": "2.1.2",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`
// List blueprints
list, api, err := client.ListBlueprintsV0(c.socket)
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err.Error())
return false
}
if api != nil {
log.Printf("FAIL: %s ListBlueprints failed: %s", name, api)
return false
}
// If the blueprint already exists it needs to be deleted to start from a known state
sorted := sort.StringSlice(list)
if isStringInSlice(sorted, "test-bump-blueprint-1-v0") {
// Delete this blueprint if it already exists
resp, err := client.DeleteBlueprintV0(c.socket, "test-bump-blueprint-1-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
}
// Post a blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Post a blueprint again to bump verion to 2.1.3
resp, err = client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the blueprint and its changed state
info, api, err := client.GetBlueprintsInfoJSONV0(c.socket, "test-bump-blueprint-1-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsInfo failed: %s", name, api)
return false
}
if len(info.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprints returned", name)
return false
}
if info.Blueprints[0].Name != "test-bump-blueprint-1-v0" {
log.Printf("FAIL: %s failed: wrong blueprint returned", name)
return false
}
if info.Blueprints[0].Version != "2.1.3" {
log.Printf("FAIL: %s failed: wrong blueprint version", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Make several changes to a blueprint and list the changes
func (c *checkBlueprintsV0) CheckBlueprintChangesV0() bool {
name := "List blueprint changes"
bps := []string{`{
"name": "test-blueprint-changes-v0",
"description": "CheckBlueprintChangesV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}]
}`,
`{
"name": "test-blueprint-changes-v0",
"description": "CheckBlueprintChangesV0",
"version": "0.1.0",
"packages": [{"name": "bash", "version": "*"}, {"name": "tmux", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`,
`{
"name": "test-blueprint-changes-v0",
"description": "CheckBlueprintChangesV0",
"version": "0.1.1",
"packages": [{"name": "bash", "version": "*"}, {"name": "tmux", "version": "*"}],
"modules": [],
"customizations": {"user": [{"name": "root", "password": "asdasdasd"}]}
}`}
// Push 3 changes to the blueprint
for i := range bps {
resp, err := client.PostJSONBlueprintV0(c.socket, bps[i])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
}
// List the changes
changes, api, err := client.GetBlueprintsChangesV0(c.socket, []string{"test-blueprint-changes-v0"})
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsChanges failed: %s", name, api)
return false
}
if len(changes.BlueprintsChanges) != 1 {
log.Printf("FAIL: %s failed: No changes returned", name)
return false
}
if changes.BlueprintsChanges[0].Name != "test-blueprint-changes-v0" {
log.Printf("FAIL: %s failed: Wrong blueprint changes returned", name)
return false
}
if len(changes.BlueprintsChanges[0].Changes) < 3 {
log.Printf("FAIL: %s failed: Wrong number of changes returned", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Get changes for a non-existent blueprint
func (c *checkBlueprintsV0) CheckBlueprintNonChangesV0() bool {
name := "List non-existent blueprint changes"
resp, api, err := client.GetBlueprintsChangesV0(c.socket, []string{"test-non-blueprint-changes-v0"})
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s failed: %s", name, api)
return false
}
if len(resp.Errors) == 0 {
log.Printf("FAIL: %s failed with no error: %v", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Undo blueprint changes
func (c *checkBlueprintsV0) CheckUndoBlueprintV0() bool {
name := "Undo blueprint changes"
bps := []string{`{
"name": "test-undo-blueprint-v0",
"description": "CheckUndoBlueprintV0",
"version": "0.0.5",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`,
`{
"name": "test-undo-blueprint-v0",
"description": "CheckUndoBlueprintv0",
"version": "0.0.6",
"packages": [{"name": "bash", "version": "0.5.*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`}
// Push original version of the blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bps[0])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the commit hash
changes, api, err := client.GetBlueprintsChangesV0(c.socket, []string{"test-undo-blueprint-v0"})
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsChanges failed: %s", name, api)
return false
}
if len(changes.BlueprintsChanges) != 1 {
log.Printf("FAIL: %s failed: No changes returned", name)
return false
}
if len(changes.BlueprintsChanges[0].Changes) < 1 {
log.Printf("FAIL: %s failed: Wrong number of changes returned", name)
return false
}
commit := changes.BlueprintsChanges[0].Changes[0].Commit
if len(commit) == 0 {
log.Printf("FAIL: %s failed: First commit is empty", name)
return false
}
// Push the new version with wrong bash version
resp, err = client.PostJSONBlueprintV0(c.socket, bps[1])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the blueprint, confirm bash version is '0.5.*'
info, api, err := client.GetBlueprintsInfoJSONV0(c.socket, "test-undo-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsInfo failed: %s", name, api)
return false
}
if len(info.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprints returned", name)
return false
}
if len(info.Blueprints[0].Packages) < 1 {
log.Printf("FAIL: %s failed: No packages in the blueprint", name)
return false
}
if info.Blueprints[0].Packages[0].Name != "bash" ||
info.Blueprints[0].Packages[0].Version != "0.5.*" {
log.Printf("FAIL: %s failed to push change: Wrong package in the blueprint: %s", name, info.Blueprints[0].Packages[0])
log.Printf("%#v", info)
return false
}
// Revert the blueprint to the original version
resp, err = client.UndoBlueprintChangeV0(c.socket, "test-undo-blueprint-v0", commit)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
// Get the blueprint, confirm bash version is '*'
info, api, err = client.GetBlueprintsInfoJSONV0(c.socket, "test-undo-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsInfo failed: %s", name, api)
return false
}
if len(info.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprints returned", name)
return false
}
if len(info.Blueprints[0].Packages) < 1 {
log.Printf("FAIL: %s failed: No packages in the blueprint", name)
return false
}
if info.Blueprints[0].Packages[0].Name != "bash" ||
info.Blueprints[0].Packages[0].Version != "*" {
log.Printf("FAIL: %s failed to undo change: Wrong package in the blueprint: %s", name, info.Blueprints[0].Packages[0])
log.Printf("%#v", info)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Undo non-existent commit blueprint changes
func (c *checkBlueprintsV0) CheckUndoBlueprintNonCommitV0() bool {
name := "Undo blueprint non-existent commit"
bps := []string{`{
"name": "test-undo-blueprint-non-commit-v0",
"description": "CheckUndoBlueprintNonCommitV0",
"version": "0.0.5",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`,
`{
"name": "test-undo-blueprint-non-commit-v0",
"description": "CheckUndoBlueprintNonCommitv0",
"version": "0.0.6",
"packages": [{"name": "bash", "version": "0.5.*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`}
for i := range bps {
resp, err := client.PostJSONBlueprintV0(c.socket, bps[i])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s failed: %s", name, resp)
return false
}
}
resp, err := client.UndoBlueprintChangeV0(c.socket, "test-undo-blueprint-non-commit-v0", "FFFF")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Undo non-existent blueprint changes
func (c *checkBlueprintsV0) CheckUndoNonBlueprintV0() bool {
name := "Undo non-existent blueprint changes"
resp, err := client.UndoBlueprintChangeV0(c.socket, "test-undo-non-blueprint-v0", "FFFF")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if resp.Status {
log.Printf("FAIL: %s did not return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Tag a blueprint with a new revision
// The blueprint revision tag cannot be reset, it always increments by one, and cannot be deleted.
// So to test tagging we tag two blueprint changes and make sure the second is first +1
func (c *checkBlueprintsV0) CheckBlueprintTagV0() bool {
name := "Tag a blueprint"
bps := []string{`{
"name": "test-tag-blueprint-v0",
"description": "CheckBlueprintTagV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "0.1.*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`,
`{
"name": "test-tag-blueprint-v0",
"description": "CheckBlueprintTagV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "0.5.*"}],
"modules": [{"name": "util-linux", "version": "*"}],
"customizations": {"user": [{"name": "root", "password": "qweqweqwe"}]}
}`}
// Push a blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bps[0])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s POST failed: %s", name, resp)
return false
}
// Tag the blueprint
tagResp, err := client.TagBlueprintV0(c.socket, "test-tag-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !tagResp.Status {
log.Printf("FAIL: %s Tag failed: %s", name, tagResp)
return false
}
// Get changes, get the blueprint's revision
changes, api, err := client.GetBlueprintsChangesV0(c.socket, []string{"test-tag-blueprint-v0"})
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsChange failed: %s", name, api)
return false
}
if len(changes.BlueprintsChanges) != 1 {
log.Printf("FAIL: %s failed: No changes returned", name)
return false
}
if len(changes.BlueprintsChanges[0].Changes) < 1 {
log.Printf("FAIL: %s failed: Wrong number of changes returned", name)
return false
}
revision := changes.BlueprintsChanges[0].Changes[0].Revision
if revision == nil || *revision == 0 {
log.Printf("FAIL: %s failed: Revision is zero", name)
return false
}
// Push a new version of the blueprint
resp, err = client.PostJSONBlueprintV0(c.socket, bps[1])
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s POST failed: %s", name, resp)
return false
}
// Tag the blueprint
tagResp, err = client.TagBlueprintV0(c.socket, "test-tag-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !tagResp.Status {
log.Printf("FAIL: %s Tag failed: %s", name, tagResp)
return false
}
// Get changes, confirm that Revision is revision +1
changes, api, err = client.GetBlueprintsChangesV0(c.socket, []string{"test-tag-blueprint-v0"})
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err)
return false
}
if api != nil {
log.Printf("FAIL: %s GetBlueprintsChanges failed: %s", name, api)
return false
}
if len(changes.BlueprintsChanges) != 1 {
log.Printf("FAIL: %s failed: No changes returned", name)
return false
}
if len(changes.BlueprintsChanges[0].Changes) < 1 {
log.Printf("FAIL: %s failed: Wrong number of changes returned", name)
return false
}
newRevision := changes.BlueprintsChanges[0].Changes[0].Revision
if newRevision == nil || *newRevision != *revision+1 {
log.Printf("FAIL: %s failed: Revision is not %d", name, *revision+1)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// Tag a non-existent blueprint
func (c *checkBlueprintsV0) CheckNonBlueprintTagV0() bool {
name := "Tag a non-existent blueprint"
tagResp, err := client.TagBlueprintV0(c.socket, "test-tag-non-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if tagResp.Status {
log.Printf("FAIL: %s failed to return an error", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// depsolve a blueprint with packages and modules
func (c *checkBlueprintsV0) CheckBlueprintDepsolveV0() bool {
name := "Depsolve a blueprint"
bp := `{
"name": "test-deps-blueprint-v0",
"description": "CheckBlueprintDepsolveV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}]
}`
// Push a blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s POST failed: %s", name, resp)
return false
}
// Depsolve the blueprint
deps, api, err := client.DepsolveBlueprintV0(c.socket, "test-deps-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err.Error())
return false
}
if api != nil {
log.Printf("FAIL: %s DepsolveBlueprint failed: %s", name, api)
return false
}
if len(deps.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No blueprint dependencies returned", name)
return false
}
if len(deps.Blueprints[0].Dependencies) < 3 {
log.Printf("FAIL: %s failed: Not enough dependencies returned", name)
return false
}
// TODO
// Get the bash and util-linux dependencies and make sure their versions are not *
log.Printf("OK: %s was successful", name)
return true
}
// depsolve a non-existent blueprint
func (c *checkBlueprintsV0) CheckNonBlueprintDepsolveV0() bool {
name := "Depsolve a non-existent blueprint"
resp, api, err := client.DepsolveBlueprintV0(c.socket, "test-deps-non-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err.Error())
return false
}
if api != nil {
log.Printf("FAIL: %s failed: %s", name, api)
return false
}
if len(resp.Errors) == 0 {
log.Printf("FAIL: %s failed with no error: %v", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// freeze a blueprint
func (c *checkBlueprintsV0) CheckBlueprintFreezeV0() bool {
name := "Freeze a blueprint"
bp := `{
"name": "test-freeze-blueprint-v0",
"description": "CheckBlueprintFreezeV0",
"version": "0.0.1",
"packages": [{"name": "bash", "version": "*"}],
"modules": [{"name": "util-linux", "version": "*"}]
}`
// Push a blueprint
resp, err := client.PostJSONBlueprintV0(c.socket, bp)
if err != nil {
log.Printf("FAIL: %s failed with a client error: %s", name, err)
return false
}
if !resp.Status {
log.Printf("FAIL: %s POST failed: %s", name, resp)
return false
}
// Freeze the blueprint
frozen, api, err := client.FreezeBlueprintV0(c.socket, "test-freeze-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err.Error())
return false
}
if api != nil {
log.Printf("FAIL: %s FreezeBlueprint failed: %s", name, api)
return false
}
if len(frozen.Blueprints) < 1 {
log.Printf("FAIL: %s failed: No frozen blueprints returned", name)
return false
}
if len(frozen.Blueprints[0].Blueprint.Packages) < 1 {
log.Printf("FAIL: %s failed: No frozen packages returned", name)
return false
}
if frozen.Blueprints[0].Blueprint.Packages[0].Name != "bash" ||
frozen.Blueprints[0].Blueprint.Packages[0].Version == "*" {
log.Printf("FAIL: %s failed: Incorrect frozen packages", name)
return false
}
if len(frozen.Blueprints[0].Blueprint.Modules) < 1 {
log.Printf("FAIL: %s failed: No frozen modules returned", name)
return false
}
if frozen.Blueprints[0].Blueprint.Modules[0].Name != "util-linux" ||
frozen.Blueprints[0].Blueprint.Modules[0].Version == "*" {
log.Printf("FAIL: %s failed: Incorrect frozen modules", name)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// freeze a non-existent blueprint
func (c *checkBlueprintsV0) CheckNonBlueprintFreezeV0() bool {
name := "Freeze a non-existent blueprint"
resp, api, err := client.FreezeBlueprintV0(c.socket, "test-freeze-non-blueprint-v0")
if err != nil {
log.Printf("FAIL: %s failed: %s", name, err.Error())
return false
}
if api != nil {
log.Printf("FAIL: %s failed: %s", name, api)
return false
}
if len(resp.Errors) == 0 {
log.Printf("FAIL: %s failed with no error: %v", name, resp)
return false
}
log.Printf("OK: %s was successful", name)
return true
}
// diff of blueprint changes
func (c *checkBlueprintsV0) CheckBlueprintDiffV0() bool {
name := "Diff of blueprint changes"
log.Printf("SKIP: %s was skipped, needs to be implemented", name)
return true
}