Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Keystone] Merge version field with ID #502

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
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ require (
go.uber.org/zap v1.26.0
golang.org/x/crypto v0.18.0
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
golang.org/x/mod v0.14.0
gonum.org/v1/gonum v0.14.0
google.golang.org/grpc v1.58.3
google.golang.org/protobuf v1.31.0
Expand Down
30 changes: 19 additions & 11 deletions pkg/capabilities/capabilities.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import (
"errors"
"fmt"
"regexp"
"strings"
"time"

p2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
"golang.org/x/mod/semver"

"github.com/smartcontractkit/chainlink-common/pkg/values"
)
Expand Down Expand Up @@ -177,16 +177,31 @@ type CapabilityInfo struct {
ID string
CapabilityType CapabilityType
Description string
Version string
DON *DON
}

// Parse out the version from the ID.
func (c CapabilityInfo) Version() string {
return c.ID[strings.Index(c.ID, "@")+1:]
}

// Info returns the info of the capability.
func (c CapabilityInfo) Info(ctx context.Context) (CapabilityInfo, error) {
return c, nil
}

var idRegex = regexp.MustCompile(`[a-z0-9_\-:]`)
// This regex allows for the following format:
//
// {name}:{label1_key}_{labe1_value}:{label2_key}_{label2_value}@{version}
//
// The version regex is taken from https://semver.org/, but has been modified to support only major versions.
//
// It is also validated when a workflow is being ingested. See the following link for more details:
// https://github.com/smartcontractkit/chainlink/blob/a0d1ce5e9cddc540bba8eb193865646cf0ebc0a8/core/services/workflows/models_yaml.go#L309
//
// The difference between the regex within the link above and this one is that we do not use double backslashes, since
// we only needed those for JSON schema regex validation.
var idRegex = regexp.MustCompile(`^[a-z0-9_\-:]+@(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$`)

const (
// TODO: this length was largely picked arbitrarily.
Expand All @@ -200,7 +215,6 @@ func NewCapabilityInfo(
id string,
capabilityType CapabilityType,
description string,
version string,
don *DON,
) (CapabilityInfo, error) {
if len(id) > idMaxLength {
Expand All @@ -210,10 +224,6 @@ func NewCapabilityInfo(
return CapabilityInfo{}, fmt.Errorf("invalid id: %s. Allowed: %s", id, idRegex)
}

if ok := semver.IsValid(version); !ok {
return CapabilityInfo{}, fmt.Errorf("invalid version: %+v", version)
}

if err := capabilityType.IsValid(); err != nil {
return CapabilityInfo{}, err
}
Expand All @@ -222,7 +232,6 @@ func NewCapabilityInfo(
ID: id,
CapabilityType: capabilityType,
Description: description,
Version: version,
DON: don,
}, nil
}
Expand All @@ -233,10 +242,9 @@ func MustNewCapabilityInfo(
id string,
capabilityType CapabilityType,
description string,
version string,
don *DON,
) CapabilityInfo {
c, err := NewCapabilityInfo(id, capabilityType, description, version, don)
c, err := NewCapabilityInfo(id, capabilityType, description, don)
if err != nil {
panic(err)
}
Expand Down
59 changes: 49 additions & 10 deletions pkg/capabilities/capabilities_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,52 @@ import (

func Test_CapabilityInfo(t *testing.T) {
ci, err := NewCapabilityInfo(
"capability-id",
"capability-id@1.0.0",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
"v1.0.0",
nil,
)
require.NoError(t, err)

gotCi, err := ci.Info(tests.Context(t))
require.NoError(t, err)
require.Equal(t, ci.Version(), "1.0.0")
assert.Equal(t, ci, gotCi)

ci, err = NewCapabilityInfo(
// add build metadata and sha
"capability-id@1.0.0+build.1234.sha-5678",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
nil,
)
require.NoError(t, err)

gotCi, err = ci.Info(tests.Context(t))
require.NoError(t, err)
require.Equal(t, ci.Version(), "1.0.0+build.1234.sha-5678")
assert.Equal(t, ci, gotCi)

// prerelease
ci, err = NewCapabilityInfo(
"capability-id@1.0.0-beta",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
nil,
)
require.NoError(t, err)

gotCi, err = ci.Info(tests.Context(t))
require.NoError(t, err)
require.Equal(t, ci.Version(), "1.0.0-beta")
assert.Equal(t, ci, gotCi)
}

func Test_CapabilityInfo_Invalid(t *testing.T) {
_, err := NewCapabilityInfo(
"capability-id",
"capability-id@2.0.0",
CapabilityType(5),
"This is a mock capability that doesn't do anything.",
"v1.0.0",
nil,
)
assert.ErrorContains(t, err, "invalid capability type")
Expand All @@ -42,25 +69,38 @@ func Test_CapabilityInfo_Invalid(t *testing.T) {
"&!!!",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
"v1.0.0",
nil,
)
assert.ErrorContains(t, err, "invalid id")

_, err = NewCapabilityInfo(
"mock-capability",
"mock-capability@v1.0.0",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
nil,
)
assert.ErrorContains(t, err, "invalid id")

_, err = NewCapabilityInfo(
"mock-capability@1.0",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
nil,
)
assert.ErrorContains(t, err, "invalid id")

_, err = NewCapabilityInfo(
"mock-capability@1",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
"hello",
nil,
)
assert.ErrorContains(t, err, "invalid version")

assert.ErrorContains(t, err, "invalid id")
_, err = NewCapabilityInfo(
strings.Repeat("n", 256),
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
"hello",
nil,
)
assert.ErrorContains(t, err, "exceeds max length 128")
Expand Down Expand Up @@ -192,7 +232,6 @@ func Test_MustNewCapabilityInfo(t *testing.T) {
"capability-id",
CapabilityTypeAction,
"This is a mock capability that doesn't do anything.",
"should-panic",
nil,
)
})
Expand Down
3 changes: 1 addition & 2 deletions pkg/capabilities/consensus/ocr3/capability.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
)

const (
ocrCapabilityID = "offchain_reporting"
ocrCapabilityID = "offchain_reporting@1.0.0"

methodStartRequest = "start_request"
methodSendResponse = "send_response"
Expand All @@ -27,7 +27,6 @@ var info = capabilities.MustNewCapabilityInfo(
ocrCapabilityID,
capabilities.CapabilityTypeConsensus,
"OCR3 consensus exposed as a capability.",
"v1.0.0",
nil,
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/offchain_reporting/root",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/offchain_reporting@1.0.0/root",
"properties": {
"config": {
"properties": {
Expand Down Expand Up @@ -94,4 +94,4 @@
"outputs"
],
"description": "OCR3 consensus exposed as a capability."
}
}
4 changes: 2 additions & 2 deletions pkg/capabilities/testdata/fixtures/validator/schema.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/test/root",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/test@1.0.0/root",
"properties": {
"config": {
"properties": {
Expand Down Expand Up @@ -84,4 +84,4 @@
"outputs"
],
"description": "test description"
}
}
3 changes: 1 addition & 2 deletions pkg/capabilities/triggers/mercury_trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,12 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/values"
)

const triggerID = "streams-trigger"
const triggerID = "streams-trigger@1.0.0"

var capInfo = capabilities.MustNewCapabilityInfo(
triggerID,
capabilities.CapabilityTypeTrigger,
"Streams Trigger",
"v1.0.0",
nil,
)

Expand Down
3 changes: 1 addition & 2 deletions pkg/capabilities/triggers/on_demand_trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ import (
)

var info = capabilities.MustNewCapabilityInfo(
"on-demand-trigger",
"on-demand-trigger@1.0.0",
capabilities.CapabilityTypeTrigger,
"An example on-demand trigger.",
"v1.0.0",
nil,
)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/streams-trigger/root",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/streams-trigger@1.0.0/root",
"properties": {
"config": {
"properties": {
Expand Down Expand Up @@ -69,4 +69,4 @@
"outputs"
],
"description": "Streams Trigger"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/on-demand-trigger/root",
"$id": "https://github.com/smartcontractkit/chainlink/capabilities/on-demand-trigger@1.0.0/root",
"properties": {
"config": {
"properties": {},
Expand All @@ -27,4 +27,4 @@
"outputs"
],
"description": "An example on-demand trigger."
}
}
3 changes: 1 addition & 2 deletions pkg/capabilities/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,9 @@ func TestValidator_ValidateOutputs(t *testing.T) {

func TestValidator_GenerateSchema(t *testing.T) {
capInfo := CapabilityInfo{
ID: "test",
ID: "test@1.0.0",
CapabilityType: CapabilityTypeTrigger,
Description: "test description",
Version: "1.0.0",
}
v := NewValidator[TestConfig, TestInputs, TestOutputs](ValidatorArgs{Info: capInfo})
schema, err := v.Schema()
Expand Down
2 changes: 0 additions & 2 deletions pkg/loop/internal/core/services/capability/capabilities.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ func (c *baseCapabilityServer) Info(ctx context.Context, request *emptypb.Empty)
Id: info.ID,
CapabilityType: ct,
Description: info.Description,
Version: info.Version,
}, nil
}

Expand Down Expand Up @@ -173,7 +172,6 @@ func (c *baseCapabilityClient) Info(ctx context.Context) (capabilities.Capabilit
ID: resp.Id,
CapabilityType: ct,
Description: resp.Description,
Version: resp.Version,
}, nil
}

Expand Down
Loading
Loading