Skip to content

Commit 07c5f1d

Browse files
authored
feat(api): manage poetry project metadata (#7455)
1 parent 67bd98d commit 07c5f1d

File tree

3 files changed

+180
-2
lines changed

3 files changed

+180
-2
lines changed

engine/api/v2_workflow_run_craft.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1282,7 +1282,10 @@ func getCDSversion(ctx context.Context, db gorp.SqlExecutor, vcsClient sdk.VCSAu
12821282
if err := toml.Unmarshal([]byte(fileContent), &file); err != nil {
12831283
return nil, false, sdk.NewErrorFrom(sdk.ErrWrongRequest, "unable to read poetry file: %v", err)
12841284
}
1285-
fileVersion = file.Tool.Poetry.Version
1285+
fileVersion = file.Project.Version
1286+
if fileVersion == "" {
1287+
fileVersion = file.Tool.Poetry.Version
1288+
}
12861289
case sdk.SemverTypeDebian:
12871290
firsLine := strings.Split(fileContent, "\n")[0]
12881291
r, _ := regexp.Compile(`.*\((.*)\).*`) // format: package (version) distribution; urgency=low

engine/api/v2_workflow_run_craft_test.go

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,6 +1485,177 @@ func TestCraftWorkflowRunCustomVersion_File(t *testing.T) {
14851485
require.Equal(t, "6.6.6-1.sha.g"+wrDB.Contexts.Git.ShaShort, wrDB.Contexts.CDS.Version)
14861486
}
14871487

1488+
func TestCraftWorkflowRunCustomVersion_PoetryProject(t *testing.T) {
1489+
api, db, _ := newTestAPI(t)
1490+
ctx := context.TODO()
1491+
1492+
db.Exec("DELETE FROM rbac")
1493+
db.Exec("DELETE FROM region")
1494+
1495+
reg := sdk.Region{Name: "build"}
1496+
require.NoError(t, region.Insert(ctx, db, &reg))
1497+
1498+
proj := assets.InsertTestProject(t, db, api.Cache, sdk.RandomString(10), sdk.RandomString(10))
1499+
admin, _ := assets.InsertAdminUser(t, db)
1500+
assets.InsertRBAcProject(t, db, sdk.ProjectRoleRead, proj.Key, *admin)
1501+
1502+
vcsProject := assets.InsertTestVCSProject(t, db, proj.ID, "bitbucketserver", "bitbucketserver")
1503+
repo := assets.InsertTestProjectRepository(t, db, proj.Key, vcsProject.ID, "my/repo")
1504+
1505+
wkName := sdk.RandomString(10)
1506+
wr := sdk.V2WorkflowRun{
1507+
DeprecatedUserID: admin.ID,
1508+
ProjectKey: proj.Key,
1509+
Status: sdk.V2WorkflowRunStatusCrafting,
1510+
VCSServerID: vcsProject.ID,
1511+
RepositoryID: repo.ID,
1512+
RunNumber: 1,
1513+
RunAttempt: 0,
1514+
WorkflowRef: "refs/heads/master",
1515+
WorkflowSha: "123456789",
1516+
WorkflowName: wkName,
1517+
WorkflowData: sdk.V2WorkflowRunData{
1518+
Workflow: sdk.V2Workflow{
1519+
Name: wkName,
1520+
Semver: &sdk.WorkflowSemver{
1521+
From: "poetry",
1522+
Path: "pyproject.toml",
1523+
ReleaseRefs: []string{"refs/heads/mai*"},
1524+
},
1525+
Jobs: map[string]sdk.V2Job{
1526+
"job1": {
1527+
Name: "My super job",
1528+
If: "cds.workflow == 'toto'",
1529+
Region: "build",
1530+
RunsOn: sdk.V2JobRunsOn{
1531+
Model: "myworker-model",
1532+
},
1533+
Steps: []sdk.ActionStep{
1534+
{
1535+
Run: "echo toto",
1536+
},
1537+
},
1538+
},
1539+
},
1540+
},
1541+
},
1542+
RunEvent: sdk.V2WorkflowRunEvent{
1543+
HookType: sdk.WorkflowHookTypeRepository,
1544+
Payload: nil,
1545+
Ref: "refs/heads/main",
1546+
Sha: "123456789",
1547+
EventName: sdk.WorkflowHookEventNamePush,
1548+
},
1549+
}
1550+
require.NoError(t, workflow_v2.InsertRun(ctx, db, &wr))
1551+
1552+
myWMEnt := sdk.Entity{
1553+
ProjectKey: proj.Key,
1554+
ProjectRepositoryID: repo.ID,
1555+
Type: sdk.EntityTypeWorkerModel,
1556+
FilePath: ".cds/worker-models/myworker-model.yml",
1557+
Name: "myworker-model",
1558+
Ref: "refs/heads/master",
1559+
Commit: "123456789",
1560+
LastUpdate: time.Time{},
1561+
Data: "name: myworkermodel",
1562+
}
1563+
require.NoError(t, entity.Insert(ctx, db, &myWMEnt))
1564+
1565+
// Mock VCS
1566+
s, _ := assets.InsertService(t, db, t.Name()+"_VCS", sdk.TypeVCS)
1567+
// Setup a mock for all services called by the API
1568+
ctrl := gomock.NewController(t)
1569+
defer ctrl.Finish()
1570+
servicesClients := mock_services.NewMockClient(ctrl)
1571+
services.NewClient = func(_ []sdk.Service) services.Client {
1572+
return servicesClients
1573+
}
1574+
defer func() {
1575+
_ = services.Delete(db, s)
1576+
services.NewClient = services.NewDefaultClient
1577+
}()
1578+
1579+
servicesClients.EXPECT().
1580+
DoJSONRequest(gomock.Any(), "GET", "/vcs/bitbucketserver/repos/my/repo/content/pyproject.toml?commit=123456789", gomock.Any(), gomock.Any(), gomock.Any()).
1581+
DoAndReturn(func(ctx context.Context, method, path string, in interface{}, out interface{}, _ interface{}) (http.Header, int, error) {
1582+
b := &sdk.VCSContent{
1583+
IsFile: true,
1584+
Content: `[tool.poetry]
1585+
name = "poetry"
1586+
version = "2.0.0"
1587+
description = "Python dependency management and packaging made easy."
1588+
authors = []
1589+
maintainers = []
1590+
license = "MIT"
1591+
readme = "README.md"
1592+
[project]
1593+
name = "my-awesome-package"
1594+
version = "0.1.0"
1595+
description = "A short description"
1596+
authors = ["Jane Doe <[email protected]>"]
1597+
dependencies = [
1598+
"requests >=2.25.1",
1599+
]`,
1600+
}
1601+
*(out.(*sdk.VCSContent)) = *b
1602+
return nil, 200, nil
1603+
}).Times(2)
1604+
1605+
servicesClients.EXPECT().
1606+
DoJSONRequest(gomock.Any(), "GET", "/vcs/bitbucketserver/repos/my/repo", gomock.Any(), gomock.Any(), gomock.Any()).
1607+
DoAndReturn(
1608+
func(ctx context.Context, method, path string, in interface{}, out interface{}, _ interface{}) (http.Header, int, error) {
1609+
b := &sdk.VCSRepo{}
1610+
*(out.(*sdk.VCSRepo)) = *b
1611+
return nil, 200, nil
1612+
},
1613+
).Times(2)
1614+
1615+
// Create hatchery
1616+
hatch := sdk.Hatchery{Name: sdk.RandomString(10), ModelType: ""}
1617+
require.NoError(t, hatchery.Insert(ctx, db, &hatch))
1618+
1619+
require.NoError(t, rbac.Insert(ctx, db, &sdk.RBAC{
1620+
Name: sdk.RandomString(10),
1621+
Hatcheries: []sdk.RBACHatchery{
1622+
{
1623+
RegionID: reg.ID,
1624+
HatcheryID: hatch.ID,
1625+
Role: sdk.HatcheryRoleSpawn,
1626+
},
1627+
},
1628+
}))
1629+
1630+
require.NoError(t, api.craftWorkflowRunV2(ctx, wr.ID))
1631+
1632+
wrDB, err := workflow_v2.LoadRunByID(ctx, db, wr.ID)
1633+
require.NoError(t, err)
1634+
assert.Equal(t, wrDB.Status, sdk.V2WorkflowRunStatusBuilding)
1635+
wrInfos, err := workflow_v2.LoadRunInfosByRunID(ctx, db, wr.ID)
1636+
require.NoError(t, err)
1637+
require.Equal(t, 0, len(wrInfos), "Error found: %v", wrInfos)
1638+
1639+
require.Equal(t, "0.1.0", wrDB.Contexts.CDS.Version)
1640+
1641+
version, err := workflow_v2.LoadWorkflowVersion(ctx, db, wrDB.Contexts.CDS.ProjectKey, wrDB.Contexts.CDS.WorkflowVCSServer, wrDB.Contexts.CDS.WorkflowRepository, wrDB.Contexts.CDS.Workflow, "0.1.0")
1642+
require.NoError(t, err)
1643+
1644+
require.NotNil(t, version)
1645+
1646+
// Update the run and craft it again
1647+
wrDB.Status = sdk.V2WorkflowRunStatusCrafting
1648+
require.NoError(t, workflow_v2.UpdateRun(ctx, db, wrDB))
1649+
require.NoError(t, api.craftWorkflowRunV2(ctx, wrDB.ID))
1650+
1651+
wrDB, err = workflow_v2.LoadRunByID(ctx, db, wr.ID)
1652+
require.NoError(t, err)
1653+
versions, err := workflow_v2.LoadAllVerionsByWorkflow(ctx, db, wrDB.Contexts.CDS.ProjectKey, wrDB.Contexts.CDS.WorkflowVCSServer, wrDB.Contexts.CDS.WorkflowRepository, wrDB.Contexts.CDS.Workflow)
1654+
require.NoError(t, err)
1655+
require.Equal(t, 1, len(versions))
1656+
require.Equal(t, "0.1.0-1.sha.g"+wrDB.Contexts.Git.ShaShort, wrDB.Contexts.CDS.Version)
1657+
}
1658+
14881659
func TestCraftWorkflowRunCustomVersion_Poetry(t *testing.T) {
14891660
api, db, _ := newTestAPI(t)
14901661
ctx := context.TODO()

sdk/v2_workflow_semver.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ type SemverNpmYarnPackage struct {
1717
}
1818

1919
type SemverPoetry struct {
20-
Tool SemverPoetryTool `toml:"tool"`
20+
Project SemverPoetryProject `toml:"project"`
21+
Tool SemverPoetryTool `toml:"tool"`
22+
}
23+
type SemverPoetryProject struct {
24+
Version string `toml:"version"`
2125
}
2226
type SemverPoetryTool struct {
2327
Poetry SemverPoetryToolPoetry `toml:"poetry"`

0 commit comments

Comments
 (0)