Skip to content
Draft
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
9 changes: 6 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,10 @@ ifeq (,$(shell command -v oapi-codegen))
go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest
endif

.PHONY: error
error:
go run github.com/layer5io/meshkit/cmd/errorutil -d . analyze -i ./meshkiterrors -o ./meshkiterrors




## Runs meshkit error utility to update error codes for mesheryctl.
error-util:
go run github.com/layer5io/meshkit/cmd/errorutil -d . update -i ./meshkiterrors -o ./meshkiterrors
16 changes: 12 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
module github.com/meshery/schemas

go 1.23.0
go 1.23.4

toolchain go1.24.1

require (
github.com/gofrs/uuid v4.4.0+incompatible
github.com/layer5io/meshkit v0.8.22
github.com/google/uuid v1.6.0
github.com/layer5io/meshkit v0.8.26
github.com/oapi-codegen/runtime v1.1.1
github.com/pkg/errors v0.9.1
github.com/santhosh-tekuri/jsonschema v1.2.4
github.com/sirupsen/logrus v1.9.3
github.com/stretchr/testify v1.10.0
gorm.io/gorm v1.25.12
)

Expand All @@ -18,16 +23,17 @@ require (
cuelang.org/go v0.11.2 // indirect
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.7.2 // indirect
Expand All @@ -39,7 +45,9 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/spf13/cobra v1.8.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
Expand Down
12 changes: 10 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg=
github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
Expand Down Expand Up @@ -51,6 +52,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gT
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q=
github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
Expand All @@ -72,8 +75,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/layer5io/meshkit v0.8.22 h1:OeGWSyxSqXkj92oQWdYGw4i124kdOhmR0Y49lBduybw=
github.com/layer5io/meshkit v0.8.22/go.mod h1:M9tQEgvU0sVcLuU7Knq6FE0M3s8ezod947tMgsP0DVI=
github.com/layer5io/meshkit v0.8.26 h1:eX6fC/h3gmLdangcUcMJhFVPfP/GxDeq1TjWkvO16/E=
github.com/layer5io/meshkit v0.8.26/go.mod h1:lMeuC99MrbP5WIBNdzDOKokCfUOW/5a/hERcCl9YSFs=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
Expand Down Expand Up @@ -102,8 +105,13 @@ github.com/protocolbuffers/txtpbfmt v0.0.0-20240823084532-8e6b51fa9bef h1:ej+64j
github.com/protocolbuffers/txtpbfmt v0.0.0-20240823084532-8e6b51fa9bef/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis=
github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
Expand Down
5 changes: 5 additions & 0 deletions meshkiterrors/component_info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "meshery.schemas",
"type": "client",
"next_error_code": 2
}
4 changes: 2 additions & 2 deletions schemas/constructs/core.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
"minLength": 2,
"maxLength": 100,
"description": "API version of the object",
"pattern": "([a-z.])*(?!^/)v(alpha|beta|[0-9]+)([.-]*[a-z0-9]+)*$",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(not about to be merged)

this keep failing with error of invalid reg exp, was not able to resolve, removed for now to be able to compile schema.

"example": ["v1", "v1alpha1", "v2beta3", "v1.custom-suffix"]
"pattern": "^(([a-z.])+\/?)?v(alpha|beta|[0-9]+)([.-]*[a-z0-9]+)*$",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated version, which looks like very close to original, and is valid with respect to golang reg exp parser.

"example": ["v1", "v1alpha1", "v2beta3", "v1.custom-suffix", "models.meshery.io/v1beta1"]
},
"semverString": {
"type": "string",
Expand Down
2 changes: 1 addition & 1 deletion schemas/constructs/v1alpha1/capability/capability.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$id": "https://schemas.meshery.io/capability.json",
"$id": "https://schemas.meshery.io/v1alpha1/capability/capability.json",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Updating the $id to include the version is good for schema management. Ensure that all references to this schema are updated accordingly in other schema files and in the code where this schema is used.

"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Meshery manages entities in accordance with their specific capabilities. This field explicitly identifies those capabilities largely by what actions a given component supports; e.g. metric-scrape, sub-interface, and so on. This field is extensible. Entities may define a broad array of capabilities, which are in-turn dynamically interpretted by Meshery for full lifecycle management.",
"additionalProperties": false,
Expand Down
2 changes: 1 addition & 1 deletion schemas/constructs/v1beta1/category/category.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$id": "https://schemas.meshery.io/category.json",
"$id": "https://schemas.meshery.io/v1beta1/category/category.json",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Updating the $id to include the version is good for schema management. Ensure that all references to this schema are updated accordingly in other schema files and in the code where this schema is used.

"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"description": "Category of the model.",
Expand Down
2 changes: 1 addition & 1 deletion schemas/constructs/v1beta1/connection.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$id": "https://schemas.meshery.io/component.json",
"$id": "https://schemas.meshery.io/v1beta1/connection.json",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Updating the $id to include the version is good for schema management. Ensure that all references to this schema are updated accordingly in other schema files and in the code where this schema is used.

"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Meshery Connections are managed and unmanaged resources that either through discovery or manual entry are tracked by Meshery. Learn more at https://docs.meshery.io/concepts/logical/connections",
"additionalProperties": false,
Expand Down
2 changes: 1 addition & 1 deletion schemas/constructs/v1beta1/model/model.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$id": "https://schemas.meshery.io/model.json",
"$id": "https://schemas.meshery.io/v1beta1/model/model.json",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Updating the $id to include the version is good for schema management. Ensure that all references to this schema are updated accordingly in other schema files and in the code where this schema is used.

"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Meshery Models serve as a portable unit of packaging to define managed entities, their relationships, and capabilities.",
"additionalProperties": false,
Expand Down
2 changes: 1 addition & 1 deletion schemas/constructs/v1beta1/subcategory/subcategory.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$id": "https://schemas.meshery.io/category.json",
"$id": "https://schemas.meshery.io/v1beta1/subcategory/subcategory.json",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Updating the $id to include the version is good for schema management. Ensure that all references to this schema are updated accordingly in other schema files and in the code where this schema is used.

"$schema": "http://json-schema.org/draft-07/schema#",
"type": "string",
"title": "SubCategory",
Expand Down
22 changes: 22 additions & 0 deletions validate/go/error.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package validate

import (
"errors"

meshkitErrors "github.com/layer5io/meshkit/errors"
)

const (
ErrValidateCode = "meshery.schemas-1"
)

func ErrValidate(errs ...error) error {
return meshkitErrors.New(
ErrValidateCode,
meshkitErrors.Fatal,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using meshkitErrors.Fatal might be too severe for validation errors. Consider using a less severe error level like meshkitErrors.Error or meshkitErrors.Warn depending on the context. This would allow the application to handle validation failures more gracefully.

[]string{"Error validating document"},
[]string{errors.Join(errs...).Error()},
[]string{"TODO"},
[]string{"TODO"},
Comment on lines +19 to +20
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

These TODO comments should be replaced with actual error descriptions and remediation steps to provide more informative error messages to the user. This will greatly improve the debuggability of the validation process.

,
		[]string{"Detailed error description here"},
		[]string{"Steps to resolve the error"},

)
}
88 changes: 88 additions & 0 deletions validate/go/json_schema_loader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package validate

import (
"bytes"
"encoding/json"
"io"
"os"
"path/filepath"
"strings"

"github.com/google/uuid"
jsFormats "github.com/santhosh-tekuri/jsonschema/formats"
jsLoader "github.com/santhosh-tekuri/jsonschema/loader"
"gopkg.in/yaml.v3"
)

const schemaURL = "https://schemas.meshery.io"

type urlLoader struct {
baseFolder string
}

var ul = &urlLoader{}

func setUpBaseFolder(folder string) {
ul.baseFolder = folder
}

func init() {
// uuid is not a custom format
jsFormats.Register("uuid", func(v string) bool {
if _, err := uuid.Parse(v); err != nil {
log.Warnf("invalid uuid format %s %v", v, err)
return false
}
return true
})

// to load from local
jsLoader.Register(
"https",
ul,
)
}

func (ul urlLoader) Load(path string) (io.ReadCloser, error) {
localPath := path
if strings.HasPrefix(path, schemaURL) {
localPath = filepath.Join(
ul.baseFolder,
strings.TrimLeft(
strings.TrimPrefix(path, schemaURL),
"/",
),
)
}

if strings.HasSuffix(localPath, ".yaml") || strings.HasSuffix(localPath, ".yml") {
// return io.NopCloser(bytes.NewReader([]byte("{}"))), nil
return loadYAMLFile(localPath)
}

return os.Open(localPath)
}

// loadYAMLFile loads a YAML file, converts it to JSON, and returns it as io.ReadCloser
func loadYAMLFile(path string) (io.ReadCloser, error) {
// Read the YAML file
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}

// Parse YAML into an arbitrary Go structure
var yamlData interface{}
if err := yaml.Unmarshal(data, &yamlData); err != nil {
return nil, err
}

// Marshal it back into JSON
jsonData, err := json.Marshal(yamlData)
if err != nil {
return nil, err
}

// Return a ReadCloser over the JSON data
return io.NopCloser(bytes.NewReader(jsonData)), nil
}
31 changes: 31 additions & 0 deletions validate/go/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package validate

import (
"github.com/layer5io/meshkit/logger"
"github.com/sirupsen/logrus"
)

var log logger.Handler

func SetLogger(l logger.Handler) {
log = l
}

func initLoggerOnce() error {
if log != nil {
return nil
}

var err error
log, err = logger.New(
"schemas",
logger.Options{
Format: logger.SyslogLogFormat,
LogLevel: int(logrus.InfoLevel),
},
)
if err != nil {
return err
}
return nil
}
47 changes: 47 additions & 0 deletions validate/go/testdata/model.aws-ec2-controller.v1.4.1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"id": "00000000-0000-0000-0000-000000000000",
"schemaVersion": "models.meshery.io/v1beta1",
"version": "v1.0.0",
"name": "aws-ec2-controller",
"displayName": "AWS EC2",
"status": "enabled",
"description": "---- this field was not here ----",
"relationshipsCount": 0,
"componentsCount": 0,
"categoryId": "00000000-0000-0000-0000-000000000000",
"registrantId": "00000000-0000-0000-0000-000000000000",
"registrant": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Github",
"credential_id": "00000000-0000-0000-0000-000000000000",
"type": "registry",
"sub_type": "",
"kind": "github",
"status": "discovered",
"user_id": "00000000-0000-0000-0000-000000000000",
"created_at": "0001-01-01T00:00:00Z",
"updated_at": "0001-01-01T00:00:00Z",
"deleted_at": "0001-01-01T00:00:00Z"
},
"category": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Provisioning",
"metadata": {}
},
"subCategory": "Compute",
"metadata": {
"capabilities": [],
"isAnnotation": false,
"primaryColor": "#ED7100",
"shape": "rectangle",
"styleOverrides": "",
"svgColor": "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003c!DOCTYPE svg\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 40 40\" height=\"20\" width=\"20\"\u003e \u003cg xmlns=\"http://www.w3.org/2000/svg\" id=\"Icon-Architecture/32/Arch_Amazon-EC2_32\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"\u003e \u003cg xmlns=\"http://www.w3.org/2000/svg\" id=\"Icon-Architecture-BG/32/Compute\" fill=\"#ED7100\"\u003e \u003crect xmlns=\"http://www.w3.org/2000/svg\" id=\"Rectangle\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\u003e\u003c/rect\u003e \u003c/g\u003e \u003cpath xmlns=\"http://www.w3.org/2000/svg\" d=\"M26.052,27 L26,13.948 L13,14 L13,27.052 L26.052,27 Z M27,14 L29,14 L29,15 L27,15 L27,17 L29,17 L29,18 L27,18 L27,20 L29,20 L29,21 L27,21 L27,23 L29,23 L29,24 L27,24 L27,26 L29,26 L29,27 L27,27 L27,27.052 C27,27.575 26.574,28 26.052,28 L26,28 L26,30 L25,30 L25,28 L23,28 L23,30 L22,30 L22,28 L20,28 L20,30 L19,30 L19,28 L17,28 L17,30 L16,30 L16,28 L14,28 L14,30 L13,30 L13,28 L12.948,28 C12.426,28 12,27.575 12,27.052 L12,27 L10,27 L10,26 L12,26 L12,24 L10,24 L10,23 L12,23 L12,21 L10,21 L10,20 L12,20 L12,18 L10,18 L10,17 L12,17 L12,15 L10,15 L10,14 L12,14 L12,13.948 C12,13.425 12.426,13 12.948,13 L13,13 L13,11 L14,11 L14,13 L16,13 L16,11 L17,11 L17,13 L19,13 L19,11 L20,11 L20,13 L22,13 L22,11 L23,11 L23,13 L25,13 L25,11 L26,11 L26,13 L26.052,13 C26.574,13 27,13.425 27,13.948 L27,14 Z M21,33 L7,33 L7,19 L9,19 L9,18 L7.062,18 C6.477,18 6,18.477 6,19.062 L6,32.938 C6,33.523 6.477,34 7.062,34 L20.939,34 C21.524,34 22,33.523 22,32.938 L22,31 L21,31 L21,33 Z M34,7.062 L34,20.938 C34,21.523 33.524,22 32.939,22 L30,22 L30,21 L33,21 L33,7 L19,7 L19,10 L18,10 L18,7.062 C18,6.477 18.477,6 19.062,6 L32.939,6 C33.524,6 34,6.477 34,7.062 L34,7.062 Z\" id=\"Amazon-EC2_Icon_32_Squid\" fill=\"#FFFFFF\"\u003e\u003c/path\u003e \u003c/g\u003e\u003c/svg\u003e",
"svgComplete": "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003c!DOCTYPE svg\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 40 40\" height=\"20\" width=\"20\"\u003e \u003cg xmlns=\"http://www.w3.org/2000/svg\" id=\"Icon-Architecture/32/Arch_Amazon-EC2_32\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"\u003e \u003cg xmlns=\"http://www.w3.org/2000/svg\" id=\"Icon-Architecture-BG/32/Compute\" fill=\"#ED7100\"\u003e \u003crect xmlns=\"http://www.w3.org/2000/svg\" id=\"Rectangle\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\u003e\u003c/rect\u003e \u003c/g\u003e \u003cpath xmlns=\"http://www.w3.org/2000/svg\" d=\"M26.052,27 L26,13.948 L13,14 L13,27.052 L26.052,27 Z M27,14 L29,14 L29,15 L27,15 L27,17 L29,17 L29,18 L27,18 L27,20 L29,20 L29,21 L27,21 L27,23 L29,23 L29,24 L27,24 L27,26 L29,26 L29,27 L27,27 L27,27.052 C27,27.575 26.574,28 26.052,28 L26,28 L26,30 L25,30 L25,28 L23,28 L23,30 L22,30 L22,28 L20,28 L20,30 L19,30 L19,28 L17,28 L17,30 L16,30 L16,28 L14,28 L14,30 L13,30 L13,28 L12.948,28 C12.426,28 12,27.575 12,27.052 L12,27 L10,27 L10,26 L12,26 L12,24 L10,24 L10,23 L12,23 L12,21 L10,21 L10,20 L12,20 L12,18 L10,18 L10,17 L12,17 L12,15 L10,15 L10,14 L12,14 L12,13.948 C12,13.425 12.426,13 12.948,13 L13,13 L13,11 L14,11 L14,13 L16,13 L16,11 L17,11 L17,13 L19,13 L19,11 L20,11 L20,13 L22,13 L22,11 L23,11 L23,13 L25,13 L25,11 L26,11 L26,13 L26.052,13 C26.574,13 27,13.425 27,13.948 L27,14 Z M21,33 L7,33 L7,19 L9,19 L9,18 L7.062,18 C6.477,18 6,18.477 6,19.062 L6,32.938 C6,33.523 6.477,34 7.062,34 L20.939,34 C21.524,34 22,33.523 22,32.938 L22,31 L21,31 L21,33 Z M34,7.062 L34,20.938 C34,21.523 33.524,22 32.939,22 L30,22 L30,21 L33,21 L33,7 L19,7 L19,10 L18,10 L18,7.062 C18,6.477 18.477,6 19.062,6 L32.939,6 C33.524,6 34,6.477 34,7.062 L34,7.062 Z\" id=\"Amazon-EC2_Icon_32_Squid\" fill=\"#FFFFFF\"\u003e\u003c/path\u003e \u003c/g\u003e\u003c/svg\u003e",
"svgWhite": "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003c!DOCTYPE svg\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 40 40\" height=\"20\" width=\"20\"\u003e \u003cg xmlns=\"http://www.w3.org/2000/svg\" id=\"Icon-Architecture/32/Arch_Amazon-EC2_32\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"\u003e \u003cpath xmlns=\"http://www.w3.org/2000/svg\" d=\"M26.052,27 L26,13.948 L13,14 L13,27.052 L26.052,27 Z M27,14 L29,14 L29,15 L27,15 L27,17 L29,17 L29,18 L27,18 L27,20 L29,20 L29,21 L27,21 L27,23 L29,23 L29,24 L27,24 L27,26 L29,26 L29,27 L27,27 L27,27.052 C27,27.575 26.574,28 26.052,28 L26,28 L26,30 L25,30 L25,28 L23,28 L23,30 L22,30 L22,28 L20,28 L20,30 L19,30 L19,28 L17,28 L17,30 L16,30 L16,28 L14,28 L14,30 L13,30 L13,28 L12.948,28 C12.426,28 12,27.575 12,27.052 L12,27 L10,27 L10,26 L12,26 L12,24 L10,24 L10,23 L12,23 L12,21 L10,21 L10,20 L12,20 L12,18 L10,18 L10,17 L12,17 L12,15 L10,15 L10,14 L12,14 L12,13.948 C12,13.425 12.426,13 12.948,13 L13,13 L13,11 L14,11 L14,13 L16,13 L16,11 L17,11 L17,13 L19,13 L19,11 L20,11 L20,13 L22,13 L22,11 L23,11 L23,13 L25,13 L25,11 L26,11 L26,13 L26.052,13 C26.574,13 27,13.425 27,13.948 L27,14 Z M21,33 L7,33 L7,19 L9,19 L9,18 L7.062,18 C6.477,18 6,18.477 6,19.062 L6,32.938 C6,33.523 6.477,34 7.062,34 L20.939,34 C21.524,34 22,33.523 22,32.938 L22,31 L21,31 L21,33 Z M34,7.062 L34,20.938 C34,21.523 33.524,22 32.939,22 L30,22 L30,21 L33,21 L33,7 L19,7 L19,10 L18,10 L18,7.062 C18,6.477 18.477,6 19.062,6 L32.939,6 C33.524,6 34,6.477 34,7.062 L34,7.062 Z\" id=\"Amazon-EC2_Icon_32_Squid\" fill=\"#FFFFFF\"\u003e\u003c/path\u003e \u003c/g\u003e\u003c/svg\u003e"
},
"model": {
"version": "v1.4.1"
},
"components": [],
"relationships": []
}
Loading