Skip to content

Commit 86e715d

Browse files
committed
Add support for credentials
Signed-off-by: Bob Haddleton <[email protected]>
1 parent 00beeb1 commit 86e715d

File tree

5 files changed

+164
-42
lines changed

5 files changed

+164
-42
lines changed

crossplane/function/proto/v1beta1/run_function.proto

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,24 @@ message RunFunctionRequest {
6969
// did not exist, Crossplane sets the map key to an empty Resources message to
7070
// indicate that it attempted to satisfy the request.
7171
map<string, Resources> extra_resources = 6;
72+
73+
// Optional credentials that this Function may use to communicate with an
74+
// external system.
75+
map <string, Credentials> credentials = 7;
76+
}
77+
78+
// Credentials that a Function may use to communicate with an external system.
79+
message Credentials {
80+
// Source of the credentials.
81+
oneof source {
82+
// Credential data loaded by Crossplane, for example from a Secret.
83+
CredentialData credential_data = 1;
84+
}
85+
}
86+
87+
// CredentialData loaded by Crossplane, for example from a Secret.
88+
message CredentialData {
89+
map<string, bytes> data = 1;
7290
}
7391

7492
// Resources represents the state of several Crossplane resources.
@@ -238,4 +256,4 @@ enum Severity {
238256
// Normal results are emitted as normal events and debug logs associated
239257
// with the composite resource.
240258
SEVERITY_NORMAL = 3;
241-
}
259+
}

crossplane/function/proto/v1beta1/run_function_pb2.py

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

crossplane/function/proto/v1beta1/run_function_pb2.pyi

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,55 @@ SEVERITY_WARNING: Severity
2929
SEVERITY_NORMAL: Severity
3030

3131
class RunFunctionRequest(_message.Message):
32-
__slots__ = ("meta", "observed", "desired", "input", "context", "extra_resources")
32+
__slots__ = ("meta", "observed", "desired", "input", "context", "extra_resources", "credentials")
3333
class ExtraResourcesEntry(_message.Message):
3434
__slots__ = ("key", "value")
3535
KEY_FIELD_NUMBER: _ClassVar[int]
3636
VALUE_FIELD_NUMBER: _ClassVar[int]
3737
key: str
3838
value: Resources
3939
def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[Resources, _Mapping]] = ...) -> None: ...
40+
class CredentialsEntry(_message.Message):
41+
__slots__ = ("key", "value")
42+
KEY_FIELD_NUMBER: _ClassVar[int]
43+
VALUE_FIELD_NUMBER: _ClassVar[int]
44+
key: str
45+
value: Credentials
46+
def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[Credentials, _Mapping]] = ...) -> None: ...
4047
META_FIELD_NUMBER: _ClassVar[int]
4148
OBSERVED_FIELD_NUMBER: _ClassVar[int]
4249
DESIRED_FIELD_NUMBER: _ClassVar[int]
4350
INPUT_FIELD_NUMBER: _ClassVar[int]
4451
CONTEXT_FIELD_NUMBER: _ClassVar[int]
4552
EXTRA_RESOURCES_FIELD_NUMBER: _ClassVar[int]
53+
CREDENTIALS_FIELD_NUMBER: _ClassVar[int]
4654
meta: RequestMeta
4755
observed: State
4856
desired: State
4957
input: _struct_pb2.Struct
5058
context: _struct_pb2.Struct
5159
extra_resources: _containers.MessageMap[str, Resources]
52-
def __init__(self, meta: _Optional[_Union[RequestMeta, _Mapping]] = ..., observed: _Optional[_Union[State, _Mapping]] = ..., desired: _Optional[_Union[State, _Mapping]] = ..., input: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., context: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., extra_resources: _Optional[_Mapping[str, Resources]] = ...) -> None: ...
60+
credentials: _containers.MessageMap[str, Credentials]
61+
def __init__(self, meta: _Optional[_Union[RequestMeta, _Mapping]] = ..., observed: _Optional[_Union[State, _Mapping]] = ..., desired: _Optional[_Union[State, _Mapping]] = ..., input: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., context: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., extra_resources: _Optional[_Mapping[str, Resources]] = ..., credentials: _Optional[_Mapping[str, Credentials]] = ...) -> None: ...
62+
63+
class Credentials(_message.Message):
64+
__slots__ = ("credential_data",)
65+
CREDENTIAL_DATA_FIELD_NUMBER: _ClassVar[int]
66+
credential_data: CredentialData
67+
def __init__(self, credential_data: _Optional[_Union[CredentialData, _Mapping]] = ...) -> None: ...
68+
69+
class CredentialData(_message.Message):
70+
__slots__ = ("data",)
71+
class DataEntry(_message.Message):
72+
__slots__ = ("key", "value")
73+
KEY_FIELD_NUMBER: _ClassVar[int]
74+
VALUE_FIELD_NUMBER: _ClassVar[int]
75+
key: str
76+
value: bytes
77+
def __init__(self, key: _Optional[str] = ..., value: _Optional[bytes] = ...) -> None: ...
78+
DATA_FIELD_NUMBER: _ClassVar[int]
79+
data: _containers.ScalarMap[str, bytes]
80+
def __init__(self, data: _Optional[_Mapping[str, bytes]] = ...) -> None: ...
5381

5482
class Resources(_message.Message):
5583
__slots__ = ("items",)

crossplane/function/resource.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,24 @@ def get_condition(resource: structpb.Struct, typ: str) -> Condition:
106106
return condition
107107

108108
return unknown
109+
110+
111+
@dataclasses.dataclass
112+
class Credentials:
113+
"""Credentials."""
114+
115+
type: str
116+
data: dict
117+
118+
119+
def get_credentials(req: structpb.Struct, name: str) -> Credentials:
120+
"""Get the supplied credentials."""
121+
empty = Credentials(type="data", data={})
122+
if "credentials" not in req:
123+
return empty
124+
if name not in req["credentials"]:
125+
return empty
126+
return Credentials(
127+
type=req["credentials"][name]["type"],
128+
data=struct_to_dict(req["credentials"][name]["data"]),
129+
)

0 commit comments

Comments
 (0)