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
5 changes: 5 additions & 0 deletions .changeset/lemon-keys-sniff.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"chainlink": minor
---

#added GetJobRuns to Job Distributor
2 changes: 1 addition & 1 deletion core/scripts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ require (
github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20250717121125-2350c82883e2 // indirect
github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250729142306-508e798f6a5d // indirect
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20250722225531-876fd6b94976 // indirect
github.com/smartcontractkit/chainlink-protos/orchestrator v0.8.1 // indirect
github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 // indirect
github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 // indirect
github.com/smartcontractkit/chainlink-protos/svr v1.1.0 // indirect
Expand Down
4 changes: 2 additions & 2 deletions core/scripts/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1568,8 +1568,8 @@ github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250829155125-f4655b
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250829155125-f4655b0b4605/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.13.1 h1:PWwLGimBt37eDzpbfZ9V/ZkW4oCjcwKjKiAwKlSfPc0=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.13.1/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE=
github.com/smartcontractkit/chainlink-protos/orchestrator v0.8.1 h1:VcFo27MBPTMB1d1Tp3q3RzJNqwErKR+z9QLQZ6KBSXo=
github.com/smartcontractkit/chainlink-protos/orchestrator v0.8.1/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 h1:0eroOyBwmdoGUwUdvMI0/J7m5wuzNnJDMglSOK1sfNY=
github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA=
github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w=
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 h1:B7itmjy+CMJ26elVw/cAJqqhBQ3Xa/mBYWK0/rQ5MuI=
Expand Down
58 changes: 58 additions & 0 deletions core/services/feeds/mocks/orm.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 61 additions & 0 deletions core/services/feeds/mocks/service.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 0 additions & 7 deletions core/services/feeds/models_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ func Test_NewChainType(t *testing.T) {
}

for _, tt := range tests {
tt := tt

t.Run(tt.name, func(t *testing.T) {
ct, err := NewChainType(tt.give)

Expand Down Expand Up @@ -180,8 +178,6 @@ func Test_OCR1Config_Value(t *testing.T) {
}

for _, tt := range tests {
tt := tt

t.Run(tt.name, func(t *testing.T) {
val, err := tt.give.Value()
require.NoError(t, err)
Expand Down Expand Up @@ -244,8 +240,6 @@ func Test_OCR1Config_Scan(t *testing.T) {
}

for _, tt := range tests {
tt := tt

t.Run(tt.name, func(t *testing.T) {
var actual OCR1Config
err := actual.Scan([]byte(tt.give))
Expand Down Expand Up @@ -391,7 +385,6 @@ func Test_JobProposal_CanEditDefinition(t *testing.T) {
}

for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

Expand Down
20 changes: 19 additions & 1 deletion core/services/feeds/orm.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ type ORM interface {
UpdateSpecDefinition(ctx context.Context, id int64, spec string) error

IsJobManaged(ctx context.Context, jobID int64) (bool, error)
IsJobManagedByFeedsManager(ctx context.Context, jobID int64, feedsManagerID int64) (bool, error)

Transact(context.Context, func(ORM) error) error
WithDataSource(sqlutil.DataSource) ORM
Expand Down Expand Up @@ -387,7 +388,7 @@ func (o *orm) CountJobProposals(ctx context.Context) (count int64, err error) {
// CountJobProposals counts the number of job proposal records.
func (o *orm) CountJobProposalsByStatus(ctx context.Context) (counts *JobProposalCounts, err error) {
stmt := `
SELECT
SELECT
COUNT(*) filter (where job_proposals.status = 'pending' OR job_proposals.pending_update = TRUE) as pending,
COUNT(*) filter (where job_proposals.status = 'approved' AND job_proposals.pending_update = FALSE) as approved,
COUNT(*) filter (where job_proposals.status = 'rejected' AND job_proposals.pending_update = FALSE) as rejected,
Expand Down Expand Up @@ -878,3 +879,20 @@ SELECT exists (
err = o.ds.GetContext(ctx, &exists, stmt, jobID)
return exists, errors.Wrap(err, "IsJobManaged failed")
}

// IsJobManagedByFeedsManager determines if a job is managed by a specific feeds manager.
func (o *orm) IsJobManagedByFeedsManager(ctx context.Context, jobID int64, feedsManagerID int64) (exists bool, err error) {
stmt := `
SELECT exists (
SELECT 1
FROM job_proposals
INNER JOIN jobs ON job_proposals.external_job_id = jobs.external_job_id
WHERE jobs.id = $1
AND job_proposals.feeds_manager_id = $2
AND job_proposals.status <> 'deleted'
);
`

err = o.ds.GetContext(ctx, &exists, stmt, jobID, feedsManagerID)
return exists, errors.Wrap(err, "IsJobManagedByFeedsManager failed")
}
93 changes: 83 additions & 10 deletions core/services/feeds/orm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -791,8 +791,6 @@ func Test_ORM_CountJobProposalsByStatus(t *testing.T) {
}

for _, tc := range testCases {
tc := tc

t.Run(tc.name, func(t *testing.T) {
orm := setupORM(t)

Expand Down Expand Up @@ -1067,8 +1065,6 @@ func Test_ORM_CancelSpec(t *testing.T) {
}

for _, tc := range testCases {
tc := tc

t.Run(tc.name, func(t *testing.T) {
ctx := testutils.Context(t)
orm := setupORM(t)
Expand Down Expand Up @@ -1229,8 +1225,6 @@ func Test_ORM_DeleteProposal(t *testing.T) {
}

for _, tc := range testCases {
tc := tc

t.Run(tc.name, func(t *testing.T) {
ctx := testutils.Context(t)
orm := setupORM(t)
Expand Down Expand Up @@ -1348,8 +1342,6 @@ func Test_ORM_RevokeSpec(t *testing.T) {
}

for _, tc := range testCases {
tc := tc

t.Run(tc.name, func(t *testing.T) {
ctx := testutils.Context(t)
orm := setupORM(t)
Expand Down Expand Up @@ -1597,8 +1589,6 @@ func Test_ORM_RejectSpec(t *testing.T) {
}

for _, tc := range testCases {
tc := tc

t.Run(tc.name, func(t *testing.T) {
ctx := testutils.Context(t)
orm := setupORM(t)
Expand Down Expand Up @@ -1693,6 +1683,88 @@ func Test_ORM_IsJobManaged(t *testing.T) {
assert.False(t, isManaged)
}

func Test_ORM_IsJobManagedByFeedsManager(t *testing.T) {
t.Parallel()
ctx := testutils.Context(t)

var (
orm = setupORM(t)
fmID1 = createFeedsManager(t, orm)
)

mgr2 := &feeds.FeedsManager{
URI: "http://192.168.0.2",
Name: "Chainlink FMS 2",
PublicKey: crypto.PublicKey([]byte("22222222222222222222222222222222")),
}
fmID2, err := orm.CreateManager(ctx, mgr2)
require.NoError(t, err)

var (
jpID1 = createJobProposal(t, orm, feeds.JobProposalStatusPending, fmID1)
jpID2 = createJobProposal(t, orm, feeds.JobProposalStatusPending, fmID2)
specID1 = createJobSpec(t, orm, jpID1)
specID2 = createJobSpec(t, orm, jpID2)
externalJobID1 = uuid.NullUUID{UUID: uuid.New(), Valid: true}
externalJobID2 = uuid.NullUUID{UUID: uuid.New(), Valid: true}
)

j1 := createJob(t, orm.db, externalJobID1.UUID)
j2 := createJob(t, orm.db, externalJobID2.UUID)

isManaged, err := orm.IsJobManagedByFeedsManager(ctx, int64(j1.ID), fmID1)
require.NoError(t, err)
assert.False(t, isManaged)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j1.ID), fmID2)
require.NoError(t, err)
assert.False(t, isManaged)

err = orm.ApproveSpec(ctx, specID1, externalJobID1.UUID)
require.NoError(t, err)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j1.ID), fmID1)
require.NoError(t, err)
assert.True(t, isManaged)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j1.ID), fmID2)
require.NoError(t, err)
assert.False(t, isManaged)

err = orm.ApproveSpec(ctx, specID2, externalJobID2.UUID)
require.NoError(t, err)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j2.ID), fmID2)
require.NoError(t, err)
assert.True(t, isManaged)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j2.ID), fmID1)
require.NoError(t, err)
assert.False(t, isManaged)

nonExistentJobID := int64(99998)
nonExistentFeedsManagerID := int64(99999)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, nonExistentJobID, fmID1)
require.NoError(t, err)
assert.False(t, isManaged)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j1.ID), nonExistentFeedsManagerID)
require.NoError(t, err)
assert.False(t, isManaged)

err = orm.DeleteProposal(ctx, jpID1)
require.NoError(t, err)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j1.ID), fmID1)
require.NoError(t, err)
assert.False(t, isManaged)

isManaged, err = orm.IsJobManagedByFeedsManager(ctx, int64(j2.ID), fmID2)
require.NoError(t, err)
assert.True(t, isManaged)
}

// Helpers

func assertChainConfigEqual(t *testing.T, want map[string]interface{}, actual feeds.ChainConfig) {
Expand Down Expand Up @@ -1758,6 +1830,7 @@ func createJob(t *testing.T, db *sqlx.DB, externalJobID uuid.UUID) *job.Job {
testspecs.GenerateOCRSpec(testspecs.OCRSpecParams{
JobID: externalJobID.String(),
TransmitterAddress: address.Hex(),
ContractAddress: testutils.NewAddress().Hex(),
DS1BridgeName: bridge.Name.String(),
DS2BridgeName: bridge2.Name.String(),
}).Toml(),
Expand Down
Loading
Loading