Skip to content

Commit e91111e

Browse files
authored
[Backport] Add support for project metadata (treasure-data#1802)
* Merge pull request st-tech#45 from treasure-data/WM-1639 WM-1639: Add DDL for project_metadata table * Merge pull request st-tech#47 from treasure-data/WM-1646-td-digdag WM-1646: Add support for adding project metadata * Merge pull request st-tech#69 from treasure-data/WM-1732 WM-1732: Allow ProjectService to pass AuthencatedResource userInfo
1 parent 47a8690 commit e91111e

File tree

12 files changed

+511
-224
lines changed

12 files changed

+511
-224
lines changed

digdag-client/src/main/java/io/digdag/client/DigdagClient.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,13 @@ public RestProject putProjectRevision(String projName, String revision, File bod
452452
return putProjectRevision(projName, revision, body, scheduleFrom, Collections.emptyList(), Optional.absent());
453453
}
454454

455-
public RestProject putProjectRevision(String projName, String revision, File body, Optional<Instant> scheduleFrom, List<String> clearSchedule, Optional<Boolean> clearAllSchedules )
455+
public RestProject putProjectRevision(
456+
String projName,
457+
String revision,
458+
File body,
459+
Optional<Instant> scheduleFrom,
460+
List<String> clearSchedule,
461+
Optional<Boolean> clearAllSchedules)
456462
throws IOException
457463
{
458464
Preconditions.checkArgument(!Strings.isNullOrEmpty(projName), "projName");

digdag-core/src/main/java/io/digdag/core/database/DatabaseMigrator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class DatabaseMigrator
4242
new Migration_20191105105927_AddIndexToSessions(),
4343
new Migration_20200716114008_AddLastAttemptIdIndexToSessions(),
4444
new Migration_20200803184355_ReplacePartialIndexOnSessionAttempts(),
45+
new Migration_20221021035534_CreateProjectMetadata(),
4546
})
4647
.sorted(Comparator.comparing(m -> m.getVersion()))
4748
.collect(Collectors.toList());

digdag-core/src/main/java/io/digdag/core/database/DatabaseProjectStoreManager.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.digdag.core.repository.Project;
1414
import io.digdag.core.repository.ProjectControlStore;
1515
import io.digdag.core.repository.ProjectMap;
16+
import io.digdag.core.repository.ProjectMetadataMap;
1617
import io.digdag.core.repository.ProjectStore;
1718
import io.digdag.core.repository.ProjectStoreManager;
1819
import io.digdag.core.repository.ResourceConflictException;
@@ -48,6 +49,7 @@
4849
import java.sql.SQLException;
4950
import java.time.Instant;
5051
import java.time.ZoneId;
52+
import java.util.Collection;
5153
import java.util.HashMap;
5254
import java.util.List;
5355
import java.util.Map;
@@ -477,6 +479,30 @@ public void insertRevisionArchiveData(int revId, byte[] data)
477479
"revision archive=%d", revId);
478480
}
479481

482+
@DigdagTimed(value = "dpcst_", category = "db", appendMethodName = true)
483+
@Override
484+
public void insertProjectMetadata(int projId, int siteId, ProjectMetadataMap metadataMap)
485+
throws ResourceConflictException
486+
{
487+
for (Map.Entry<String, Collection<String>> entry : metadataMap.toMap().entrySet()) {
488+
String k = entry.getKey();
489+
for (String v : entry.getValue()) {
490+
catchConflict(() -> {
491+
dao.insertProjectMetadata(siteId, projId, k, v);
492+
return true;
493+
},
494+
"metadata(key=%s, value=%s) in project id=%d", k, v, projId);
495+
}
496+
}
497+
}
498+
499+
@DigdagTimed(value = "dpcst_", category = "db", appendMethodName = true)
500+
@Override
501+
public void deleteProjectMetadata(int projId)
502+
{
503+
dao.deleteProjectMetadata(projId);
504+
}
505+
480506
/**
481507
* Create a revision.
482508
*
@@ -942,6 +968,18 @@ List<StoredWorkflowDefinition> getWorkflowDefinitions(
942968
" values (:revId, :data)")
943969
void insertRevisionArchiveData(@Bind("revId") int revId, @Bind("data") byte[] data);
944970

971+
@SqlUpdate("delete from project_metadata where project_id = :projId")
972+
void deleteProjectMetadata(@Bind("projId") int projId);
973+
974+
@SqlUpdate("insert into project_metadata" +
975+
" (site_id, project_id, key, value, created_at)" +
976+
" values (:siteId, :projId, :key, :value, now())")
977+
void insertProjectMetadata(
978+
@Bind("siteId") int siteId,
979+
@Bind("projId") int projId,
980+
@Bind("key") String key,
981+
@Bind("value") String value);
982+
945983
@SqlUpdate("insert into workflow_definitions" +
946984
" (revision_id, name, config_id)" +
947985
" values (:revId, :name, :configId)")
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.digdag.core.database.migrate;
2+
3+
import org.skife.jdbi.v2.Handle;
4+
5+
public class Migration_20221021035534_CreateProjectMetadata
6+
implements Migration
7+
{
8+
@Override
9+
public void migrate(Handle handle, MigrationContext context)
10+
{
11+
handle.update(
12+
context.newCreateTableBuilder("project_metadata")
13+
.addIntId("id")
14+
.addInt("site_id", "not null")
15+
.addInt("project_id", "not null references projects (id)")
16+
.addString("key", "not null")
17+
.addString("value", "not null")
18+
.addTimestamp("created_at", "not null")
19+
.build());
20+
21+
handle.update("create unique index project_metadata_on_key_and_value_and_project_id_and_site_id on project_metadata(key, value, project_id, site_id)");
22+
handle.update("create index project_metadata_on_site_id_and_key_and_value on project_metadata(site_id, key, value)");
23+
handle.update("create index project_metadata_on_project_id_and_site_id_and_key on project_metadata(project_id, site_id, key)");
24+
}
25+
}

digdag-core/src/main/java/io/digdag/core/repository/ProjectControl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public static <T> T deleteProject(ProjectStore rs, int projId, DeleteProjectActi
3636
ProjectControl control = new ProjectControl(store, proj);
3737
T res = callback.call(control, proj);
3838
control.deleteSchedules();
39+
control.deleteProjectMetadata();
3940
return res;
4041
});
4142
}
@@ -66,6 +67,17 @@ public void insertRevisionArchiveData(int revId, byte[] data)
6667
store.insertRevisionArchiveData(revId, data);
6768
}
6869

70+
public void insertProjectMetadata(ProjectMetadataMap projectMetadataMap)
71+
throws ResourceConflictException
72+
{
73+
store.insertProjectMetadata(project.getId(), project.getSiteId(), projectMetadataMap);
74+
}
75+
76+
public void deleteProjectMetadata()
77+
{
78+
store.deleteProjectMetadata(project.getId());
79+
}
80+
6981
public List<StoredWorkflowDefinition> insertWorkflowDefinitions(
7082
StoredRevision revision, List<WorkflowDefinition> defs,
7183
SchedulerManager srm, Instant currentTime)

digdag-core/src/main/java/io/digdag/core/repository/ProjectControlStore.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import java.util.List;
44
import java.time.ZoneId;
5-
import java.time.Instant;
6-
import com.google.common.base.Optional;
5+
76
import io.digdag.core.schedule.Schedule;
87
import io.digdag.core.schedule.ScheduleStatus;
98
import io.digdag.spi.ScheduleTime;
@@ -16,6 +15,11 @@ StoredRevision insertRevision(int projId, Revision revision)
1615
void insertRevisionArchiveData(int revId, byte[] data)
1716
throws ResourceConflictException;
1817

18+
void insertProjectMetadata(int projId, int siteId, ProjectMetadataMap metadataMap)
19+
throws ResourceConflictException;
20+
21+
void deleteProjectMetadata(int projId);
22+
1923
StoredWorkflowDefinition insertWorkflowDefinition(int projId, int revId, WorkflowDefinition workflow, ZoneId workflowTimeZone)
2024
throws ResourceConflictException;
2125

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.digdag.core.repository;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableMap;
5+
import com.google.common.collect.LinkedHashMultimap;
6+
7+
import java.util.Collection;
8+
import java.util.List;
9+
10+
public class ProjectMetadataMap
11+
{
12+
private final LinkedHashMultimap<String, String> map;
13+
14+
public ProjectMetadataMap(List<String> keyValueList)
15+
{
16+
LinkedHashMultimap<String, String> metadata = LinkedHashMultimap.create();
17+
for (String keyValue : keyValueList) {
18+
// format should be `key:value`
19+
String[] kv = keyValue.split(":");
20+
if (kv.length != 2) {
21+
throw new IllegalArgumentException("Invalid project metadata format: " + keyValue);
22+
}
23+
metadata.put(kv[0], kv[1]);
24+
}
25+
this.map = metadata;
26+
}
27+
28+
public ImmutableMap<String, Collection<String>> toMap()
29+
{
30+
return ImmutableMap.copyOf(map.asMap());
31+
}
32+
33+
public List<String> getKeys()
34+
{
35+
return ImmutableList.copyOf(map.keySet());
36+
}
37+
}

digdag-server/src/main/java/io/digdag/server/ServerModule.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.digdag.server.rs.VersionResource;
3232
import io.digdag.server.rs.WorkflowResource;
3333
import io.digdag.server.rs.project.PutProjectsValidator;
34+
import io.digdag.server.service.ProjectService;
3435
import io.digdag.server.service.WorkflowService;
3536
import io.digdag.spi.AuthenticatedUser;
3637
import io.digdag.spi.Authenticator;
@@ -103,6 +104,7 @@ protected void bindSecrets()
103104
protected void bindResources(ApplicationBindingBuilder builder)
104105
{
105106
binder().bind(WorkflowService.class).in(Scopes.SINGLETON);
107+
binder().bind(ProjectService.class).in(Scopes.SINGLETON);
106108
builder.addResources(
107109
ProjectResource.class,
108110
WorkflowResource.class,

0 commit comments

Comments
 (0)