Skip to content

Commit c194e35

Browse files
ryanulitalkalescentc-r33d
authored
feat(policy): obligations + values CRUD (#2545)
### Proposed Changes adds sqlc queries for obligation_definitions CRUD + DB client methods and integration tests ### Checklist - [ ] I have added or updated unit tests - [ ] I have added or updated integration tests (if appropriate) - [ ] I have added or updated documentation ### Testing Instructions --------- Co-authored-by: Krish Suchak <suchak.krish@gmail.com> Co-authored-by: Chris Reed <creed@virtru.com>
1 parent bc0a627 commit c194e35

File tree

20 files changed

+3697
-371
lines changed

20 files changed

+3697
-371
lines changed

docs/grpc/index.html

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/openapi/policy/objects.openapi.yaml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/openapi/policy/obligations/obligations.openapi.yaml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

protocol/go/policy/objects.pb.go

Lines changed: 209 additions & 196 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/codegen/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ var clientsToGenerateList = []runner.ClientsToGenerate{
5050
GrpcClientInterface: "NamespaceServiceClient",
5151
GrpcPackagePath: "github.com/opentdf/platform/protocol/go/policy/namespaces",
5252
},
53+
{
54+
GrpcClientInterface: "ServiceClient",
55+
GrpcPackagePath: "github.com/opentdf/platform/protocol/go/policy/obligations",
56+
},
5357
{
5458
GrpcClientInterface: "RegisteredResourcesServiceClient",
5559
GrpcPackagePath: "github.com/opentdf/platform/protocol/go/policy/registeredresources",

sdk/codegen/runner/generate.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"path"
99
"path/filepath"
1010

11+
"golang.org/x/text/cases"
12+
"golang.org/x/text/language"
1113
"golang.org/x/tools/go/packages"
1214
)
1315

@@ -61,7 +63,14 @@ func Generate(clientsToGenerateList []ClientsToGenerate, outputDir string) error
6163
if client.PackageNameOverride != "" {
6264
packageName = client.PackageNameOverride
6365
}
64-
code := generateWrapper(ts.Name.Name, iface, client.GrpcPackagePath, packageName, client.Suffix)
66+
// In order to counter package name fatigue (policy.attributes.AttributesService),
67+
// newer services are simply named "Service" (policy.obligations.Service).
68+
// This prefix logic is necessary for newer services.
69+
prefix := ""
70+
if ts.Name.Name == "ServiceClient" {
71+
prefix = cases.Title(language.English).String(packageName)
72+
}
73+
code := generateWrapper(ts.Name.Name, iface, client.GrpcPackagePath, packageName, prefix, client.Suffix)
6574
outputPath := filepath.Join(outputDir, packageName+".go")
6675
err = os.WriteFile(outputPath, []byte(code), 0o644) //nolint:gosec // ignore G306
6776
if err != nil {
@@ -105,13 +114,13 @@ func getMethodNames(interfaceType *ast.InterfaceType) []string {
105114
}
106115

107116
// Generate wrapper code for the Connect RPC client interface
108-
func generateWrapper(interfaceName string, interfaceType *ast.InterfaceType, packagePath string, packageName string, suffix string) string {
117+
func generateWrapper(interfaceName string, interfaceType *ast.InterfaceType, packagePath, packageName, prefix, suffix string) string {
109118
// Get method names dynamically from the interface
110119
methods := getMethodNames(interfaceType)
111120
connectPackageName := packageName + "connect"
112121

113122
// Start generating the wrapper code
114-
wrapperCode := fmt.Sprintf(`// Wrapper for %s (generated code) DO NOT EDIT
123+
wrapperCode := fmt.Sprintf(`// Wrapper for %s%s (generated code) DO NOT EDIT
115124
package sdkconnect
116125
117126
import (
@@ -121,47 +130,52 @@ import (
121130
"%s"
122131
)
123132
124-
type %s%sConnectWrapper struct {
133+
type %s%s%sConnectWrapper struct {
125134
%s.%s
126135
}
127136
128-
func New%s%sConnectWrapper(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) *%s%sConnectWrapper {
129-
return &%s%sConnectWrapper{%s: %s.New%s(httpClient, baseURL, opts...)}
137+
func New%s%s%sConnectWrapper(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) *%s%s%sConnectWrapper {
138+
return &%s%s%sConnectWrapper{%s: %s.New%s(httpClient, baseURL, opts...)}
130139
}
131140
`,
141+
prefix,
132142
interfaceName,
133143
packagePath,
134144
packagePath+"/"+connectPackageName,
145+
prefix,
135146
interfaceName,
136147
suffix,
137148
connectPackageName,
138149
interfaceName,
150+
prefix,
139151
interfaceName,
140152
suffix,
153+
prefix,
141154
interfaceName,
142155
suffix,
156+
prefix,
143157
interfaceName,
144158
suffix,
145159
interfaceName,
146160
connectPackageName,
147161
interfaceName)
148162

149163
// Generate the interface type definition
150-
wrapperCode += generateInterfaceType(interfaceName, methods, packageName, suffix)
164+
wrapperCode += generateInterfaceType(interfaceName, methods, packageName, prefix, suffix)
151165
// Now generate a wrapper function for each method in the interface
152166
for _, method := range methods {
153-
wrapperCode += generateWrapperMethod(interfaceName, method, packageName, suffix)
167+
wrapperCode += generateWrapperMethod(interfaceName, method, packageName, prefix, suffix)
154168
}
155169

156170
// Output the generated wrapper code
157171
return wrapperCode
158172
}
159173

160-
func generateInterfaceType(interfaceName string, methods []string, packageName string, suffix string) string {
174+
func generateInterfaceType(interfaceName string, methods []string, packageName, prefix, suffix string) string {
161175
// Generate the interface type definition
162176
interfaceType := fmt.Sprintf(`
163-
type %s%s interface {
164-
`, interfaceName, suffix)
177+
type %s%s%s interface {
178+
`, prefix, interfaceName, suffix)
165179
for _, method := range methods {
166180
interfaceType += fmt.Sprintf(` %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error)
167181
`, method, packageName, method, packageName, method)
@@ -171,15 +185,15 @@ type %s%s interface {
171185
}
172186

173187
// Generate the wrapper method for a specific method in the interface
174-
func generateWrapperMethod(interfaceName, methodName, packageName string, suffix string) string {
188+
func generateWrapperMethod(interfaceName, methodName, packageName, prefix, suffix string) string {
175189
return fmt.Sprintf(`
176-
func (w *%s%sConnectWrapper) %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error) {
190+
func (w *%s%s%sConnectWrapper) %s(ctx context.Context, req *%s.%sRequest) (*%s.%sResponse, error) {
177191
// Wrap Connect RPC client request
178192
res, err := w.%s.%s(ctx, connect.NewRequest(req))
179193
if res == nil {
180194
return nil, err
181195
}
182196
return res.Msg, err
183197
}
184-
`, interfaceName, suffix, methodName, packageName, methodName, packageName, methodName, interfaceName, methodName)
198+
`, prefix, interfaceName, suffix, methodName, packageName, methodName, packageName, methodName, interfaceName, methodName)
185199
}

sdk/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ require (
1818
github.com/testcontainers/testcontainers-go v0.37.0
1919
github.com/xeipuuv/gojsonschema v1.2.0
2020
golang.org/x/oauth2 v0.30.0
21+
golang.org/x/text v0.26.0
2122
golang.org/x/tools v0.34.0
2223
google.golang.org/grpc v1.73.0
2324
google.golang.org/protobuf v1.36.6
@@ -94,7 +95,6 @@ require (
9495
golang.org/x/net v0.41.0 // indirect
9596
golang.org/x/sync v0.15.0 // indirect
9697
golang.org/x/sys v0.33.0 // indirect
97-
golang.org/x/text v0.26.0 // indirect
9898
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
9999
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
100100
gopkg.in/yaml.v3 v3.0.1 // indirect

sdk/sdk.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ type SDK struct {
6363
EntityResolutionV2 sdkconnect.EntityResolutionServiceClientV2
6464
KeyAccessServerRegistry sdkconnect.KeyAccessServerRegistryServiceClient
6565
Namespaces sdkconnect.NamespaceServiceClient
66+
Obligations sdkconnect.ObligationsServiceClient
6667
RegisteredResources sdkconnect.RegisteredResourcesServiceClient
6768
ResourceMapping sdkconnect.ResourceMappingServiceClient
6869
SubjectMapping sdkconnect.SubjectMappingServiceClient
@@ -188,6 +189,7 @@ func New(platformEndpoint string, opts ...Option) (*SDK, error) {
188189
Actions: sdkconnect.NewActionServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),
189190
Attributes: sdkconnect.NewAttributesServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),
190191
Namespaces: sdkconnect.NewNamespaceServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),
192+
Obligations: sdkconnect.NewObligationsServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),
191193
RegisteredResources: sdkconnect.NewRegisteredResourcesServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),
192194
ResourceMapping: sdkconnect.NewResourceMappingServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),
193195
SubjectMapping: sdkconnect.NewSubjectMappingServiceClientConnectWrapper(platformConn.Client, platformConn.Endpoint, platformConn.Options...),

sdk/sdkconnect/obligations.go

Lines changed: 150 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)