mirror of https://github.com/grafana/grafana
Secrets: Add v1beta1 schema with CUE + grafana-app-sdk (#107972)
* Secrets: Add v1beta1 API using CUE * Secrets: Generate spec with app-sdk * Secrets: Generate decrypt proto * Secrets: Add manual files to help transitionpull/108019/head
parent
c238016532
commit
c9b2126c4a
@ -0,0 +1,29 @@ |
||||
APP_SDK_VERSION := v0.39.2
|
||||
APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
|
||||
APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
|
||||
|
||||
.PHONY: install-app-sdk |
||||
install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
|
||||
|
||||
$(APP_SDK_BIN): |
||||
@echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
|
||||
@mkdir -p $(APP_SDK_DIR)
|
||||
# The only way to install specific versions of binaries using `go install`
|
||||
# is by setting GOBIN to the directory you want to install the binary to.
|
||||
GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
|
||||
@touch $@
|
||||
|
||||
.PHONY: update-app-sdk |
||||
update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
|
||||
go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
|
||||
go mod tidy
|
||||
|
||||
.PHONY: generate |
||||
generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
|
||||
@$(APP_SDK_BIN) generate \
|
||||
--source=./kinds/ \
|
||||
--gogenpath=./pkg/apis \
|
||||
--grouping=group \
|
||||
--defencoding=none \
|
||||
--noschemasinmanifest \
|
||||
--postprocess
|
@ -0,0 +1,12 @@ |
||||
version: v1 |
||||
|
||||
plugins: |
||||
- plugin: go |
||||
out: apps/secret/decrypt/v1beta1 |
||||
opt: |
||||
- paths=source_relative |
||||
- plugin: go-grpc |
||||
out: apps/secret/decrypt/v1beta1 |
||||
opt: |
||||
- paths=source_relative |
||||
- require_unimplemented_servers=false |
@ -0,0 +1,7 @@ |
||||
version: v1 |
||||
breaking: |
||||
use: |
||||
- FILE |
||||
lint: |
||||
use: |
||||
- DEFAULT |
@ -0,0 +1,311 @@ |
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.5
|
||||
// protoc (unknown)
|
||||
// source: decrypt.proto
|
||||
|
||||
package decryptv1beta1 |
||||
|
||||
import ( |
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect" |
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl" |
||||
reflect "reflect" |
||||
sync "sync" |
||||
unsafe "unsafe" |
||||
) |
||||
|
||||
const ( |
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) |
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) |
||||
) |
||||
|
||||
type SecureValueDecryptRequest struct { |
||||
state protoimpl.MessageState `protogen:"open.v1"` |
||||
// The stack_id or org_id.
|
||||
Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` |
||||
// A list of secure value names to decrypt.
|
||||
Names []string `protobuf:"bytes,2,rep,name=names,proto3" json:"names,omitempty"` |
||||
unknownFields protoimpl.UnknownFields |
||||
sizeCache protoimpl.SizeCache |
||||
} |
||||
|
||||
func (x *SecureValueDecryptRequest) Reset() { |
||||
*x = SecureValueDecryptRequest{} |
||||
mi := &file_decrypt_proto_msgTypes[0] |
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
||||
ms.StoreMessageInfo(mi) |
||||
} |
||||
|
||||
func (x *SecureValueDecryptRequest) String() string { |
||||
return protoimpl.X.MessageStringOf(x) |
||||
} |
||||
|
||||
func (*SecureValueDecryptRequest) ProtoMessage() {} |
||||
|
||||
func (x *SecureValueDecryptRequest) ProtoReflect() protoreflect.Message { |
||||
mi := &file_decrypt_proto_msgTypes[0] |
||||
if x != nil { |
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
||||
if ms.LoadMessageInfo() == nil { |
||||
ms.StoreMessageInfo(mi) |
||||
} |
||||
return ms |
||||
} |
||||
return mi.MessageOf(x) |
||||
} |
||||
|
||||
// Deprecated: Use SecureValueDecryptRequest.ProtoReflect.Descriptor instead.
|
||||
func (*SecureValueDecryptRequest) Descriptor() ([]byte, []int) { |
||||
return file_decrypt_proto_rawDescGZIP(), []int{0} |
||||
} |
||||
|
||||
func (x *SecureValueDecryptRequest) GetNamespace() string { |
||||
if x != nil { |
||||
return x.Namespace |
||||
} |
||||
return "" |
||||
} |
||||
|
||||
func (x *SecureValueDecryptRequest) GetNames() []string { |
||||
if x != nil { |
||||
return x.Names |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
type SecureValueDecryptResponseCollection struct { |
||||
state protoimpl.MessageState `protogen:"open.v1"` |
||||
// A map of secure value names and their decrypted values.
|
||||
// The value will be an error message if the requestor does not have permissions to read it, or if the value does not exist.
|
||||
// It will never return a 404 Not Found to avoid scanning of valid secure values.
|
||||
DecryptedValues map[string]*Result `protobuf:"bytes,1,rep,name=decrypted_values,json=decryptedValues,proto3" json:"decrypted_values,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` |
||||
unknownFields protoimpl.UnknownFields |
||||
sizeCache protoimpl.SizeCache |
||||
} |
||||
|
||||
func (x *SecureValueDecryptResponseCollection) Reset() { |
||||
*x = SecureValueDecryptResponseCollection{} |
||||
mi := &file_decrypt_proto_msgTypes[1] |
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
||||
ms.StoreMessageInfo(mi) |
||||
} |
||||
|
||||
func (x *SecureValueDecryptResponseCollection) String() string { |
||||
return protoimpl.X.MessageStringOf(x) |
||||
} |
||||
|
||||
func (*SecureValueDecryptResponseCollection) ProtoMessage() {} |
||||
|
||||
func (x *SecureValueDecryptResponseCollection) ProtoReflect() protoreflect.Message { |
||||
mi := &file_decrypt_proto_msgTypes[1] |
||||
if x != nil { |
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
||||
if ms.LoadMessageInfo() == nil { |
||||
ms.StoreMessageInfo(mi) |
||||
} |
||||
return ms |
||||
} |
||||
return mi.MessageOf(x) |
||||
} |
||||
|
||||
// Deprecated: Use SecureValueDecryptResponseCollection.ProtoReflect.Descriptor instead.
|
||||
func (*SecureValueDecryptResponseCollection) Descriptor() ([]byte, []int) { |
||||
return file_decrypt_proto_rawDescGZIP(), []int{1} |
||||
} |
||||
|
||||
func (x *SecureValueDecryptResponseCollection) GetDecryptedValues() map[string]*Result { |
||||
if x != nil { |
||||
return x.DecryptedValues |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
type Result struct { |
||||
state protoimpl.MessageState `protogen:"open.v1"` |
||||
// Types that are valid to be assigned to Result:
|
||||
//
|
||||
// *Result_Value
|
||||
// *Result_ErrorMessage
|
||||
Result isResult_Result `protobuf_oneof:"result"` |
||||
unknownFields protoimpl.UnknownFields |
||||
sizeCache protoimpl.SizeCache |
||||
} |
||||
|
||||
func (x *Result) Reset() { |
||||
*x = Result{} |
||||
mi := &file_decrypt_proto_msgTypes[2] |
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
||||
ms.StoreMessageInfo(mi) |
||||
} |
||||
|
||||
func (x *Result) String() string { |
||||
return protoimpl.X.MessageStringOf(x) |
||||
} |
||||
|
||||
func (*Result) ProtoMessage() {} |
||||
|
||||
func (x *Result) ProtoReflect() protoreflect.Message { |
||||
mi := &file_decrypt_proto_msgTypes[2] |
||||
if x != nil { |
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
||||
if ms.LoadMessageInfo() == nil { |
||||
ms.StoreMessageInfo(mi) |
||||
} |
||||
return ms |
||||
} |
||||
return mi.MessageOf(x) |
||||
} |
||||
|
||||
// Deprecated: Use Result.ProtoReflect.Descriptor instead.
|
||||
func (*Result) Descriptor() ([]byte, []int) { |
||||
return file_decrypt_proto_rawDescGZIP(), []int{2} |
||||
} |
||||
|
||||
func (x *Result) GetResult() isResult_Result { |
||||
if x != nil { |
||||
return x.Result |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func (x *Result) GetValue() string { |
||||
if x != nil { |
||||
if x, ok := x.Result.(*Result_Value); ok { |
||||
return x.Value |
||||
} |
||||
} |
||||
return "" |
||||
} |
||||
|
||||
func (x *Result) GetErrorMessage() string { |
||||
if x != nil { |
||||
if x, ok := x.Result.(*Result_ErrorMessage); ok { |
||||
return x.ErrorMessage |
||||
} |
||||
} |
||||
return "" |
||||
} |
||||
|
||||
type isResult_Result interface { |
||||
isResult_Result() |
||||
} |
||||
|
||||
type Result_Value struct { |
||||
Value string `protobuf:"bytes,1,opt,name=value,proto3,oneof"` |
||||
} |
||||
|
||||
type Result_ErrorMessage struct { |
||||
ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3,oneof"` |
||||
} |
||||
|
||||
func (*Result_Value) isResult_Result() {} |
||||
|
||||
func (*Result_ErrorMessage) isResult_Result() {} |
||||
|
||||
var File_decrypt_proto protoreflect.FileDescriptor |
||||
|
||||
var file_decrypt_proto_rawDesc = string([]byte{ |
||||
0x0a, 0x0d, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, |
||||
0x0e, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x22, |
||||
0x4f, 0x0a, 0x19, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, |
||||
0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, |
||||
0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, |
||||
0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, |
||||
0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, |
||||
0x22, 0xf8, 0x01, 0x0a, 0x24, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, |
||||
0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, |
||||
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x10, 0x64, 0x65, 0x63, |
||||
0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, |
||||
0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x76, 0x31, 0x62, |
||||
0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, |
||||
0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, |
||||
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, |
||||
0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, |
||||
0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, |
||||
0x5a, 0x0a, 0x14, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, |
||||
0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, |
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, |
||||
0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x64, 0x65, 0x63, 0x72, 0x79, |
||||
0x70, 0x74, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, |
||||
0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x06, 0x52, |
||||
0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, |
||||
0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, |
||||
0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, |
||||
0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, |
||||
0x73, 0x61, 0x67, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x32, 0x8e, |
||||
0x01, 0x0a, 0x14, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, |
||||
0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x72, 0x12, 0x76, 0x0a, 0x13, 0x44, 0x65, 0x63, 0x72, 0x79, |
||||
0x70, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x29, |
||||
0x2e, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, |
||||
0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, |
||||
0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x65, 0x63, 0x72, |
||||
0x79, 0x70, 0x74, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, |
||||
0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x52, 0x65, 0x73, |
||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, |
||||
0x47, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, |
||||
0x61, 0x66, 0x61, 0x6e, 0x61, 0x2f, 0x67, 0x72, 0x61, 0x66, 0x61, 0x6e, 0x61, 0x2f, 0x61, 0x70, |
||||
0x70, 0x73, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, |
||||
0x74, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, |
||||
0x74, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |
||||
}) |
||||
|
||||
var ( |
||||
file_decrypt_proto_rawDescOnce sync.Once |
||||
file_decrypt_proto_rawDescData []byte |
||||
) |
||||
|
||||
func file_decrypt_proto_rawDescGZIP() []byte { |
||||
file_decrypt_proto_rawDescOnce.Do(func() { |
||||
file_decrypt_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_decrypt_proto_rawDesc), len(file_decrypt_proto_rawDesc))) |
||||
}) |
||||
return file_decrypt_proto_rawDescData |
||||
} |
||||
|
||||
var file_decrypt_proto_msgTypes = make([]protoimpl.MessageInfo, 4) |
||||
var file_decrypt_proto_goTypes = []any{ |
||||
(*SecureValueDecryptRequest)(nil), // 0: decryptv1beta1.SecureValueDecryptRequest
|
||||
(*SecureValueDecryptResponseCollection)(nil), // 1: decryptv1beta1.SecureValueDecryptResponseCollection
|
||||
(*Result)(nil), // 2: decryptv1beta1.Result
|
||||
nil, // 3: decryptv1beta1.SecureValueDecryptResponseCollection.DecryptedValuesEntry
|
||||
} |
||||
var file_decrypt_proto_depIdxs = []int32{ |
||||
3, // 0: decryptv1beta1.SecureValueDecryptResponseCollection.decrypted_values:type_name -> decryptv1beta1.SecureValueDecryptResponseCollection.DecryptedValuesEntry
|
||||
2, // 1: decryptv1beta1.SecureValueDecryptResponseCollection.DecryptedValuesEntry.value:type_name -> decryptv1beta1.Result
|
||||
0, // 2: decryptv1beta1.SecureValueDecrypter.DecryptSecureValues:input_type -> decryptv1beta1.SecureValueDecryptRequest
|
||||
1, // 3: decryptv1beta1.SecureValueDecrypter.DecryptSecureValues:output_type -> decryptv1beta1.SecureValueDecryptResponseCollection
|
||||
3, // [3:4] is the sub-list for method output_type
|
||||
2, // [2:3] is the sub-list for method input_type
|
||||
2, // [2:2] is the sub-list for extension type_name
|
||||
2, // [2:2] is the sub-list for extension extendee
|
||||
0, // [0:2] is the sub-list for field type_name
|
||||
} |
||||
|
||||
func init() { file_decrypt_proto_init() } |
||||
func file_decrypt_proto_init() { |
||||
if File_decrypt_proto != nil { |
||||
return |
||||
} |
||||
file_decrypt_proto_msgTypes[2].OneofWrappers = []any{ |
||||
(*Result_Value)(nil), |
||||
(*Result_ErrorMessage)(nil), |
||||
} |
||||
type x struct{} |
||||
out := protoimpl.TypeBuilder{ |
||||
File: protoimpl.DescBuilder{ |
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), |
||||
RawDescriptor: unsafe.Slice(unsafe.StringData(file_decrypt_proto_rawDesc), len(file_decrypt_proto_rawDesc)), |
||||
NumEnums: 0, |
||||
NumMessages: 4, |
||||
NumExtensions: 0, |
||||
NumServices: 1, |
||||
}, |
||||
GoTypes: file_decrypt_proto_goTypes, |
||||
DependencyIndexes: file_decrypt_proto_depIdxs, |
||||
MessageInfos: file_decrypt_proto_msgTypes, |
||||
}.Build() |
||||
File_decrypt_proto = out.File |
||||
file_decrypt_proto_goTypes = nil |
||||
file_decrypt_proto_depIdxs = nil |
||||
} |
@ -0,0 +1,32 @@ |
||||
syntax = "proto3"; |
||||
|
||||
package decryptv1beta1; |
||||
|
||||
option go_package = "github.com/grafana/grafana/apps/secret/decrypt/v1beta1;decryptv1beta1"; |
||||
|
||||
message SecureValueDecryptRequest { |
||||
// The stack_id or org_id. |
||||
string namespace = 1; |
||||
|
||||
// A list of secure value names to decrypt. |
||||
repeated string names = 2; |
||||
} |
||||
|
||||
message SecureValueDecryptResponseCollection { |
||||
// A map of secure value names and their decrypted values. |
||||
// The value will be an error message if the requestor does not have permissions to read it, or if the value does not exist. |
||||
// It will never return a 404 Not Found to avoid scanning of valid secure values. |
||||
map<string, Result> decrypted_values = 1; |
||||
} |
||||
|
||||
message Result { |
||||
oneof result { |
||||
string value = 1; |
||||
string error_message = 2; |
||||
} |
||||
} |
||||
|
||||
service SecureValueDecrypter { |
||||
// Decrypts a list of secure values and returns them as a map<name, decrypted_value>. |
||||
rpc DecryptSecureValues(SecureValueDecryptRequest) returns (SecureValueDecryptResponseCollection); |
||||
} |
@ -0,0 +1,110 @@ |
||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
||||
// versions:
|
||||
// - protoc-gen-go-grpc v1.4.0
|
||||
// - protoc (unknown)
|
||||
// source: decrypt.proto
|
||||
|
||||
package decryptv1beta1 |
||||
|
||||
import ( |
||||
context "context" |
||||
grpc "google.golang.org/grpc" |
||||
codes "google.golang.org/grpc/codes" |
||||
status "google.golang.org/grpc/status" |
||||
) |
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the grpc package it is being compiled against.
|
||||
// Requires gRPC-Go v1.62.0 or later.
|
||||
const _ = grpc.SupportPackageIsVersion8 |
||||
|
||||
const ( |
||||
SecureValueDecrypter_DecryptSecureValues_FullMethodName = "/decryptv1beta1.SecureValueDecrypter/DecryptSecureValues" |
||||
) |
||||
|
||||
// SecureValueDecrypterClient is the client API for SecureValueDecrypter service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
||||
type SecureValueDecrypterClient interface { |
||||
// Decrypts a list of secure values and returns them as a map<name, decrypted_value>.
|
||||
DecryptSecureValues(ctx context.Context, in *SecureValueDecryptRequest, opts ...grpc.CallOption) (*SecureValueDecryptResponseCollection, error) |
||||
} |
||||
|
||||
type secureValueDecrypterClient struct { |
||||
cc grpc.ClientConnInterface |
||||
} |
||||
|
||||
func NewSecureValueDecrypterClient(cc grpc.ClientConnInterface) SecureValueDecrypterClient { |
||||
return &secureValueDecrypterClient{cc} |
||||
} |
||||
|
||||
func (c *secureValueDecrypterClient) DecryptSecureValues(ctx context.Context, in *SecureValueDecryptRequest, opts ...grpc.CallOption) (*SecureValueDecryptResponseCollection, error) { |
||||
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) |
||||
out := new(SecureValueDecryptResponseCollection) |
||||
err := c.cc.Invoke(ctx, SecureValueDecrypter_DecryptSecureValues_FullMethodName, in, out, cOpts...) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
return out, nil |
||||
} |
||||
|
||||
// SecureValueDecrypterServer is the server API for SecureValueDecrypter service.
|
||||
// All implementations should embed UnimplementedSecureValueDecrypterServer
|
||||
// for forward compatibility
|
||||
type SecureValueDecrypterServer interface { |
||||
// Decrypts a list of secure values and returns them as a map<name, decrypted_value>.
|
||||
DecryptSecureValues(context.Context, *SecureValueDecryptRequest) (*SecureValueDecryptResponseCollection, error) |
||||
} |
||||
|
||||
// UnimplementedSecureValueDecrypterServer should be embedded to have forward compatible implementations.
|
||||
type UnimplementedSecureValueDecrypterServer struct { |
||||
} |
||||
|
||||
func (UnimplementedSecureValueDecrypterServer) DecryptSecureValues(context.Context, *SecureValueDecryptRequest) (*SecureValueDecryptResponseCollection, error) { |
||||
return nil, status.Errorf(codes.Unimplemented, "method DecryptSecureValues not implemented") |
||||
} |
||||
|
||||
// UnsafeSecureValueDecrypterServer may be embedded to opt out of forward compatibility for this service.
|
||||
// Use of this interface is not recommended, as added methods to SecureValueDecrypterServer will
|
||||
// result in compilation errors.
|
||||
type UnsafeSecureValueDecrypterServer interface { |
||||
mustEmbedUnimplementedSecureValueDecrypterServer() |
||||
} |
||||
|
||||
func RegisterSecureValueDecrypterServer(s grpc.ServiceRegistrar, srv SecureValueDecrypterServer) { |
||||
s.RegisterService(&SecureValueDecrypter_ServiceDesc, srv) |
||||
} |
||||
|
||||
func _SecureValueDecrypter_DecryptSecureValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { |
||||
in := new(SecureValueDecryptRequest) |
||||
if err := dec(in); err != nil { |
||||
return nil, err |
||||
} |
||||
if interceptor == nil { |
||||
return srv.(SecureValueDecrypterServer).DecryptSecureValues(ctx, in) |
||||
} |
||||
info := &grpc.UnaryServerInfo{ |
||||
Server: srv, |
||||
FullMethod: SecureValueDecrypter_DecryptSecureValues_FullMethodName, |
||||
} |
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) { |
||||
return srv.(SecureValueDecrypterServer).DecryptSecureValues(ctx, req.(*SecureValueDecryptRequest)) |
||||
} |
||||
return interceptor(ctx, in, info, handler) |
||||
} |
||||
|
||||
// SecureValueDecrypter_ServiceDesc is the grpc.ServiceDesc for SecureValueDecrypter service.
|
||||
// It's only intended for direct use with grpc.RegisterService,
|
||||
// and not to be introspected or modified (even as a copy)
|
||||
var SecureValueDecrypter_ServiceDesc = grpc.ServiceDesc{ |
||||
ServiceName: "decryptv1beta1.SecureValueDecrypter", |
||||
HandlerType: (*SecureValueDecrypterServer)(nil), |
||||
Methods: []grpc.MethodDesc{ |
||||
{ |
||||
MethodName: "DecryptSecureValues", |
||||
Handler: _SecureValueDecrypter_DecryptSecureValues_Handler, |
||||
}, |
||||
}, |
||||
Streams: []grpc.StreamDesc{}, |
||||
Metadata: "decrypt.proto", |
||||
} |
@ -0,0 +1,66 @@ |
||||
module github.com/grafana/grafana/apps/secret |
||||
|
||||
go 1.24.4 |
||||
|
||||
require ( |
||||
github.com/grafana/grafana-app-sdk v0.39.2 |
||||
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250710134100-1f3dc0533caf |
||||
github.com/stretchr/testify v1.10.0 |
||||
google.golang.org/grpc v1.73.0 |
||||
google.golang.org/protobuf v1.36.6 |
||||
gopkg.in/yaml.v3 v3.0.1 |
||||
k8s.io/apimachinery v0.33.2 |
||||
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff |
||||
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 |
||||
) |
||||
|
||||
require ( |
||||
github.com/beorn7/perks v1.0.1 // indirect |
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect |
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect |
||||
github.com/emicklei/go-restful/v3 v3.11.0 // indirect |
||||
github.com/fxamacker/cbor/v2 v2.7.0 // indirect |
||||
github.com/getkin/kin-openapi v0.132.0 // indirect |
||||
github.com/go-logr/logr v1.4.2 // indirect |
||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect |
||||
github.com/go-openapi/jsonreference v0.21.0 // indirect |
||||
github.com/go-openapi/swag v0.23.0 // indirect |
||||
github.com/go-test/deep v1.1.1 // indirect |
||||
github.com/gogo/protobuf v1.3.2 // indirect |
||||
github.com/google/gnostic-models v0.6.9 // indirect |
||||
github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect |
||||
github.com/josharian/intern v1.0.0 // indirect |
||||
github.com/json-iterator/go v1.1.12 // indirect |
||||
github.com/mailru/easyjson v0.7.7 // indirect |
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect |
||||
github.com/modern-go/reflect2 v1.0.2 // indirect |
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect |
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect |
||||
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect |
||||
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect |
||||
github.com/perimeterx/marshmallow v1.1.5 // indirect |
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect |
||||
github.com/prometheus/client_golang v1.22.0 // indirect |
||||
github.com/prometheus/client_model v0.6.2 // indirect |
||||
github.com/prometheus/common v0.64.0 // indirect |
||||
github.com/prometheus/procfs v0.16.1 // indirect |
||||
github.com/stretchr/objx v0.5.2 // indirect |
||||
github.com/x448/float16 v0.8.4 // indirect |
||||
go.opentelemetry.io/otel v1.36.0 // indirect |
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect |
||||
go.opentelemetry.io/otel/trace v1.36.0 // indirect |
||||
golang.org/x/net v0.41.0 // indirect |
||||
golang.org/x/oauth2 v0.30.0 // indirect |
||||
golang.org/x/sys v0.33.0 // indirect |
||||
golang.org/x/term v0.32.0 // indirect |
||||
golang.org/x/text v0.26.0 // indirect |
||||
golang.org/x/time v0.11.0 // indirect |
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect |
||||
gopkg.in/inf.v0 v0.9.1 // indirect |
||||
k8s.io/client-go v0.33.2 // indirect |
||||
k8s.io/klog/v2 v2.130.1 // indirect |
||||
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect |
||||
sigs.k8s.io/randfill v1.0.0 // indirect |
||||
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect |
||||
sigs.k8s.io/yaml v1.4.0 // indirect |
||||
) |
@ -0,0 +1,189 @@ |
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= |
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= |
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= |
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= |
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= |
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= |
||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= |
||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= |
||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= |
||||
github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= |
||||
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= |
||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= |
||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= |
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= |
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= |
||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= |
||||
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= |
||||
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= |
||||
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= |
||||
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= |
||||
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= |
||||
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= |
||||
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= |
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= |
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= |
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= |
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= |
||||
github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= |
||||
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= |
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= |
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= |
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= |
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= |
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= |
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
||||
github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8= |
||||
github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY= |
||||
github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU= |
||||
github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk= |
||||
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250710134100-1f3dc0533caf h1:BBGDHffvVNLoYQlXEpbXcxE0vbpq7pm/8OWF5I+UDZg= |
||||
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250710134100-1f3dc0533caf/go.mod h1:eAlOam2uWhrsEZlOoAr7XZ9hbBP7SyYGYn31/aQAPs8= |
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= |
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= |
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= |
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= |
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= |
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= |
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= |
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= |
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= |
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= |
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= |
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= |
||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= |
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= |
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= |
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= |
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= |
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= |
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= |
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= |
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= |
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= |
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= |
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= |
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= |
||||
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= |
||||
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= |
||||
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= |
||||
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= |
||||
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= |
||||
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= |
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= |
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= |
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= |
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= |
||||
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= |
||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= |
||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= |
||||
github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= |
||||
github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= |
||||
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= |
||||
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= |
||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= |
||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= |
||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= |
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= |
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= |
||||
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= |
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= |
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= |
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= |
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= |
||||
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= |
||||
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= |
||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= |
||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= |
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= |
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= |
||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= |
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= |
||||
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= |
||||
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= |
||||
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= |
||||
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= |
||||
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= |
||||
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= |
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= |
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= |
||||
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= |
||||
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= |
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= |
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= |
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= |
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= |
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= |
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= |
||||
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= |
||||
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= |
||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= |
||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= |
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= |
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= |
||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= |
||||
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= |
||||
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= |
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= |
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
||||
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= |
||||
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= |
||||
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= |
||||
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= |
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= |
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= |
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= |
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= |
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= |
||||
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= |
||||
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= |
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= |
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= |
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= |
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= |
||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= |
||||
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= |
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= |
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= |
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= |
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
||||
k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY= |
||||
k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs= |
||||
k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY= |
||||
k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= |
||||
k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E= |
||||
k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo= |
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= |
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= |
||||
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= |
||||
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= |
||||
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= |
||||
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= |
||||
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= |
||||
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= |
||||
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= |
||||
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= |
||||
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= |
||||
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= |
||||
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= |
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= |
||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= |
@ -0,0 +1,4 @@ |
||||
module: "github.com/grafana/grafana/apps/secret/kinds" |
||||
language: { |
||||
version: "v0.9.0" |
||||
} |
@ -0,0 +1,26 @@ |
||||
package secret |
||||
|
||||
import "github.com/grafana/grafana/apps/secret/kinds/v1beta1" |
||||
|
||||
keeper: { |
||||
kind: "Keeper" |
||||
pluralName: "Keepers" |
||||
current: "v1beta1" |
||||
scope: "Namespaced" |
||||
current: "v1beta1" |
||||
codegen: { |
||||
ts: { |
||||
enabled: false |
||||
} |
||||
go: { |
||||
enabled: true |
||||
} |
||||
} |
||||
versions: { |
||||
"v1beta1": { |
||||
schema: { |
||||
spec: v1beta1.KeeperSpec |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,10 @@ |
||||
package secret |
||||
|
||||
manifest: { |
||||
appName: "secret" |
||||
groupOverride: "secret.grafana.app" |
||||
kinds: [ |
||||
securevalue, |
||||
keeper, |
||||
] |
||||
} |
@ -0,0 +1,27 @@ |
||||
package secret |
||||
|
||||
import "github.com/grafana/grafana/apps/secret/kinds/v1beta1" |
||||
|
||||
securevalue: { |
||||
kind: "SecureValue" |
||||
pluralName: "SecureValues" |
||||
current: "v1beta1" |
||||
scope: "Namespaced" |
||||
current: "v1beta1" |
||||
codegen: { |
||||
ts: { |
||||
enabled: false |
||||
} |
||||
go: { |
||||
enabled: true |
||||
} |
||||
} |
||||
versions: { |
||||
"v1beta1": { |
||||
schema: { |
||||
spec: v1beta1.SecureValueSpec |
||||
status: v1beta1.SecureValueStatus |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,68 @@ |
||||
package v1beta1 |
||||
|
||||
import "strings" |
||||
|
||||
KeeperSpec: { |
||||
// Short description for the Keeper. |
||||
// +k8s:validation:minLength=1 |
||||
// +k8s:validation:maxLength=253 |
||||
description: string & strings.MinRunes(1) & strings.MaxRunes(253) |
||||
|
||||
// AWS Keeper Configuration. |
||||
// +structType=atomic |
||||
// +optional |
||||
aws?: #AWSConfig |
||||
|
||||
// Azure Keeper Configuration. |
||||
// +structType=atomic |
||||
// +optional |
||||
azure?: #AzureConfig |
||||
|
||||
// GCP Keeper Configuration. |
||||
// +structType=atomic |
||||
// +optional |
||||
gcp?: #GCPConfig |
||||
|
||||
// HashiCorp Vault Keeper Configuration. |
||||
// +structType=atomic |
||||
// +optional |
||||
hashiCorpVault?: #HashiCorpConfig |
||||
} |
||||
|
||||
#AWSConfig: { |
||||
accessKeyID: #CredentialValue |
||||
secretAccessKey: #CredentialValue |
||||
kmsKeyID?: string |
||||
} |
||||
|
||||
#AzureConfig: { |
||||
keyVaultName: string |
||||
tenantID: string |
||||
clientID: string |
||||
clientSecret: #CredentialValue |
||||
} |
||||
|
||||
#GCPConfig: { |
||||
projectID: string |
||||
credentialsFile: string |
||||
} |
||||
|
||||
#HashiCorpConfig: { |
||||
address: string |
||||
token: #CredentialValue |
||||
} |
||||
|
||||
#CredentialValue: { |
||||
// The name of the secure value that holds the actual value. |
||||
// +optional |
||||
secureValueName: string |
||||
|
||||
// The value is taken from the environment variable. |
||||
// +optional |
||||
valueFromEnv: string |
||||
|
||||
// The value is taken from the Grafana config file. |
||||
// TODO: how do we explain that this is a path to the config file? |
||||
// +optional |
||||
valueFromConfig: string |
||||
} |
@ -0,0 +1,53 @@ |
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"list" |
||||
"strings" |
||||
) |
||||
|
||||
// ExposedSecureValue contains the raw decrypted secure value. |
||||
#ExposedSecureValue: string |
||||
|
||||
SecureValueSpec: { |
||||
// Short description that explains the purpose of this SecureValue. |
||||
// +k8s:validation:minLength=1 |
||||
// +k8s:validation:maxLength=25 |
||||
description: string & strings.MinRunes(1) & strings.MaxRunes(25) |
||||
|
||||
// The raw value is only valid for write. Read/List will always be empty. |
||||
// There is no support for mixing `value` and `ref`, you can't create a secret in a third-party keeper with a specified `ref`. |
||||
// Minimum and maximum lengths in bytes. |
||||
// +k8s:validation:minLength=1 |
||||
// +k8s:validation:maxLength=24576 |
||||
// +optional |
||||
value?: #ExposedSecureValue |
||||
|
||||
// When using a third-party keeper, the `ref` is used to reference a value inside the remote storage. |
||||
// This should not contain sensitive information. |
||||
// +k8s:validation:minLength=1 |
||||
// +k8s:validation:maxLength=1024 |
||||
// +optional |
||||
ref?: string & strings.MinRunes(1) & strings.MaxRunes(1024) |
||||
|
||||
// Name of the keeper, being the actual storage of the secure value. |
||||
// If not specified, the default keeper for the namespace will be used. |
||||
// +k8s:validation:minLength=1 |
||||
// +k8s:validation:maxLength=253 |
||||
// +optional |
||||
keeper?: string & strings.MinRunes(1) & strings.MaxRunes(253) |
||||
|
||||
// The Decrypters that are allowed to decrypt this secret. |
||||
// An empty list means no service can decrypt it. |
||||
// +k8s:validation:maxItems=64 |
||||
// +k8s:validation:uniqueItems=true |
||||
// +listType=atomic |
||||
// +optional |
||||
decrypters?: [...string] & list.UniqueItems() & list.MaxItems(64) |
||||
} |
||||
|
||||
SecureValueStatus: { |
||||
version: int64 & >=0 |
||||
|
||||
// +optional |
||||
externalID: string |
||||
} |
@ -0,0 +1,18 @@ |
||||
package v1beta1 |
||||
|
||||
import "k8s.io/apimachinery/pkg/runtime/schema" |
||||
|
||||
const ( |
||||
// APIGroup is the API group used by all kinds in this package
|
||||
APIGroup = "secret.grafana.app" |
||||
// APIVersion is the API version used by all kinds in this package
|
||||
APIVersion = "v1beta1" |
||||
) |
||||
|
||||
var ( |
||||
// GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package
|
||||
GroupVersion = schema.GroupVersion{ |
||||
Group: APIGroup, |
||||
Version: APIVersion, |
||||
} |
||||
) |
@ -0,0 +1,70 @@ |
||||
//
|
||||
// THIS FILE IS MANUALLY GENERATED TO OVERCOME LIMITATIONS WITH CUE. FEEL FREE TO EDIT IT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"fmt" |
||||
"strconv" |
||||
|
||||
"gopkg.in/yaml.v3" |
||||
) |
||||
|
||||
const redacted = "[REDACTED]" |
||||
|
||||
// ExposedSecureValue contains the raw decrypted secure value.
|
||||
type ExposedSecureValue = SecureValueExposedSecureValue |
||||
|
||||
var ( |
||||
_ fmt.Stringer = (*ExposedSecureValue)(nil) |
||||
_ fmt.Formatter = (*ExposedSecureValue)(nil) |
||||
_ fmt.GoStringer = (*ExposedSecureValue)(nil) |
||||
_ json.Marshaler = (*ExposedSecureValue)(nil) |
||||
_ yaml.Marshaler = (*ExposedSecureValue)(nil) |
||||
) |
||||
|
||||
// NewExposedSecureValue creates a new exposed secure value wrapper.
|
||||
func NewExposedSecureValue(v string) ExposedSecureValue { |
||||
return ExposedSecureValue(v) |
||||
} |
||||
|
||||
// DangerouslyExposeAndConsumeValue will move the decrypted secure value out of the wrapper and return it.
|
||||
// Further attempts to call this method will panic.
|
||||
// The function name is intentionally kept long and weird because this is a dangerous operation and should be used carefully!
|
||||
func (s *ExposedSecureValue) DangerouslyExposeAndConsumeValue() string { |
||||
if *s == "" { |
||||
panic("underlying value is empty or was consumed") |
||||
} |
||||
|
||||
tmp := *s |
||||
*s = "" |
||||
|
||||
return string(tmp) |
||||
} |
||||
|
||||
// String must not return the exposed secure value.
|
||||
func (s ExposedSecureValue) String() string { |
||||
return redacted |
||||
} |
||||
|
||||
// Format must not return the exposed secure value.
|
||||
func (s ExposedSecureValue) Format(f fmt.State, _verb rune) { |
||||
_, _ = fmt.Fprint(f, redacted) |
||||
} |
||||
|
||||
// GoString must not return the exposed secure value.
|
||||
func (s ExposedSecureValue) GoString() string { |
||||
return redacted |
||||
} |
||||
|
||||
// MarshalJSON must not return the exposed secure value.
|
||||
func (s ExposedSecureValue) MarshalJSON() ([]byte, error) { |
||||
return []byte(strconv.Quote(redacted)), nil |
||||
} |
||||
|
||||
// MarshalYAML must not return the exposed secure value.
|
||||
func (s ExposedSecureValue) MarshalYAML() (any, error) { |
||||
return redacted, nil |
||||
} |
@ -0,0 +1,51 @@ |
||||
//
|
||||
// THIS FILE IS MANUALLY GENERATED TO OVERCOME LIMITATIONS WITH CUE. FEEL FREE TO EDIT IT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"bytes" |
||||
"encoding/json" |
||||
"fmt" |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
"gopkg.in/yaml.v3" |
||||
) |
||||
|
||||
func TestExposedSecureValue(t *testing.T) { |
||||
expected := "[REDACTED]" |
||||
|
||||
rawValue := "a-password" |
||||
esv := NewExposedSecureValue(rawValue) |
||||
|
||||
// String must not return the exposed secure value.
|
||||
require.Equal(t, expected, esv.String()) |
||||
|
||||
// Format/GoString must not return the exposed secure value.
|
||||
require.Equal(t, expected, fmt.Sprintf("%+#v", esv)) |
||||
require.Equal(t, expected, fmt.Sprintf("%v", esv)) |
||||
require.Equal(t, expected, fmt.Sprintf("%s", esv)) |
||||
|
||||
buf := new(bytes.Buffer) |
||||
_, err := fmt.Fprintf(buf, "%#v", esv) |
||||
require.NoError(t, err) |
||||
require.Equal(t, expected, buf.String()) |
||||
|
||||
// MarshalJSON must not return the exposed secure value.
|
||||
bytes, err := json.Marshal(esv) |
||||
require.NoError(t, err) |
||||
require.Equal(t, `"`+expected+`"`, string(bytes)) |
||||
|
||||
// MarshalYAML must not return the exposed secure value.
|
||||
bytes, err = yaml.Marshal(esv) |
||||
require.NoError(t, err) |
||||
require.Equal(t, "'"+expected+"'\n", string(bytes)) |
||||
|
||||
// DangerouslyExposeAndConsumeValue returns the raw value.
|
||||
require.Equal(t, rawValue, esv.DangerouslyExposeAndConsumeValue()) |
||||
|
||||
// Further calls to DangerouslyExposeAndConsumeValue will panic.
|
||||
require.Panics(t, func() { esv.DangerouslyExposeAndConsumeValue() }) |
||||
} |
@ -0,0 +1,28 @@ |
||||
//
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"io" |
||||
|
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
) |
||||
|
||||
// KeeperJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding
|
||||
type KeeperJSONCodec struct{} |
||||
|
||||
// Read reads JSON-encoded bytes from `reader` and unmarshals them into `into`
|
||||
func (*KeeperJSONCodec) Read(reader io.Reader, into resource.Object) error { |
||||
return json.NewDecoder(reader).Decode(into) |
||||
} |
||||
|
||||
// Write writes JSON-encoded bytes into `writer` marshaled from `from`
|
||||
func (*KeeperJSONCodec) Write(writer io.Writer, from resource.Object) error { |
||||
return json.NewEncoder(writer).Encode(from) |
||||
} |
||||
|
||||
// Interface compliance checks
|
||||
var _ resource.Codec = &KeeperJSONCodec{} |
@ -0,0 +1,31 @@ |
||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
time "time" |
||||
) |
||||
|
||||
// metadata contains embedded CommonMetadata and can be extended with custom string fields
|
||||
// TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
|
||||
// without external reference as using the CommonMetadata reference breaks thema codegen.
|
||||
type KeeperMetadata struct { |
||||
UpdateTimestamp time.Time `json:"updateTimestamp"` |
||||
CreatedBy string `json:"createdBy"` |
||||
Uid string `json:"uid"` |
||||
CreationTimestamp time.Time `json:"creationTimestamp"` |
||||
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"` |
||||
Finalizers []string `json:"finalizers"` |
||||
ResourceVersion string `json:"resourceVersion"` |
||||
Generation int64 `json:"generation"` |
||||
UpdatedBy string `json:"updatedBy"` |
||||
Labels map[string]string `json:"labels"` |
||||
} |
||||
|
||||
// NewKeeperMetadata creates a new KeeperMetadata object.
|
||||
func NewKeeperMetadata() *KeeperMetadata { |
||||
return &KeeperMetadata{ |
||||
Finalizers: []string{}, |
||||
Labels: map[string]string{}, |
||||
} |
||||
} |
@ -0,0 +1,319 @@ |
||||
//
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"fmt" |
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
||||
"k8s.io/apimachinery/pkg/runtime" |
||||
"k8s.io/apimachinery/pkg/runtime/schema" |
||||
"k8s.io/apimachinery/pkg/types" |
||||
"time" |
||||
) |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type Keeper struct { |
||||
metav1.TypeMeta `json:",inline" yaml:",inline"` |
||||
metav1.ObjectMeta `json:"metadata" yaml:"metadata"` |
||||
|
||||
// Spec is the spec of the Keeper
|
||||
Spec KeeperSpec `json:"spec" yaml:"spec"` |
||||
|
||||
Status KeeperStatus `json:"status" yaml:"status"` |
||||
} |
||||
|
||||
func (o *Keeper) GetSpec() any { |
||||
return o.Spec |
||||
} |
||||
|
||||
func (o *Keeper) SetSpec(spec any) error { |
||||
cast, ok := spec.(KeeperSpec) |
||||
if !ok { |
||||
return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec) |
||||
} |
||||
o.Spec = cast |
||||
return nil |
||||
} |
||||
|
||||
func (o *Keeper) GetSubresources() map[string]any { |
||||
return map[string]any{ |
||||
"status": o.Status, |
||||
} |
||||
} |
||||
|
||||
func (o *Keeper) GetSubresource(name string) (any, bool) { |
||||
switch name { |
||||
case "status": |
||||
return o.Status, true |
||||
default: |
||||
return nil, false |
||||
} |
||||
} |
||||
|
||||
func (o *Keeper) SetSubresource(name string, value any) error { |
||||
switch name { |
||||
case "status": |
||||
cast, ok := value.(KeeperStatus) |
||||
if !ok { |
||||
return fmt.Errorf("cannot set status type %#v, not of type KeeperStatus", value) |
||||
} |
||||
o.Status = cast |
||||
return nil |
||||
default: |
||||
return fmt.Errorf("subresource '%s' does not exist", name) |
||||
} |
||||
} |
||||
|
||||
func (o *Keeper) GetStaticMetadata() resource.StaticMetadata { |
||||
gvk := o.GroupVersionKind() |
||||
return resource.StaticMetadata{ |
||||
Name: o.ObjectMeta.Name, |
||||
Namespace: o.ObjectMeta.Namespace, |
||||
Group: gvk.Group, |
||||
Version: gvk.Version, |
||||
Kind: gvk.Kind, |
||||
} |
||||
} |
||||
|
||||
func (o *Keeper) SetStaticMetadata(metadata resource.StaticMetadata) { |
||||
o.Name = metadata.Name |
||||
o.Namespace = metadata.Namespace |
||||
o.SetGroupVersionKind(schema.GroupVersionKind{ |
||||
Group: metadata.Group, |
||||
Version: metadata.Version, |
||||
Kind: metadata.Kind, |
||||
}) |
||||
} |
||||
|
||||
func (o *Keeper) GetCommonMetadata() resource.CommonMetadata { |
||||
dt := o.DeletionTimestamp |
||||
var deletionTimestamp *time.Time |
||||
if dt != nil { |
||||
deletionTimestamp = &dt.Time |
||||
} |
||||
// Legacy ExtraFields support
|
||||
extraFields := make(map[string]any) |
||||
if o.Annotations != nil { |
||||
extraFields["annotations"] = o.Annotations |
||||
} |
||||
if o.ManagedFields != nil { |
||||
extraFields["managedFields"] = o.ManagedFields |
||||
} |
||||
if o.OwnerReferences != nil { |
||||
extraFields["ownerReferences"] = o.OwnerReferences |
||||
} |
||||
return resource.CommonMetadata{ |
||||
UID: string(o.UID), |
||||
ResourceVersion: o.ResourceVersion, |
||||
Generation: o.Generation, |
||||
Labels: o.Labels, |
||||
CreationTimestamp: o.CreationTimestamp.Time, |
||||
DeletionTimestamp: deletionTimestamp, |
||||
Finalizers: o.Finalizers, |
||||
UpdateTimestamp: o.GetUpdateTimestamp(), |
||||
CreatedBy: o.GetCreatedBy(), |
||||
UpdatedBy: o.GetUpdatedBy(), |
||||
ExtraFields: extraFields, |
||||
} |
||||
} |
||||
|
||||
func (o *Keeper) SetCommonMetadata(metadata resource.CommonMetadata) { |
||||
o.UID = types.UID(metadata.UID) |
||||
o.ResourceVersion = metadata.ResourceVersion |
||||
o.Generation = metadata.Generation |
||||
o.Labels = metadata.Labels |
||||
o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp) |
||||
if metadata.DeletionTimestamp != nil { |
||||
dt := metav1.NewTime(*metadata.DeletionTimestamp) |
||||
o.DeletionTimestamp = &dt |
||||
} else { |
||||
o.DeletionTimestamp = nil |
||||
} |
||||
o.Finalizers = metadata.Finalizers |
||||
if o.Annotations == nil { |
||||
o.Annotations = make(map[string]string) |
||||
} |
||||
if !metadata.UpdateTimestamp.IsZero() { |
||||
o.SetUpdateTimestamp(metadata.UpdateTimestamp) |
||||
} |
||||
if metadata.CreatedBy != "" { |
||||
o.SetCreatedBy(metadata.CreatedBy) |
||||
} |
||||
if metadata.UpdatedBy != "" { |
||||
o.SetUpdatedBy(metadata.UpdatedBy) |
||||
} |
||||
// Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields
|
||||
if metadata.ExtraFields != nil { |
||||
if annotations, ok := metadata.ExtraFields["annotations"]; ok { |
||||
if cast, ok := annotations.(map[string]string); ok { |
||||
o.Annotations = cast |
||||
} |
||||
} |
||||
if managedFields, ok := metadata.ExtraFields["managedFields"]; ok { |
||||
if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok { |
||||
o.ManagedFields = cast |
||||
} |
||||
} |
||||
if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok { |
||||
if cast, ok := ownerReferences.([]metav1.OwnerReference); ok { |
||||
o.OwnerReferences = cast |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
func (o *Keeper) GetCreatedBy() string { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
return o.ObjectMeta.Annotations["grafana.com/createdBy"] |
||||
} |
||||
|
||||
func (o *Keeper) SetCreatedBy(createdBy string) { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy |
||||
} |
||||
|
||||
func (o *Keeper) GetUpdateTimestamp() time.Time { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"]) |
||||
return parsed |
||||
} |
||||
|
||||
func (o *Keeper) SetUpdateTimestamp(updateTimestamp time.Time) { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339) |
||||
} |
||||
|
||||
func (o *Keeper) GetUpdatedBy() string { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
return o.ObjectMeta.Annotations["grafana.com/updatedBy"] |
||||
} |
||||
|
||||
func (o *Keeper) SetUpdatedBy(updatedBy string) { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy |
||||
} |
||||
|
||||
func (o *Keeper) Copy() resource.Object { |
||||
return resource.CopyObject(o) |
||||
} |
||||
|
||||
func (o *Keeper) DeepCopyObject() runtime.Object { |
||||
return o.Copy() |
||||
} |
||||
|
||||
func (o *Keeper) DeepCopy() *Keeper { |
||||
cpy := &Keeper{} |
||||
o.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
func (o *Keeper) DeepCopyInto(dst *Keeper) { |
||||
dst.TypeMeta.APIVersion = o.TypeMeta.APIVersion |
||||
dst.TypeMeta.Kind = o.TypeMeta.Kind |
||||
o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta) |
||||
o.Spec.DeepCopyInto(&dst.Spec) |
||||
o.Status.DeepCopyInto(&dst.Status) |
||||
} |
||||
|
||||
// Interface compliance compile-time check
|
||||
var _ resource.Object = &Keeper{} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperList struct { |
||||
metav1.TypeMeta `json:",inline" yaml:",inline"` |
||||
metav1.ListMeta `json:"metadata" yaml:"metadata"` |
||||
Items []Keeper `json:"items" yaml:"items"` |
||||
} |
||||
|
||||
func (o *KeeperList) DeepCopyObject() runtime.Object { |
||||
return o.Copy() |
||||
} |
||||
|
||||
func (o *KeeperList) Copy() resource.ListObject { |
||||
cpy := &KeeperList{ |
||||
TypeMeta: o.TypeMeta, |
||||
Items: make([]Keeper, len(o.Items)), |
||||
} |
||||
o.ListMeta.DeepCopyInto(&cpy.ListMeta) |
||||
for i := 0; i < len(o.Items); i++ { |
||||
if item, ok := o.Items[i].Copy().(*Keeper); ok { |
||||
cpy.Items[i] = *item |
||||
} |
||||
} |
||||
return cpy |
||||
} |
||||
|
||||
func (o *KeeperList) GetItems() []resource.Object { |
||||
items := make([]resource.Object, len(o.Items)) |
||||
for i := 0; i < len(o.Items); i++ { |
||||
items[i] = &o.Items[i] |
||||
} |
||||
return items |
||||
} |
||||
|
||||
func (o *KeeperList) SetItems(items []resource.Object) { |
||||
o.Items = make([]Keeper, len(items)) |
||||
for i := 0; i < len(items); i++ { |
||||
o.Items[i] = *items[i].(*Keeper) |
||||
} |
||||
} |
||||
|
||||
func (o *KeeperList) DeepCopy() *KeeperList { |
||||
cpy := &KeeperList{} |
||||
o.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
func (o *KeeperList) DeepCopyInto(dst *KeeperList) { |
||||
resource.CopyObjectInto(dst, o) |
||||
} |
||||
|
||||
// Interface compliance compile-time check
|
||||
var _ resource.ListObject = &KeeperList{} |
||||
|
||||
// Copy methods for all subresource types
|
||||
|
||||
// DeepCopy creates a full deep copy of Spec
|
||||
func (s *KeeperSpec) DeepCopy() *KeeperSpec { |
||||
cpy := &KeeperSpec{} |
||||
s.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
// DeepCopyInto deep copies Spec into another Spec object
|
||||
func (s *KeeperSpec) DeepCopyInto(dst *KeeperSpec) { |
||||
resource.CopyObjectInto(dst, s) |
||||
} |
||||
|
||||
// DeepCopy creates a full deep copy of KeeperStatus
|
||||
func (s *KeeperStatus) DeepCopy() *KeeperStatus { |
||||
cpy := &KeeperStatus{} |
||||
s.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
// DeepCopyInto deep copies KeeperStatus into another KeeperStatus object
|
||||
func (s *KeeperStatus) DeepCopyInto(dst *KeeperStatus) { |
||||
resource.CopyObjectInto(dst, s) |
||||
} |
@ -0,0 +1,34 @@ |
||||
//
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
) |
||||
|
||||
// schema is unexported to prevent accidental overwrites
|
||||
var ( |
||||
schemaKeeper = resource.NewSimpleSchema("secret.grafana.app", "v1beta1", &Keeper{}, &KeeperList{}, resource.WithKind("Keeper"), |
||||
resource.WithPlural("keepers"), resource.WithScope(resource.NamespacedScope)) |
||||
kindKeeper = resource.Kind{ |
||||
Schema: schemaKeeper, |
||||
Codecs: map[resource.KindEncoding]resource.Codec{ |
||||
resource.KindEncodingJSON: &KeeperJSONCodec{}, |
||||
}, |
||||
} |
||||
) |
||||
|
||||
// Kind returns a resource.Kind for this Schema with a JSON codec
|
||||
func KeeperKind() resource.Kind { |
||||
return kindKeeper |
||||
} |
||||
|
||||
// Schema returns a resource.SimpleSchema representation of Keeper
|
||||
func KeeperSchema() *resource.SimpleSchema { |
||||
return schemaKeeper |
||||
} |
||||
|
||||
// Interface compliance checks
|
||||
var _ resource.Schema = kindKeeper |
@ -0,0 +1,105 @@ |
||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperAWSConfig struct { |
||||
AccessKeyID KeeperCredentialValue `json:"accessKeyID"` |
||||
SecretAccessKey KeeperCredentialValue `json:"secretAccessKey"` |
||||
KmsKeyID *string `json:"kmsKeyID,omitempty"` |
||||
} |
||||
|
||||
// NewKeeperAWSConfig creates a new KeeperAWSConfig object.
|
||||
func NewKeeperAWSConfig() *KeeperAWSConfig { |
||||
return &KeeperAWSConfig{ |
||||
AccessKeyID: *NewKeeperCredentialValue(), |
||||
SecretAccessKey: *NewKeeperCredentialValue(), |
||||
} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperCredentialValue struct { |
||||
// The name of the secure value that holds the actual value.
|
||||
// +optional
|
||||
SecureValueName string `json:"secureValueName"` |
||||
// The value is taken from the environment variable.
|
||||
// +optional
|
||||
ValueFromEnv string `json:"valueFromEnv"` |
||||
// The value is taken from the Grafana config file.
|
||||
// TODO: how do we explain that this is a path to the config file?
|
||||
// +optional
|
||||
ValueFromConfig string `json:"valueFromConfig"` |
||||
} |
||||
|
||||
// NewKeeperCredentialValue creates a new KeeperCredentialValue object.
|
||||
func NewKeeperCredentialValue() *KeeperCredentialValue { |
||||
return &KeeperCredentialValue{} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperAzureConfig struct { |
||||
KeyVaultName string `json:"keyVaultName"` |
||||
TenantID string `json:"tenantID"` |
||||
ClientID string `json:"clientID"` |
||||
ClientSecret KeeperCredentialValue `json:"clientSecret"` |
||||
} |
||||
|
||||
// NewKeeperAzureConfig creates a new KeeperAzureConfig object.
|
||||
func NewKeeperAzureConfig() *KeeperAzureConfig { |
||||
return &KeeperAzureConfig{ |
||||
ClientSecret: *NewKeeperCredentialValue(), |
||||
} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperGCPConfig struct { |
||||
ProjectID string `json:"projectID"` |
||||
CredentialsFile string `json:"credentialsFile"` |
||||
} |
||||
|
||||
// NewKeeperGCPConfig creates a new KeeperGCPConfig object.
|
||||
func NewKeeperGCPConfig() *KeeperGCPConfig { |
||||
return &KeeperGCPConfig{} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperHashiCorpConfig struct { |
||||
Address string `json:"address"` |
||||
Token KeeperCredentialValue `json:"token"` |
||||
} |
||||
|
||||
// NewKeeperHashiCorpConfig creates a new KeeperHashiCorpConfig object.
|
||||
func NewKeeperHashiCorpConfig() *KeeperHashiCorpConfig { |
||||
return &KeeperHashiCorpConfig{ |
||||
Token: *NewKeeperCredentialValue(), |
||||
} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperSpec struct { |
||||
// Short description for the Keeper.
|
||||
// +k8s:validation:minLength=1
|
||||
// +k8s:validation:maxLength=253
|
||||
Description string `json:"description"` |
||||
// AWS Keeper Configuration.
|
||||
// +structType=atomic
|
||||
// +optional
|
||||
Aws *KeeperAWSConfig `json:"aws,omitempty"` |
||||
// Azure Keeper Configuration.
|
||||
// +structType=atomic
|
||||
// +optional
|
||||
Azure *KeeperAzureConfig `json:"azure,omitempty"` |
||||
// GCP Keeper Configuration.
|
||||
// +structType=atomic
|
||||
// +optional
|
||||
Gcp *KeeperGCPConfig `json:"gcp,omitempty"` |
||||
// HashiCorp Vault Keeper Configuration.
|
||||
// +structType=atomic
|
||||
// +optional
|
||||
HashiCorpVault *KeeperHashiCorpConfig `json:"hashiCorpVault,omitempty"` |
||||
} |
||||
|
||||
// NewKeeperSpec creates a new KeeperSpec object.
|
||||
func NewKeeperSpec() *KeeperSpec { |
||||
return &KeeperSpec{} |
||||
} |
@ -0,0 +1,44 @@ |
||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperstatusOperatorState struct { |
||||
// lastEvaluation is the ResourceVersion last evaluated
|
||||
LastEvaluation string `json:"lastEvaluation"` |
||||
// state describes the state of the lastEvaluation.
|
||||
// It is limited to three possible states for machine evaluation.
|
||||
State KeeperStatusOperatorStateState `json:"state"` |
||||
// descriptiveState is an optional more descriptive state field which has no requirements on format
|
||||
DescriptiveState *string `json:"descriptiveState,omitempty"` |
||||
// details contains any extra information that is operator-specific
|
||||
Details map[string]interface{} `json:"details,omitempty"` |
||||
} |
||||
|
||||
// NewKeeperstatusOperatorState creates a new KeeperstatusOperatorState object.
|
||||
func NewKeeperstatusOperatorState() *KeeperstatusOperatorState { |
||||
return &KeeperstatusOperatorState{} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperStatus struct { |
||||
// operatorStates is a map of operator ID to operator state evaluations.
|
||||
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
|
||||
OperatorStates map[string]KeeperstatusOperatorState `json:"operatorStates,omitempty"` |
||||
// additionalFields is reserved for future use
|
||||
AdditionalFields map[string]interface{} `json:"additionalFields,omitempty"` |
||||
} |
||||
|
||||
// NewKeeperStatus creates a new KeeperStatus object.
|
||||
func NewKeeperStatus() *KeeperStatus { |
||||
return &KeeperStatus{} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type KeeperStatusOperatorStateState string |
||||
|
||||
const ( |
||||
KeeperStatusOperatorStateStateSuccess KeeperStatusOperatorStateState = "success" |
||||
KeeperStatusOperatorStateStateInProgress KeeperStatusOperatorStateState = "in_progress" |
||||
KeeperStatusOperatorStateStateFailed KeeperStatusOperatorStateState = "failed" |
||||
) |
@ -0,0 +1,63 @@ |
||||
//
|
||||
// THIS FILE IS MANUALLY GENERATED TO OVERCOME LIMITATIONS WITH CUE. FEEL FREE TO EDIT IT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
// KeeperType represents the type of a Keeper.
|
||||
type KeeperType string |
||||
|
||||
const ( |
||||
AWSKeeperType KeeperType = "aws" |
||||
AzureKeeperType KeeperType = "azure" |
||||
GCPKeeperType KeeperType = "gcp" |
||||
HashiCorpKeeperType KeeperType = "hashicorp" |
||||
) |
||||
|
||||
func (kt KeeperType) String() string { |
||||
return string(kt) |
||||
} |
||||
|
||||
// KeeperConfig is an interface that all keeper config types must implement.
|
||||
type KeeperConfig interface { |
||||
Type() KeeperType |
||||
} |
||||
|
||||
func (s *KeeperSpec) GetType() KeeperType { |
||||
if s.Aws != nil { |
||||
return AWSKeeperType |
||||
} |
||||
if s.Azure != nil { |
||||
return AzureKeeperType |
||||
} |
||||
if s.Gcp != nil { |
||||
return GCPKeeperType |
||||
} |
||||
if s.HashiCorpVault != nil { |
||||
return HashiCorpKeeperType |
||||
} |
||||
return "" |
||||
} |
||||
|
||||
// System Keeper.
|
||||
type SystemKeeperConfig struct{} |
||||
|
||||
func (*SystemKeeperConfig) Type() KeeperType { |
||||
return "system" |
||||
} |
||||
|
||||
func (s *KeeperAWSConfig) Type() KeeperType { |
||||
return AWSKeeperType |
||||
} |
||||
|
||||
func (s *KeeperAzureConfig) Type() KeeperType { |
||||
return AzureKeeperType |
||||
} |
||||
|
||||
func (s *KeeperGCPConfig) Type() KeeperType { |
||||
return GCPKeeperType |
||||
} |
||||
|
||||
func (s *KeeperHashiCorpConfig) Type() KeeperType { |
||||
return HashiCorpKeeperType |
||||
} |
@ -0,0 +1,73 @@ |
||||
//
|
||||
// THIS FILE IS MANUALLY GENERATED TO OVERCOME LIMITATIONS WITH CUE. FEEL FREE TO EDIT IT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"fmt" |
||||
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
||||
"k8s.io/apimachinery/pkg/runtime" |
||||
"k8s.io/apimachinery/pkg/runtime/schema" |
||||
|
||||
"github.com/grafana/grafana/pkg/apimachinery/utils" |
||||
) |
||||
|
||||
var SecureValuesResourceInfo = utils.NewResourceInfo( |
||||
APIGroup, APIVersion, |
||||
"securevalues", "securevalue", "SecureValue", |
||||
func() runtime.Object { return &SecureValue{} }, |
||||
func() runtime.Object { return &SecureValueList{} }, |
||||
utils.TableColumns{ |
||||
Definition: []metav1.TableColumnDefinition{ |
||||
{Name: "Name", Type: "string", Format: "name"}, |
||||
{Name: "Description", Type: "string", Format: "string", Description: "Short description that explains the purpose of this SecureValue"}, |
||||
{Name: "Keeper", Type: "string", Format: "string", Description: "Storage of the secure value"}, |
||||
{Name: "Ref", Type: "string", Format: "string", Description: "If present, the reference to a secret"}, |
||||
}, |
||||
Reader: func(obj any) ([]any, error) { |
||||
if r, ok := obj.(*SecureValue); ok { |
||||
return []any{r.Name, r.Spec.Description, r.Spec.Keeper, r.Spec.Ref}, nil |
||||
} |
||||
|
||||
return nil, fmt.Errorf("expected SecureValue but got %T", obj) |
||||
}, |
||||
}, |
||||
) |
||||
|
||||
var KeeperResourceInfo = utils.NewResourceInfo( |
||||
APIGroup, APIVersion, |
||||
"keepers", "keeper", "Keeper", |
||||
func() runtime.Object { return &Keeper{} }, |
||||
func() runtime.Object { return &KeeperList{} }, |
||||
utils.TableColumns{ |
||||
Definition: []metav1.TableColumnDefinition{ |
||||
{Name: "Name", Type: "string", Format: "name"}, |
||||
{Name: "Description", Type: "string", Format: "string", Description: "Short description for the Keeper"}, |
||||
}, |
||||
Reader: func(obj any) ([]any, error) { |
||||
if r, ok := obj.(*Keeper); ok { |
||||
return []any{r.Name, r.Spec.Description}, nil |
||||
} |
||||
|
||||
return nil, fmt.Errorf("expected Keeper but got %T", obj) |
||||
}, |
||||
}, |
||||
) |
||||
|
||||
// SchemeGroupVersion is group version used to register these objects.
|
||||
var SchemeGroupVersion = schema.GroupVersion{Group: APIGroup, Version: APIVersion} |
||||
|
||||
// Adds the list of known types to the given scheme.
|
||||
func AddKnownTypes(scheme *runtime.Scheme, version string) error { |
||||
scheme.AddKnownTypes( |
||||
schema.GroupVersion{Group: APIGroup, Version: version}, |
||||
&SecureValue{}, |
||||
&SecureValueList{}, |
||||
&Keeper{}, |
||||
&KeeperList{}, |
||||
) |
||||
|
||||
return nil |
||||
} |
@ -0,0 +1,28 @@ |
||||
//
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"io" |
||||
|
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
) |
||||
|
||||
// SecureValueJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding
|
||||
type SecureValueJSONCodec struct{} |
||||
|
||||
// Read reads JSON-encoded bytes from `reader` and unmarshals them into `into`
|
||||
func (*SecureValueJSONCodec) Read(reader io.Reader, into resource.Object) error { |
||||
return json.NewDecoder(reader).Decode(into) |
||||
} |
||||
|
||||
// Write writes JSON-encoded bytes into `writer` marshaled from `from`
|
||||
func (*SecureValueJSONCodec) Write(writer io.Writer, from resource.Object) error { |
||||
return json.NewEncoder(writer).Encode(from) |
||||
} |
||||
|
||||
// Interface compliance checks
|
||||
var _ resource.Codec = &SecureValueJSONCodec{} |
@ -0,0 +1,31 @@ |
||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
time "time" |
||||
) |
||||
|
||||
// metadata contains embedded CommonMetadata and can be extended with custom string fields
|
||||
// TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
|
||||
// without external reference as using the CommonMetadata reference breaks thema codegen.
|
||||
type SecureValueMetadata struct { |
||||
UpdateTimestamp time.Time `json:"updateTimestamp"` |
||||
CreatedBy string `json:"createdBy"` |
||||
Uid string `json:"uid"` |
||||
CreationTimestamp time.Time `json:"creationTimestamp"` |
||||
DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"` |
||||
Finalizers []string `json:"finalizers"` |
||||
ResourceVersion string `json:"resourceVersion"` |
||||
Generation int64 `json:"generation"` |
||||
UpdatedBy string `json:"updatedBy"` |
||||
Labels map[string]string `json:"labels"` |
||||
} |
||||
|
||||
// NewSecureValueMetadata creates a new SecureValueMetadata object.
|
||||
func NewSecureValueMetadata() *SecureValueMetadata { |
||||
return &SecureValueMetadata{ |
||||
Finalizers: []string{}, |
||||
Labels: map[string]string{}, |
||||
} |
||||
} |
@ -0,0 +1,319 @@ |
||||
//
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"fmt" |
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
||||
"k8s.io/apimachinery/pkg/runtime" |
||||
"k8s.io/apimachinery/pkg/runtime/schema" |
||||
"k8s.io/apimachinery/pkg/types" |
||||
"time" |
||||
) |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValue struct { |
||||
metav1.TypeMeta `json:",inline" yaml:",inline"` |
||||
metav1.ObjectMeta `json:"metadata" yaml:"metadata"` |
||||
|
||||
// Spec is the spec of the SecureValue
|
||||
Spec SecureValueSpec `json:"spec" yaml:"spec"` |
||||
|
||||
Status SecureValueStatus `json:"status" yaml:"status"` |
||||
} |
||||
|
||||
func (o *SecureValue) GetSpec() any { |
||||
return o.Spec |
||||
} |
||||
|
||||
func (o *SecureValue) SetSpec(spec any) error { |
||||
cast, ok := spec.(SecureValueSpec) |
||||
if !ok { |
||||
return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec) |
||||
} |
||||
o.Spec = cast |
||||
return nil |
||||
} |
||||
|
||||
func (o *SecureValue) GetSubresources() map[string]any { |
||||
return map[string]any{ |
||||
"status": o.Status, |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValue) GetSubresource(name string) (any, bool) { |
||||
switch name { |
||||
case "status": |
||||
return o.Status, true |
||||
default: |
||||
return nil, false |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValue) SetSubresource(name string, value any) error { |
||||
switch name { |
||||
case "status": |
||||
cast, ok := value.(SecureValueStatus) |
||||
if !ok { |
||||
return fmt.Errorf("cannot set status type %#v, not of type SecureValueStatus", value) |
||||
} |
||||
o.Status = cast |
||||
return nil |
||||
default: |
||||
return fmt.Errorf("subresource '%s' does not exist", name) |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValue) GetStaticMetadata() resource.StaticMetadata { |
||||
gvk := o.GroupVersionKind() |
||||
return resource.StaticMetadata{ |
||||
Name: o.ObjectMeta.Name, |
||||
Namespace: o.ObjectMeta.Namespace, |
||||
Group: gvk.Group, |
||||
Version: gvk.Version, |
||||
Kind: gvk.Kind, |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValue) SetStaticMetadata(metadata resource.StaticMetadata) { |
||||
o.Name = metadata.Name |
||||
o.Namespace = metadata.Namespace |
||||
o.SetGroupVersionKind(schema.GroupVersionKind{ |
||||
Group: metadata.Group, |
||||
Version: metadata.Version, |
||||
Kind: metadata.Kind, |
||||
}) |
||||
} |
||||
|
||||
func (o *SecureValue) GetCommonMetadata() resource.CommonMetadata { |
||||
dt := o.DeletionTimestamp |
||||
var deletionTimestamp *time.Time |
||||
if dt != nil { |
||||
deletionTimestamp = &dt.Time |
||||
} |
||||
// Legacy ExtraFields support
|
||||
extraFields := make(map[string]any) |
||||
if o.Annotations != nil { |
||||
extraFields["annotations"] = o.Annotations |
||||
} |
||||
if o.ManagedFields != nil { |
||||
extraFields["managedFields"] = o.ManagedFields |
||||
} |
||||
if o.OwnerReferences != nil { |
||||
extraFields["ownerReferences"] = o.OwnerReferences |
||||
} |
||||
return resource.CommonMetadata{ |
||||
UID: string(o.UID), |
||||
ResourceVersion: o.ResourceVersion, |
||||
Generation: o.Generation, |
||||
Labels: o.Labels, |
||||
CreationTimestamp: o.CreationTimestamp.Time, |
||||
DeletionTimestamp: deletionTimestamp, |
||||
Finalizers: o.Finalizers, |
||||
UpdateTimestamp: o.GetUpdateTimestamp(), |
||||
CreatedBy: o.GetCreatedBy(), |
||||
UpdatedBy: o.GetUpdatedBy(), |
||||
ExtraFields: extraFields, |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValue) SetCommonMetadata(metadata resource.CommonMetadata) { |
||||
o.UID = types.UID(metadata.UID) |
||||
o.ResourceVersion = metadata.ResourceVersion |
||||
o.Generation = metadata.Generation |
||||
o.Labels = metadata.Labels |
||||
o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp) |
||||
if metadata.DeletionTimestamp != nil { |
||||
dt := metav1.NewTime(*metadata.DeletionTimestamp) |
||||
o.DeletionTimestamp = &dt |
||||
} else { |
||||
o.DeletionTimestamp = nil |
||||
} |
||||
o.Finalizers = metadata.Finalizers |
||||
if o.Annotations == nil { |
||||
o.Annotations = make(map[string]string) |
||||
} |
||||
if !metadata.UpdateTimestamp.IsZero() { |
||||
o.SetUpdateTimestamp(metadata.UpdateTimestamp) |
||||
} |
||||
if metadata.CreatedBy != "" { |
||||
o.SetCreatedBy(metadata.CreatedBy) |
||||
} |
||||
if metadata.UpdatedBy != "" { |
||||
o.SetUpdatedBy(metadata.UpdatedBy) |
||||
} |
||||
// Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields
|
||||
if metadata.ExtraFields != nil { |
||||
if annotations, ok := metadata.ExtraFields["annotations"]; ok { |
||||
if cast, ok := annotations.(map[string]string); ok { |
||||
o.Annotations = cast |
||||
} |
||||
} |
||||
if managedFields, ok := metadata.ExtraFields["managedFields"]; ok { |
||||
if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok { |
||||
o.ManagedFields = cast |
||||
} |
||||
} |
||||
if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok { |
||||
if cast, ok := ownerReferences.([]metav1.OwnerReference); ok { |
||||
o.OwnerReferences = cast |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValue) GetCreatedBy() string { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
return o.ObjectMeta.Annotations["grafana.com/createdBy"] |
||||
} |
||||
|
||||
func (o *SecureValue) SetCreatedBy(createdBy string) { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy |
||||
} |
||||
|
||||
func (o *SecureValue) GetUpdateTimestamp() time.Time { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"]) |
||||
return parsed |
||||
} |
||||
|
||||
func (o *SecureValue) SetUpdateTimestamp(updateTimestamp time.Time) { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339) |
||||
} |
||||
|
||||
func (o *SecureValue) GetUpdatedBy() string { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
return o.ObjectMeta.Annotations["grafana.com/updatedBy"] |
||||
} |
||||
|
||||
func (o *SecureValue) SetUpdatedBy(updatedBy string) { |
||||
if o.ObjectMeta.Annotations == nil { |
||||
o.ObjectMeta.Annotations = make(map[string]string) |
||||
} |
||||
|
||||
o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy |
||||
} |
||||
|
||||
func (o *SecureValue) Copy() resource.Object { |
||||
return resource.CopyObject(o) |
||||
} |
||||
|
||||
func (o *SecureValue) DeepCopyObject() runtime.Object { |
||||
return o.Copy() |
||||
} |
||||
|
||||
func (o *SecureValue) DeepCopy() *SecureValue { |
||||
cpy := &SecureValue{} |
||||
o.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
func (o *SecureValue) DeepCopyInto(dst *SecureValue) { |
||||
dst.TypeMeta.APIVersion = o.TypeMeta.APIVersion |
||||
dst.TypeMeta.Kind = o.TypeMeta.Kind |
||||
o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta) |
||||
o.Spec.DeepCopyInto(&dst.Spec) |
||||
o.Status.DeepCopyInto(&dst.Status) |
||||
} |
||||
|
||||
// Interface compliance compile-time check
|
||||
var _ resource.Object = &SecureValue{} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValueList struct { |
||||
metav1.TypeMeta `json:",inline" yaml:",inline"` |
||||
metav1.ListMeta `json:"metadata" yaml:"metadata"` |
||||
Items []SecureValue `json:"items" yaml:"items"` |
||||
} |
||||
|
||||
func (o *SecureValueList) DeepCopyObject() runtime.Object { |
||||
return o.Copy() |
||||
} |
||||
|
||||
func (o *SecureValueList) Copy() resource.ListObject { |
||||
cpy := &SecureValueList{ |
||||
TypeMeta: o.TypeMeta, |
||||
Items: make([]SecureValue, len(o.Items)), |
||||
} |
||||
o.ListMeta.DeepCopyInto(&cpy.ListMeta) |
||||
for i := 0; i < len(o.Items); i++ { |
||||
if item, ok := o.Items[i].Copy().(*SecureValue); ok { |
||||
cpy.Items[i] = *item |
||||
} |
||||
} |
||||
return cpy |
||||
} |
||||
|
||||
func (o *SecureValueList) GetItems() []resource.Object { |
||||
items := make([]resource.Object, len(o.Items)) |
||||
for i := 0; i < len(o.Items); i++ { |
||||
items[i] = &o.Items[i] |
||||
} |
||||
return items |
||||
} |
||||
|
||||
func (o *SecureValueList) SetItems(items []resource.Object) { |
||||
o.Items = make([]SecureValue, len(items)) |
||||
for i := 0; i < len(items); i++ { |
||||
o.Items[i] = *items[i].(*SecureValue) |
||||
} |
||||
} |
||||
|
||||
func (o *SecureValueList) DeepCopy() *SecureValueList { |
||||
cpy := &SecureValueList{} |
||||
o.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
func (o *SecureValueList) DeepCopyInto(dst *SecureValueList) { |
||||
resource.CopyObjectInto(dst, o) |
||||
} |
||||
|
||||
// Interface compliance compile-time check
|
||||
var _ resource.ListObject = &SecureValueList{} |
||||
|
||||
// Copy methods for all subresource types
|
||||
|
||||
// DeepCopy creates a full deep copy of Spec
|
||||
func (s *SecureValueSpec) DeepCopy() *SecureValueSpec { |
||||
cpy := &SecureValueSpec{} |
||||
s.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
// DeepCopyInto deep copies Spec into another Spec object
|
||||
func (s *SecureValueSpec) DeepCopyInto(dst *SecureValueSpec) { |
||||
resource.CopyObjectInto(dst, s) |
||||
} |
||||
|
||||
// DeepCopy creates a full deep copy of SecureValueStatus
|
||||
func (s *SecureValueStatus) DeepCopy() *SecureValueStatus { |
||||
cpy := &SecureValueStatus{} |
||||
s.DeepCopyInto(cpy) |
||||
return cpy |
||||
} |
||||
|
||||
// DeepCopyInto deep copies SecureValueStatus into another SecureValueStatus object
|
||||
func (s *SecureValueStatus) DeepCopyInto(dst *SecureValueStatus) { |
||||
resource.CopyObjectInto(dst, s) |
||||
} |
@ -0,0 +1,34 @@ |
||||
//
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
//
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
) |
||||
|
||||
// schema is unexported to prevent accidental overwrites
|
||||
var ( |
||||
schemaSecureValue = resource.NewSimpleSchema("secret.grafana.app", "v1beta1", &SecureValue{}, &SecureValueList{}, resource.WithKind("SecureValue"), |
||||
resource.WithPlural("securevalues"), resource.WithScope(resource.NamespacedScope)) |
||||
kindSecureValue = resource.Kind{ |
||||
Schema: schemaSecureValue, |
||||
Codecs: map[resource.KindEncoding]resource.Codec{ |
||||
resource.KindEncodingJSON: &SecureValueJSONCodec{}, |
||||
}, |
||||
} |
||||
) |
||||
|
||||
// Kind returns a resource.Kind for this Schema with a JSON codec
|
||||
func SecureValueKind() resource.Kind { |
||||
return kindSecureValue |
||||
} |
||||
|
||||
// Schema returns a resource.SimpleSchema representation of SecureValue
|
||||
func SecureValueSchema() *resource.SimpleSchema { |
||||
return schemaSecureValue |
||||
} |
||||
|
||||
// Interface compliance checks
|
||||
var _ resource.Schema = kindSecureValue |
@ -0,0 +1,46 @@ |
||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
// ExposedSecureValue contains the raw decrypted secure value.
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValueExposedSecureValue string |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValueSpec struct { |
||||
// Short description that explains the purpose of this SecureValue.
|
||||
// +k8s:validation:minLength=1
|
||||
// +k8s:validation:maxLength=25
|
||||
Description string `json:"description"` |
||||
// The raw value is only valid for write. Read/List will always be empty.
|
||||
// There is no support for mixing `value` and `ref`, you can't create a secret in a third-party keeper with a specified `ref`.
|
||||
// Minimum and maximum lengths in bytes.
|
||||
// +k8s:validation:minLength=1
|
||||
// +k8s:validation:maxLength=24576
|
||||
// +optional
|
||||
Value *SecureValueExposedSecureValue `json:"value,omitempty"` |
||||
// When using a third-party keeper, the `ref` is used to reference a value inside the remote storage.
|
||||
// This should not contain sensitive information.
|
||||
// +k8s:validation:minLength=1
|
||||
// +k8s:validation:maxLength=1024
|
||||
// +optional
|
||||
Ref *string `json:"ref,omitempty"` |
||||
// Name of the keeper, being the actual storage of the secure value.
|
||||
// If not specified, the default keeper for the namespace will be used.
|
||||
// +k8s:validation:minLength=1
|
||||
// +k8s:validation:maxLength=253
|
||||
// +optional
|
||||
Keeper *string `json:"keeper,omitempty"` |
||||
// The Decrypters that are allowed to decrypt this secret.
|
||||
// An empty list means no service can decrypt it.
|
||||
// +k8s:validation:maxItems=64
|
||||
// +k8s:validation:uniqueItems=true
|
||||
// +listType=atomic
|
||||
// +optional
|
||||
Decrypters []string `json:"decrypters,omitempty"` |
||||
} |
||||
|
||||
// NewSecureValueSpec creates a new SecureValueSpec object.
|
||||
func NewSecureValueSpec() *SecureValueSpec { |
||||
return &SecureValueSpec{} |
||||
} |
@ -0,0 +1,47 @@ |
||||
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValuestatusOperatorState struct { |
||||
// lastEvaluation is the ResourceVersion last evaluated
|
||||
LastEvaluation string `json:"lastEvaluation"` |
||||
// state describes the state of the lastEvaluation.
|
||||
// It is limited to three possible states for machine evaluation.
|
||||
State SecureValueStatusOperatorStateState `json:"state"` |
||||
// descriptiveState is an optional more descriptive state field which has no requirements on format
|
||||
DescriptiveState *string `json:"descriptiveState,omitempty"` |
||||
// details contains any extra information that is operator-specific
|
||||
Details map[string]interface{} `json:"details,omitempty"` |
||||
} |
||||
|
||||
// NewSecureValuestatusOperatorState creates a new SecureValuestatusOperatorState object.
|
||||
func NewSecureValuestatusOperatorState() *SecureValuestatusOperatorState { |
||||
return &SecureValuestatusOperatorState{} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValueStatus struct { |
||||
Version int64 `json:"version"` |
||||
// operatorStates is a map of operator ID to operator state evaluations.
|
||||
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
|
||||
OperatorStates map[string]SecureValuestatusOperatorState `json:"operatorStates,omitempty"` |
||||
// +optional
|
||||
ExternalID string `json:"externalID"` |
||||
// additionalFields is reserved for future use
|
||||
AdditionalFields map[string]interface{} `json:"additionalFields,omitempty"` |
||||
} |
||||
|
||||
// NewSecureValueStatus creates a new SecureValueStatus object.
|
||||
func NewSecureValueStatus() *SecureValueStatus { |
||||
return &SecureValueStatus{} |
||||
} |
||||
|
||||
// +k8s:openapi-gen=true
|
||||
type SecureValueStatusOperatorStateState string |
||||
|
||||
const ( |
||||
SecureValueStatusOperatorStateStateSuccess SecureValueStatusOperatorStateState = "success" |
||||
SecureValueStatusOperatorStateStateInProgress SecureValueStatusOperatorStateState = "in_progress" |
||||
SecureValueStatusOperatorStateStateFailed SecureValueStatusOperatorStateState = "failed" |
||||
) |
@ -0,0 +1,736 @@ |
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
// Code generated by grafana-app-sdk. DO NOT EDIT.
|
||||
|
||||
package v1beta1 |
||||
|
||||
import ( |
||||
common "k8s.io/kube-openapi/pkg/common" |
||||
spec "k8s.io/kube-openapi/pkg/validation/spec" |
||||
ptr "k8s.io/utils/ptr" |
||||
) |
||||
|
||||
func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { |
||||
return map[string]common.OpenAPIDefinition{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.Keeper": schema_pkg_apis_secret_v1beta1_Keeper(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperAWSConfig": schema_pkg_apis_secret_v1beta1_KeeperAWSConfig(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperAzureConfig": schema_pkg_apis_secret_v1beta1_KeeperAzureConfig(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue": schema_pkg_apis_secret_v1beta1_KeeperCredentialValue(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperGCPConfig": schema_pkg_apis_secret_v1beta1_KeeperGCPConfig(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperHashiCorpConfig": schema_pkg_apis_secret_v1beta1_KeeperHashiCorpConfig(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperList": schema_pkg_apis_secret_v1beta1_KeeperList(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperSpec": schema_pkg_apis_secret_v1beta1_KeeperSpec(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperStatus": schema_pkg_apis_secret_v1beta1_KeeperStatus(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperstatusOperatorState": schema_pkg_apis_secret_v1beta1_KeeperstatusOperatorState(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValue": schema_pkg_apis_secret_v1beta1_SecureValue(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueList": schema_pkg_apis_secret_v1beta1_SecureValueList(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueSpec": schema_pkg_apis_secret_v1beta1_SecureValueSpec(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueStatus": schema_pkg_apis_secret_v1beta1_SecureValueStatus(ref), |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValuestatusOperatorState": schema_pkg_apis_secret_v1beta1_SecureValuestatusOperatorState(ref), |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_Keeper(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"kind": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"apiVersion": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"metadata": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), |
||||
}, |
||||
}, |
||||
"spec": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Spec is the spec of the Keeper", |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperSpec"), |
||||
}, |
||||
}, |
||||
"status": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperStatus"), |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"metadata", "spec", "status"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperSpec", "github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperAWSConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"accessKeyID": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"), |
||||
}, |
||||
}, |
||||
"secretAccessKey": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"), |
||||
}, |
||||
}, |
||||
"kmsKeyID": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"accessKeyID", "secretAccessKey"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperAzureConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"keyVaultName": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"tenantID": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"clientID": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"clientSecret": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"), |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"keyVaultName", "tenantID", "clientID", "clientSecret"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperCredentialValue(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"secureValueName": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "The name of the secure value that holds the actual value.", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"valueFromEnv": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "The value is taken from the environment variable.", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"valueFromConfig": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "The value is taken from the Grafana config file.", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperGCPConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"projectID": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"credentialsFile": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"projectID", "credentialsFile"}, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperHashiCorpConfig(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"address": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"token": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"), |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"address", "token"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperCredentialValue"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperList(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"kind": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"apiVersion": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"metadata": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), |
||||
}, |
||||
}, |
||||
"items": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"array"}, |
||||
Items: &spec.SchemaOrArray{ |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.Keeper"), |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"metadata", "items"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.Keeper", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"description": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Short description for the Keeper.", |
||||
Default: "", |
||||
MinLength: ptr.To[int64](1), |
||||
MaxLength: ptr.To[int64](253), |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"aws": { |
||||
VendorExtensible: spec.VendorExtensible{ |
||||
Extensions: spec.Extensions{ |
||||
"x-kubernetes-map-type": "atomic", |
||||
}, |
||||
}, |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "AWS Keeper Configuration.", |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperAWSConfig"), |
||||
}, |
||||
}, |
||||
"azure": { |
||||
VendorExtensible: spec.VendorExtensible{ |
||||
Extensions: spec.Extensions{ |
||||
"x-kubernetes-map-type": "atomic", |
||||
}, |
||||
}, |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Azure Keeper Configuration.", |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperAzureConfig"), |
||||
}, |
||||
}, |
||||
"gcp": { |
||||
VendorExtensible: spec.VendorExtensible{ |
||||
Extensions: spec.Extensions{ |
||||
"x-kubernetes-map-type": "atomic", |
||||
}, |
||||
}, |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "GCP Keeper Configuration.", |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperGCPConfig"), |
||||
}, |
||||
}, |
||||
"hashiCorpVault": { |
||||
VendorExtensible: spec.VendorExtensible{ |
||||
Extensions: spec.Extensions{ |
||||
"x-kubernetes-map-type": "atomic", |
||||
}, |
||||
}, |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "HashiCorp Vault Keeper Configuration.", |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperHashiCorpConfig"), |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"description"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperAWSConfig", "github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperAzureConfig", "github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperGCPConfig", "github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperHashiCorpConfig"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"operatorStates": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "operatorStates is a map of operator ID to operator state evaluations. Any operator which consumes this kind SHOULD add its state evaluation information to this field.", |
||||
Type: []string{"object"}, |
||||
AdditionalProperties: &spec.SchemaOrBool{ |
||||
Allows: true, |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperstatusOperatorState"), |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
"additionalFields": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "additionalFields is reserved for future use", |
||||
Type: []string{"object"}, |
||||
AdditionalProperties: &spec.SchemaOrBool{ |
||||
Allows: true, |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.KeeperstatusOperatorState"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_KeeperstatusOperatorState(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"lastEvaluation": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "lastEvaluation is the ResourceVersion last evaluated", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"state": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "state describes the state of the lastEvaluation. It is limited to three possible states for machine evaluation.", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"descriptiveState": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "descriptiveState is an optional more descriptive state field which has no requirements on format", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"details": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "details contains any extra information that is operator-specific", |
||||
Type: []string{"object"}, |
||||
AdditionalProperties: &spec.SchemaOrBool{ |
||||
Allows: true, |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"lastEvaluation", "state"}, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_SecureValue(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"kind": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"apiVersion": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"metadata": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), |
||||
}, |
||||
}, |
||||
"spec": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Spec is the spec of the SecureValue", |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueSpec"), |
||||
}, |
||||
}, |
||||
"status": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueStatus"), |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"metadata", "spec", "status"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueSpec", "github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValueStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_SecureValueList(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"kind": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"apiVersion": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"metadata": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), |
||||
}, |
||||
}, |
||||
"items": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"array"}, |
||||
Items: &spec.SchemaOrArray{ |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValue"), |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"metadata", "items"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValue", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_SecureValueSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"description": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Short description that explains the purpose of this SecureValue.", |
||||
Default: "", |
||||
MinLength: ptr.To[int64](1), |
||||
MaxLength: ptr.To[int64](25), |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"value": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "The raw value is only valid for write. Read/List will always be empty. There is no support for mixing `value` and `ref`, you can't create a secret in a third-party keeper with a specified `ref`. Minimum and maximum lengths in bytes.", |
||||
MinLength: ptr.To[int64](1), |
||||
MaxLength: ptr.To[int64](24576), |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"ref": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "When using a third-party keeper, the `ref` is used to reference a value inside the remote storage. This should not contain sensitive information.", |
||||
MinLength: ptr.To[int64](1), |
||||
MaxLength: ptr.To[int64](1024), |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"keeper": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "Name of the keeper, being the actual storage of the secure value. If not specified, the default keeper for the namespace will be used.", |
||||
MinLength: ptr.To[int64](1), |
||||
MaxLength: ptr.To[int64](253), |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"decrypters": { |
||||
VendorExtensible: spec.VendorExtensible{ |
||||
Extensions: spec.Extensions{ |
||||
"x-kubernetes-list-type": "atomic", |
||||
}, |
||||
}, |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "The Decrypters that are allowed to decrypt this secret. An empty list means no service can decrypt it.", |
||||
MaxItems: ptr.To[int64](64), |
||||
UniqueItems: true, |
||||
Type: []string{"array"}, |
||||
Items: &spec.SchemaOrArray{ |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"description"}, |
||||
}, |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_SecureValueStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"version": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: 0, |
||||
Type: []string{"integer"}, |
||||
Format: "int64", |
||||
}, |
||||
}, |
||||
"operatorStates": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "operatorStates is a map of operator ID to operator state evaluations. Any operator which consumes this kind SHOULD add its state evaluation information to this field.", |
||||
Type: []string{"object"}, |
||||
AdditionalProperties: &spec.SchemaOrBool{ |
||||
Allows: true, |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: map[string]interface{}{}, |
||||
Ref: ref("github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValuestatusOperatorState"), |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
"externalID": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"additionalFields": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "additionalFields is reserved for future use", |
||||
Type: []string{"object"}, |
||||
AdditionalProperties: &spec.SchemaOrBool{ |
||||
Allows: true, |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"version"}, |
||||
}, |
||||
}, |
||||
Dependencies: []string{ |
||||
"github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1.SecureValuestatusOperatorState"}, |
||||
} |
||||
} |
||||
|
||||
func schema_pkg_apis_secret_v1beta1_SecureValuestatusOperatorState(ref common.ReferenceCallback) common.OpenAPIDefinition { |
||||
return common.OpenAPIDefinition{ |
||||
Schema: spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Properties: map[string]spec.Schema{ |
||||
"lastEvaluation": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "lastEvaluation is the ResourceVersion last evaluated", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"state": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "state describes the state of the lastEvaluation. It is limited to three possible states for machine evaluation.", |
||||
Default: "", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"descriptiveState": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "descriptiveState is an optional more descriptive state field which has no requirements on format", |
||||
Type: []string{"string"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
"details": { |
||||
SchemaProps: spec.SchemaProps{ |
||||
Description: "details contains any extra information that is operator-specific", |
||||
Type: []string{"object"}, |
||||
AdditionalProperties: &spec.SchemaOrBool{ |
||||
Allows: true, |
||||
Schema: &spec.Schema{ |
||||
SchemaProps: spec.SchemaProps{ |
||||
Type: []string{"object"}, |
||||
Format: "", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
Required: []string{"lastEvaluation", "state"}, |
||||
}, |
||||
}, |
||||
} |
||||
} |
@ -0,0 +1,65 @@ |
||||
//
|
||||
// This file is generated by grafana-app-sdk
|
||||
// DO NOT EDIT
|
||||
//
|
||||
|
||||
package apis |
||||
|
||||
import ( |
||||
"fmt" |
||||
|
||||
"github.com/grafana/grafana-app-sdk/app" |
||||
"github.com/grafana/grafana-app-sdk/resource" |
||||
|
||||
v1beta1 "github.com/grafana/grafana/apps/secret/pkg/apis/secret/v1beta1" |
||||
) |
||||
|
||||
var () |
||||
|
||||
var appManifestData = app.ManifestData{ |
||||
AppName: "secret", |
||||
Group: "secret.grafana.app", |
||||
Kinds: []app.ManifestKind{ |
||||
{ |
||||
Kind: "SecureValue", |
||||
Scope: "Namespaced", |
||||
Conversion: false, |
||||
Versions: []app.ManifestKindVersion{ |
||||
{ |
||||
Name: "v1beta1", |
||||
}, |
||||
}, |
||||
}, |
||||
|
||||
{ |
||||
Kind: "Keeper", |
||||
Scope: "Namespaced", |
||||
Conversion: false, |
||||
Versions: []app.ManifestKindVersion{ |
||||
{ |
||||
Name: "v1beta1", |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
} |
||||
|
||||
func LocalManifest() app.Manifest { |
||||
return app.NewEmbeddedManifest(appManifestData) |
||||
} |
||||
|
||||
func RemoteManifest() app.Manifest { |
||||
return app.NewAPIServerManifest("secret") |
||||
} |
||||
|
||||
var kindVersionToGoType = map[string]resource.Kind{ |
||||
"SecureValue/v1beta1": v1beta1.SecureValueKind(), |
||||
"Keeper/v1beta1": v1beta1.KeeperKind(), |
||||
} |
||||
|
||||
// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists.
|
||||
// If there is no association for the provided Kind and Version, exists will return false.
|
||||
func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { |
||||
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] |
||||
return goType, exists |
||||
} |
Loading…
Reference in new issue