Repository: clouditor/clouditor
Pull request #557 (2022-03-05 21:27:16)

Requirements API
This adds new endpoints to manage the selection of requirements / criteria of a cloud service in the orchestrator.

codecov[bot]: # [Codecov](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) Report
> Merging [#557](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) (db4c7a0) into [oauth-authorizer](https://codecov.io/gh/clouditor/clouditor/commit/35f1abbee152f310c9013f2600e20ba7f75bca87?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) (35f1abb) will **decrease** coverage by `0.73%`.
> The diff coverage is `50.00%`.

[![Impacted file tree graph](https://codecov.io/gh/clouditor/clouditor/pull/557/graphs/tree.svg?width=650&height=150&src=pr&token=syrXsw5LTX&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor)](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor)

```diff
@@                 Coverage Diff                  @@
##           oauth-authorizer     #557      +/-   ##
====================================================
- Coverage             81.55%   80.82%   -0.74%     
====================================================
  Files                    53       56       +3     
  Lines                  4787     4901     +114     
====================================================
+ Hits                   3904     3961      +57     
- Misses                  696      748      +52     
- Partials                187      192       +5     
```

| Flag | Coverage Δ | |
|---|---|---|
| unittests | `80.82% <50.00%> (-0.74%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor) | Coverage Δ | |
|---|---|---|
| [cli/session.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-Y2xpL3Nlc3Npb24uZ28=) | `40.94% <0.00%> (-5.40%)` | :arrow_down: |
| [service/orchestrator/orchestrator.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-c2VydmljZS9vcmNoZXN0cmF0b3Ivb3JjaGVzdHJhdG9yLmdv) | `79.01% <12.50%> (-3.46%)` | :arrow_down: |
| [api/orchestrator/orchestrator.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-YXBpL29yY2hlc3RyYXRvci9vcmNoZXN0cmF0b3IuZ28=) | `33.33% <33.33%> (ø)` | |
| [service/orchestrator/requirements.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-c2VydmljZS9vcmNoZXN0cmF0b3IvcmVxdWlyZW1lbnRzLmdv) | `66.66% <66.66%> (ø)` | |
| [cli/commands/requirement/requirement.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-Y2xpL2NvbW1hbmRzL3JlcXVpcmVtZW50L3JlcXVpcmVtZW50Lmdv) | `81.57% <81.57%> (ø)` | |
| [cli/commands/cloud/cloud.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-Y2xpL2NvbW1hbmRzL2Nsb3VkL2Nsb3VkLmdv) | `83.66% <100.00%> (+0.58%)` | :arrow_up: |
| [cli/commands/commands.go](https://codecov.io/gh/clouditor/clouditor/pull/557/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor#diff-Y2xpL2NvbW1hbmRzL2NvbW1hbmRzLmdv) | `100.00% <100.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor). Last update [35f1abb...db4c7a0](https://codecov.io/gh/clouditor/clouditor/pull/557?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=clouditor).


Patch:
diff --git a/api/orchestrator/orchestrator.go b/api/orchestrator/orchestrator.go
index 93860ae0..68c47c80 100644
--- a/api/orchestrator/orchestrator.go
+++ b/api/orchestrator/orchestrator.go
@@ -26,7 +26,9 @@
 package orchestrator
 
 import (
+	"database/sql/driver"
 	"errors"
+	"strings"
 )
 
 var (
@@ -35,3 +37,32 @@ var (
 	ErrNameIsMissing = errors.New("service name is empty")
 	ErrIDIsMissing   = errors.New("service ID is empty")
 )
+
+// Value implements https://pkg.go.dev/database/sql/driver#Valuer to indicate
+// how this struct will be saved into an SQL database field.
+func (c *CloudService_Requirements) Value() (driver.Value, error) {
+	if c == nil || c.RequirementIds == nil {
+		return nil, nil
+	} else {
+		return driver.Value(strings.Join(c.RequirementIds, ",")), nil
+	}
+}
+
+// Scan implements https://pkg.go.dev/database/sql#Scanner to indicate how
+// this struct can be loaded from an SQL database field.
+func (c *CloudService_Requirements) Scan(value interface{}) error {
+	switch v := value.(type) {
+	case string:
+		(*c).RequirementIds = strings.Split(v, ",")
+	default:
+		return errors.New("unsupported type")
+	}
+
+	return nil
+}
+
+// GormDataType implements GormDataTypeInterface to give an indication how
+// this struct will be serialized into a database using GORM.
+func (*CloudService_Requirements) GormDataType() string {
+	return "string"
+}
diff --git a/api/orchestrator/orchestrator.pb.go b/api/orchestrator/orchestrator.pb.go
index 0ee64f83..27146e93 100644
--- a/api/orchestrator/orchestrator.pb.go
+++ b/api/orchestrator/orchestrator.pb.go
@@ -676,6 +676,91 @@ func (x *ListMetricsResponse) GetMetrics() []*assessment.Metric {
 	return nil
 }
 
+type ListRequirementsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ListRequirementsRequest) Reset() {
+	*x = ListRequirementsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListRequirementsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListRequirementsRequest) ProtoMessage() {}
+
+func (x *ListRequirementsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListRequirementsRequest.ProtoReflect.Descriptor instead.
+func (*ListRequirementsRequest) Descriptor() ([]byte, []int) {
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{13}
+}
+
+type ListRequirementsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Requirements []*Requirement `protobuf:"bytes,1,rep,name=requirements,proto3" json:"requirements,omitempty"`
+}
+
+func (x *ListRequirementsResponse) Reset() {
+	*x = ListRequirementsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListRequirementsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListRequirementsResponse) ProtoMessage() {}
+
+func (x *ListRequirementsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListRequirementsResponse.ProtoReflect.Descriptor instead.
+func (*ListRequirementsResponse) Descriptor() ([]byte, []int) {
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ListRequirementsResponse) GetRequirements() []*Requirement {
+	if x != nil {
+		return x.Requirements
+	}
+	return nil
+}
+
 type GetCloudServiceRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -687,7 +772,7 @@ type GetCloudServiceRequest struct {
 func (x *GetCloudServiceRequest) Reset() {
 	*x = GetCloudServiceRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[13]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -700,7 +785,7 @@ func (x *GetCloudServiceRequest) String() string {
 func (*GetCloudServiceRequest) ProtoMessage() {}
 
 func (x *GetCloudServiceRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[13]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -713,7 +798,7 @@ func (x *GetCloudServiceRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetCloudServiceRequest.ProtoReflect.Descriptor instead.
 func (*GetCloudServiceRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{13}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *GetCloudServiceRequest) GetServiceId() string {
@@ -734,7 +819,7 @@ type RegisterCloudServiceRequest struct {
 func (x *RegisterCloudServiceRequest) Reset() {
 	*x = RegisterCloudServiceRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[14]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -747,7 +832,7 @@ func (x *RegisterCloudServiceRequest) String() string {
 func (*RegisterCloudServiceRequest) ProtoMessage() {}
 
 func (x *RegisterCloudServiceRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[14]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -760,7 +845,7 @@ func (x *RegisterCloudServiceRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RegisterCloudServiceRequest.ProtoReflect.Descriptor instead.
 func (*RegisterCloudServiceRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{14}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *RegisterCloudServiceRequest) GetService() *CloudService {
@@ -782,7 +867,7 @@ type UpdateCloudServiceRequest struct {
 func (x *UpdateCloudServiceRequest) Reset() {
 	*x = UpdateCloudServiceRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[15]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[17]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -795,7 +880,7 @@ func (x *UpdateCloudServiceRequest) String() string {
 func (*UpdateCloudServiceRequest) ProtoMessage() {}
 
 func (x *UpdateCloudServiceRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[15]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[17]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -808,7 +893,7 @@ func (x *UpdateCloudServiceRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateCloudServiceRequest.ProtoReflect.Descriptor instead.
 func (*UpdateCloudServiceRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{15}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *UpdateCloudServiceRequest) GetServiceId() string {
@@ -836,7 +921,7 @@ type RemoveCloudServiceRequest struct {
 func (x *RemoveCloudServiceRequest) Reset() {
 	*x = RemoveCloudServiceRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[16]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[18]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -849,7 +934,7 @@ func (x *RemoveCloudServiceRequest) String() string {
 func (*RemoveCloudServiceRequest) ProtoMessage() {}
 
 func (x *RemoveCloudServiceRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[16]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[18]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -862,7 +947,7 @@ func (x *RemoveCloudServiceRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use RemoveCloudServiceRequest.ProtoReflect.Descriptor instead.
 func (*RemoveCloudServiceRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{16}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *RemoveCloudServiceRequest) GetServiceId() string {
@@ -881,7 +966,7 @@ type ListCloudServicesRequest struct {
 func (x *ListCloudServicesRequest) Reset() {
 	*x = ListCloudServicesRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[17]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -894,7 +979,7 @@ func (x *ListCloudServicesRequest) String() string {
 func (*ListCloudServicesRequest) ProtoMessage() {}
 
 func (x *ListCloudServicesRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[17]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -907,7 +992,7 @@ func (x *ListCloudServicesRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListCloudServicesRequest.ProtoReflect.Descriptor instead.
 func (*ListCloudServicesRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{17}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{19}
 }
 
 type ListCloudServicesResponse struct {
@@ -921,7 +1006,7 @@ type ListCloudServicesResponse struct {
 func (x *ListCloudServicesResponse) Reset() {
 	*x = ListCloudServicesResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[18]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -934,7 +1019,7 @@ func (x *ListCloudServicesResponse) String() string {
 func (*ListCloudServicesResponse) ProtoMessage() {}
 
 func (x *ListCloudServicesResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[18]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -947,7 +1032,7 @@ func (x *ListCloudServicesResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListCloudServicesResponse.ProtoReflect.Descriptor instead.
 func (*ListCloudServicesResponse) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{18}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{20}
 }
 
 func (x *ListCloudServicesResponse) GetServices() []*CloudService {
@@ -970,7 +1055,7 @@ type UpdateMetricConfigurationRequest struct {
 func (x *UpdateMetricConfigurationRequest) Reset() {
 	*x = UpdateMetricConfigurationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[19]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -983,7 +1068,7 @@ func (x *UpdateMetricConfigurationRequest) String() string {
 func (*UpdateMetricConfigurationRequest) ProtoMessage() {}
 
 func (x *UpdateMetricConfigurationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[19]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -996,7 +1081,7 @@ func (x *UpdateMetricConfigurationRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateMetricConfigurationRequest.ProtoReflect.Descriptor instead.
 func (*UpdateMetricConfigurationRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{19}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{21}
 }
 
 func (x *UpdateMetricConfigurationRequest) GetServiceId() string {
@@ -1032,7 +1117,7 @@ type GetMetricConfigurationRequest struct {
 func (x *GetMetricConfigurationRequest) Reset() {
 	*x = GetMetricConfigurationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[20]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1045,7 +1130,7 @@ func (x *GetMetricConfigurationRequest) String() string {
 func (*GetMetricConfigurationRequest) ProtoMessage() {}
 
 func (x *GetMetricConfigurationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[20]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1058,7 +1143,7 @@ func (x *GetMetricConfigurationRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetMetricConfigurationRequest.ProtoReflect.Descriptor instead.
 func (*GetMetricConfigurationRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{20}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{22}
 }
 
 func (x *GetMetricConfigurationRequest) GetServiceId() string {
@@ -1086,7 +1171,7 @@ type ListMetricConfigurationRequest struct {
 func (x *ListMetricConfigurationRequest) Reset() {
 	*x = ListMetricConfigurationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[21]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[23]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1099,7 +1184,7 @@ func (x *ListMetricConfigurationRequest) String() string {
 func (*ListMetricConfigurationRequest) ProtoMessage() {}
 
 func (x *ListMetricConfigurationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[21]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[23]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1112,7 +1197,7 @@ func (x *ListMetricConfigurationRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListMetricConfigurationRequest.ProtoReflect.Descriptor instead.
 func (*ListMetricConfigurationRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{21}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{23}
 }
 
 func (x *ListMetricConfigurationRequest) GetServiceId() string {
@@ -1134,7 +1219,7 @@ type ListMetricConfigurationResponse struct {
 func (x *ListMetricConfigurationResponse) Reset() {
 	*x = ListMetricConfigurationResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[22]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[24]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1147,7 +1232,7 @@ func (x *ListMetricConfigurationResponse) String() string {
 func (*ListMetricConfigurationResponse) ProtoMessage() {}
 
 func (x *ListMetricConfigurationResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[22]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[24]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1160,7 +1245,7 @@ func (x *ListMetricConfigurationResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListMetricConfigurationResponse.ProtoReflect.Descriptor instead.
 func (*ListMetricConfigurationResponse) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{22}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{24}
 }
 
 func (x *ListMetricConfigurationResponse) GetConfigurations() map[string]*assessment.MetricConfiguration {
@@ -1182,7 +1267,7 @@ type UpdateMetricImplementationRequest struct {
 func (x *UpdateMetricImplementationRequest) Reset() {
 	*x = UpdateMetricImplementationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[23]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[25]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1195,7 +1280,7 @@ func (x *UpdateMetricImplementationRequest) String() string {
 func (*UpdateMetricImplementationRequest) ProtoMessage() {}
 
 func (x *UpdateMetricImplementationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[23]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[25]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1208,7 +1293,7 @@ func (x *UpdateMetricImplementationRequest) ProtoReflect() protoreflect.Message
 
 // Deprecated: Use UpdateMetricImplementationRequest.ProtoReflect.Descriptor instead.
 func (*UpdateMetricImplementationRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{23}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{25}
 }
 
 func (x *UpdateMetricImplementationRequest) GetMetricId() string {
@@ -1236,7 +1321,7 @@ type GetMetricImplementationRequest struct {
 func (x *GetMetricImplementationRequest) Reset() {
 	*x = GetMetricImplementationRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[24]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[26]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1249,7 +1334,7 @@ func (x *GetMetricImplementationRequest) String() string {
 func (*GetMetricImplementationRequest) ProtoMessage() {}
 
 func (x *GetMetricImplementationRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[24]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[26]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1262,7 +1347,7 @@ func (x *GetMetricImplementationRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetMetricImplementationRequest.ProtoReflect.Descriptor instead.
 func (*GetMetricImplementationRequest) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{24}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{26}
 }
 
 func (x *GetMetricImplementationRequest) GetMetricId() string {
@@ -1289,7 +1374,7 @@ type AssessmentTool struct {
 func (x *AssessmentTool) Reset() {
 	*x = AssessmentTool{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[25]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1302,7 +1387,7 @@ func (x *AssessmentTool) String() string {
 func (*AssessmentTool) ProtoMessage() {}
 
 func (x *AssessmentTool) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[25]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1315,7 +1400,7 @@ func (x *AssessmentTool) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssessmentTool.ProtoReflect.Descriptor instead.
 func (*AssessmentTool) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{25}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{27}
 }
 
 func (x *AssessmentTool) GetId() string {
@@ -1351,15 +1436,16 @@ type CloudService struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Name        string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	Id           string                     `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name         string                     `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Description  string                     `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	Requirements *CloudService_Requirements `protobuf:"bytes,4,opt,name=requirements,proto3" json:"requirements,omitempty"`
 }
 
 func (x *CloudService) Reset() {
 	*x = CloudService{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[26]
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1372,7 +1458,7 @@ func (x *CloudService) String() string {
 func (*CloudService) ProtoMessage() {}
 
 func (x *CloudService) ProtoReflect() protoreflect.Message {
-	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[26]
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1385,7 +1471,7 @@ func (x *CloudService) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CloudService.ProtoReflect.Descriptor instead.
 func (*CloudService) Descriptor() ([]byte, []int) {
-	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{26}
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{28}
 }
 
 func (x *CloudService) GetId() string {
@@ -1409,6 +1495,133 @@ func (x *CloudService) GetDescription() string {
 	return ""
 }
 
+func (x *CloudService) GetRequirements() *CloudService_Requirements {
+	if x != nil {
+		return x.Requirements
+	}
+	return nil
+}
+
+// Requirement represents a certain requirement that needs to be fulfilled. It
+// could be a control in a certification catalog.
+type Requirement struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id          string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name        string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Description string   `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	MetricIds   []string `protobuf:"bytes,4,rep,name=metric_ids,json=metricIds,proto3" json:"metric_ids,omitempty"`
+}
+
+func (x *Requirement) Reset() {
+	*x = Requirement{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Requirement) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Requirement) ProtoMessage() {}
+
+func (x *Requirement) ProtoReflect() protoreflect.Message {
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Requirement.ProtoReflect.Descriptor instead.
+func (*Requirement) Descriptor() ([]byte, []int) {
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *Requirement) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Requirement) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Requirement) GetDescription() string {
+	if x != nil {
+		return x.Description
+	}
+	return ""
+}
+
+func (x *Requirement) GetMetricIds() []string {
+	if x != nil {
+		return x.MetricIds
+	}
+	return nil
+}
+
+type CloudService_Requirements struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	RequirementIds []string `protobuf:"bytes,1,rep,name=requirement_ids,json=requirementIds,proto3" json:"requirement_ids,omitempty"`
+}
+
+func (x *CloudService_Requirements) Reset() {
+	*x = CloudService_Requirements{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_orchestrator_orchestrator_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CloudService_Requirements) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CloudService_Requirements) ProtoMessage() {}
+
+func (x *CloudService_Requirements) ProtoReflect() protoreflect.Message {
+	mi := &file_api_orchestrator_orchestrator_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CloudService_Requirements.ProtoReflect.Descriptor instead.
+func (*CloudService_Requirements) Descriptor() ([]byte, []int) {
+	return file_api_orchestrator_orchestrator_proto_rawDescGZIP(), []int{28, 0}
+}
+
+func (x *CloudService_Requirements) GetRequirementIds() []string {
+	if x != nil {
+		return x.RequirementIds
+	}
+	return nil
+}
+
 var File_api_orchestrator_orchestrator_proto protoreflect.FileDescriptor
 
 var file_api_orchestrator_orchestrator_proto_rawDesc = []byte{
@@ -1479,200 +1692,231 @@ var file_api_orchestrator_orchestrator_proto_rawDesc = []byte{
 	0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 	0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
 	0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65,
-	0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x37, 0x0a,
-	0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x19, 0x0a,
+	0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x56, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d,
+	0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x6f,
+	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65,
+	0x6e, 0x74, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+	0x22, 0x37, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x1b, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x6d, 0x0a, 0x19, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
+	0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3a, 0x0a, 0x19, 0x52, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69,
 	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x1b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
-	0x65, 0x72, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52,
-	0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x6d, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61,
-	0x74, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
-	0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3a, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76,
-	0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64,
-	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,
-	0x50, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17,
-	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64,
-	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
-	0x73, 0x22, 0xa4, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76,
-	0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f,
-	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x49, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
-	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69,
-	0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d,
+	0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c,
+	0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x22, 0x50, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x33, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6c,
+	0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d,
 	0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69,
 	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72,
 	0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73,
 	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72,
 	0x69, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xec, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x0e, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c,
-	0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74,
-	0x72, 0x79, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x1a, 0x61, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 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, 0x34, 0x0a, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x6f,
-	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x72, 0x69, 0x63, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63,
+	0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x1d, 0x47,
+	0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74,
+	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xec, 0x01, 0x0a, 0x1f, 0x4c, 0x69,
+	0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a,
+	0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
+	0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x61, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x34,
+	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
+	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,
+	0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b,
+	0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x69,
+	0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
 	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x69, 0x6d, 0x70, 0x6c,
-	0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x52, 0x0e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x22, 0x3d, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x6d,
-	0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x49, 0x64,
-	0x22, 0x83, 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54,
-	0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
-	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65,
-	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61,
-	0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x04,
-	0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x54, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53,
-	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x49, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65,
+	0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
 	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65,
 	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xf3, 0x19, 0x0a,
-	0x0c, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x8e, 0x01,
-	0x0a, 0x16, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73,
-	0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
-	0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73,
-	0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41,
-	0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x2f, 0x82,
-	0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65,
-	0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65,
-	0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x3a, 0x04, 0x74, 0x6f, 0x6f, 0x6c, 0x12, 0xc0,
-	0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e,
-	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73,
-	0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, 0x12, 0x21, 0x2f,
-	0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f,
-	0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73,
-	0x5a, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
-	0x61, 0x74, 0x6f, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x7d,
-	0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c,
-	0x73, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d,
-	0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x23, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69,
-	0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63,
-	0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d,
-	0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12,
-	0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f,
-	0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f,
-	0x6c, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x94, 0x01, 0x0a,
-	0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
-	0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65,
+	0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11,
+	0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62,
+	0x6c, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x0c, 0x43, 0x6c,
+	0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20,
+	0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x48, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
+	0x6f, 0x72, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+	0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x0c, 0x72, 0x65,
+	0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x37, 0x0a, 0x0c, 0x52, 0x65,
+	0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65,
+	0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+	0x49, 0x64, 0x73, 0x22, 0x72, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65,
+	0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x74, 0x72,
+	0x69, 0x63, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x49, 0x64, 0x73, 0x32, 0xf8, 0x1a, 0x0a, 0x0c, 0x4f, 0x72, 0x63, 0x68,
+	0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x8e, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54,
+	0x6f, 0x6f, 0x6c, 0x12, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65,
 	0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e,
 	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73,
-	0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33,
-	0x1a, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74,
+	0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29,
+	0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74,
 	0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f,
-	0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x04, 0x74,
-	0x6f, 0x6f, 0x6c, 0x12, 0x93, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x6f, 0x6c, 0x73, 0x3a, 0x04, 0x74, 0x6f, 0x6f, 0x6c, 0x12, 0xc0, 0x01, 0x0a, 0x13, 0x4c, 0x69,
+	0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c,
+	0x73, 0x12, 0x25, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69,
+	0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
+	0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d,
+	0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, 0x12, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72,
+	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73,
+	0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5a, 0x2f, 0x12, 0x2d, 0x2f,
+	0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f,
+	0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65,
+	0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x88, 0x01, 0x0a,
+	0x11, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f,
+	0x6f, 0x6c, 0x12, 0x23, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x47,
+	0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69,
+	0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f,
+	0x6f, 0x6c, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f,
+	0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73,
+	0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x74,
+	0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x94, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c,
+	0x12, 0x26, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f,
+	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
+	0x69, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54,
+	0x6f, 0x6f, 0x6c, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x2b, 0x2f, 0x76, 0x31,
+	0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73,
+	0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b,
+	0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x04, 0x74, 0x6f, 0x6f, 0x6c, 0x12, 0x93,
+	0x01, 0x0a, 0x18, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73,
+	0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x2a, 0x2e, 0x63, 0x6c,
+	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
 	0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6f, 0x6c,
-	0x12, 0x2a, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x65, 0x72,
-	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
-	0x6d, 0x70, 0x74, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x2a, 0x2b, 0x2f, 0x76,
-	0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61,
-	0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2f,
-	0x7b, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x53, 0x74,
-	0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73,
-	0x75, 0x6c, 0x74, 0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
-	0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63,
-	0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x73,
-	0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x23,
-	0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72,
-	0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75,
-	0x6c, 0x74, 0x73, 0x3a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x6f, 0x0a, 0x16, 0x53,
-	0x74, 0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
-	0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x2a, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63,
+	0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73,
+	0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x74, 0x6f, 0x6f, 0x6c,
+	0x5f, 0x69, 0x64, 0x7d, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x73,
+	0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x27,
 	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65,
 	0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x97, 0x01, 0x0a,
-	0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e,
-	0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69,
+	0x74, 0x6f, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d,
+	0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x6f,
+	0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65,
+	0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x06,
+	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41,
+	0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
+	0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x74, 0x6f,
+	0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
+	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x73, 0x73, 0x65, 0x73,
+	0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x97, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74,
 	0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61,
-	0x74, 0x6f, 0x72, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x6b, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x22, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61,
-	0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x3a, 0x06, 0x6d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x12, 0x77, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e,
-	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x1a, 0x24,
-	0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72,
-	0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x69, 0x0a, 0x09,
-	0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
-	0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61,
-	0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74,
-	0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x6e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74,
-	0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f,
-	0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f,
-	0x76, 0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f,
-	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x12, 0x27, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69,
+	0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75,
+	0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x6c, 0x6f,
+	0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x73,
+	0x73, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76,
+	0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61,
+	0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x73, 0x12, 0x6b, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x18, 0x2f, 0x76,
+	0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x3a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x77,
+	0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1e,
+	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11,
+	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x1a, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x6f,
+	0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72,
+	0x69, 0x63, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69, 0x64, 0x7d, 0x3a,
+	0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x69, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72,
+	0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76,
+	0x31, 0x2f, 0x6f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d,
+	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x69,
+	0x64, 0x7d, 0x12, 0x6e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
+	0x73, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69,
+	0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72,
+	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69,
+	0x63, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69,
+	0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69,
+	0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d,
+	0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6c,
+	0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72,
+	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x69,
+	0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69,
 	0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
 	0x12, 0x26, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x67,
 	0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
@@ -1793,7 +2037,7 @@ func file_api_orchestrator_orchestrator_proto_rawDescGZIP() []byte {
 	return file_api_orchestrator_orchestrator_proto_rawDescData
 }
 
-var file_api_orchestrator_orchestrator_proto_msgTypes = make([]protoimpl.MessageInfo, 28)
+var file_api_orchestrator_orchestrator_proto_msgTypes = make([]protoimpl.MessageInfo, 32)
 var file_api_orchestrator_orchestrator_proto_goTypes = []interface{}{
 	(*RegisterAssessmentToolRequest)(nil),            // 0: clouditor.RegisterAssessmentToolRequest
 	(*ListAssessmentToolsRequest)(nil),               // 1: clouditor.ListAssessmentToolsRequest
@@ -1808,93 +2052,101 @@ var file_api_orchestrator_orchestrator_proto_goTypes = []interface{}{
 	(*GetMetricRequest)(nil),                         // 10: clouditor.GetMetricRequest
 	(*ListMetricsRequest)(nil),                       // 11: clouditor.ListMetricsRequest
 	(*ListMetricsResponse)(nil),                      // 12: clouditor.ListMetricsResponse
-	(*GetCloudServiceRequest)(nil),                   // 13: clouditor.GetCloudServiceRequest
-	(*RegisterCloudServiceRequest)(nil),              // 14: clouditor.RegisterCloudServiceRequest
-	(*UpdateCloudServiceRequest)(nil),                // 15: clouditor.UpdateCloudServiceRequest
-	(*RemoveCloudServiceRequest)(nil),                // 16: clouditor.RemoveCloudServiceRequest
-	(*ListCloudServicesRequest)(nil),                 // 17: clouditor.ListCloudServicesRequest
-	(*ListCloudServicesResponse)(nil),                // 18: clouditor.ListCloudServicesResponse
-	(*UpdateMetricConfigurationRequest)(nil),         // 19: clouditor.UpdateMetricConfigurationRequest
-	(*GetMetricConfigurationRequest)(nil),            // 20: clouditor.GetMetricConfigurationRequest
-	(*ListMetricConfigurationRequest)(nil),           // 21: clouditor.ListMetricConfigurationRequest
-	(*ListMetricConfigurationResponse)(nil),          // 22: clouditor.ListMetricConfigurationResponse
-	(*UpdateMetricImplementationRequest)(nil),        // 23: clouditor.UpdateMetricImplementationRequest
-	(*GetMetricImplementationRequest)(nil),           // 24: clouditor.GetMetricImplementationRequest
-	(*AssessmentTool)(nil),                           // 25: clouditor.AssessmentTool
-	(*CloudService)(nil),                             // 26: clouditor.CloudService
-	nil,                                              // 27: clouditor.ListMetricConfigurationResponse.ConfigurationsEntry
-	(*assessment.AssessmentResult)(nil),              // 28: clouditor.AssessmentResult
-	(*assessment.Metric)(nil),                        // 29: clouditor.Metric
-	(*assessment.MetricConfiguration)(nil),           // 30: clouditor.MetricConfiguration
-	(*assessment.MetricImplementation)(nil),          // 31: clouditor.MetricImplementation
-	(*assessment.ListAssessmentResultsRequest)(nil),  // 32: clouditor.ListAssessmentResultsRequest
-	(*emptypb.Empty)(nil),                            // 33: google.protobuf.Empty
-	(*assessment.ListAssessmentResultsResponse)(nil), // 34: clouditor.ListAssessmentResultsResponse
+	(*ListRequirementsRequest)(nil),                  // 13: clouditor.ListRequirementsRequest
+	(*ListRequirementsResponse)(nil),                 // 14: clouditor.ListRequirementsResponse
+	(*GetCloudServiceRequest)(nil),                   // 15: clouditor.GetCloudServiceRequest
+	(*RegisterCloudServiceRequest)(nil),              // 16: clouditor.RegisterCloudServiceRequest
+	(*UpdateCloudServiceRequest)(nil),                // 17: clouditor.UpdateCloudServiceRequest
+	(*RemoveCloudServiceRequest)(nil),                // 18: clouditor.RemoveCloudServiceRequest
+	(*ListCloudServicesRequest)(nil),                 // 19: clouditor.ListCloudServicesRequest
+	(*ListCloudServicesResponse)(nil),                // 20: clouditor.ListCloudServicesResponse
+	(*UpdateMetricConfigurationRequest)(nil),         // 21: clouditor.UpdateMetricConfigurationRequest
+	(*GetMetricConfigurationRequest)(nil),            // 22: clouditor.GetMetricConfigurationRequest
+	(*ListMetricConfigurationRequest)(nil),           // 23: clouditor.ListMetricConfigurationRequest
+	(*ListMetricConfigurationResponse)(nil),          // 24: clouditor.ListMetricConfigurationResponse
+	(*UpdateMetricImplementationRequest)(nil),        // 25: clouditor.UpdateMetricImplementationRequest
+	(*GetMetricImplementationRequest)(nil),           // 26: clouditor.GetMetricImplementationRequest
+	(*AssessmentTool)(nil),                           // 27: clouditor.AssessmentTool
+	(*CloudService)(nil),                             // 28: clouditor.CloudService
+	(*Requirement)(nil),                              // 29: clouditor.Requirement
+	nil,                                              // 30: clouditor.ListMetricConfigurationResponse.ConfigurationsEntry
+	(*CloudService_Requirements)(nil),                // 31: clouditor.CloudService.Requirements
+	(*assessment.AssessmentResult)(nil),              // 32: clouditor.AssessmentResult
+	(*assessment.Metric)(nil),                        // 33: clouditor.Metric
+	(*assessment.MetricConfiguration)(nil),           // 34: clouditor.MetricConfiguration
+	(*assessment.MetricImplementation)(nil),          // 35: clouditor.MetricImplementation
+	(*assessment.ListAssessmentResultsRequest)(nil),  // 36: clouditor.ListAssessmentResultsRequest
+	(*emptypb.Empty)(nil),                            // 37: google.protobuf.Empty
+	(*assessment.ListAssessmentResultsResponse)(nil), // 38: clouditor.ListAssessmentResultsResponse
 }
 var file_api_orchestrator_orchestrator_proto_depIdxs = []int32{
-	25, // 0: clouditor.RegisterAssessmentToolRequest.tool:type_name -> clouditor.AssessmentTool
-	25, // 1: clouditor.ListAssessmentToolsResponse.tools:type_name -> clouditor.AssessmentTool
-	25, // 2: clouditor.UpdateAssessmentToolRequest.tool:type_name -> clouditor.AssessmentTool
-	28, // 3: clouditor.StoreAssessmentResultRequest.result:type_name -> clouditor.AssessmentResult
-	29, // 4: clouditor.CreateMetricRequest.metric:type_name -> clouditor.Metric
-	29, // 5: clouditor.UpdateMetricRequest.metric:type_name -> clouditor.Metric
-	29, // 6: clouditor.ListMetricsResponse.metrics:type_name -> clouditor.Metric
-	26, // 7: clouditor.RegisterCloudServiceRequest.service:type_name -> clouditor.CloudService
-	26, // 8: clouditor.UpdateCloudServiceRequest.service:type_name -> clouditor.CloudService
-	26, // 9: clouditor.ListCloudServicesResponse.services:type_name -> clouditor.CloudService
-	30, // 10: clouditor.UpdateMetricConfigurationRequest.configuration:type_name -> clouditor.MetricConfiguration
-	27, // 11: clouditor.ListMetricConfigurationResponse.configurations:type_name -> clouditor.ListMetricConfigurationResponse.ConfigurationsEntry
-	31, // 12: clouditor.UpdateMetricImplementationRequest.implementation:type_name -> clouditor.MetricImplementation
-	30, // 13: clouditor.ListMetricConfigurationResponse.ConfigurationsEntry.value:type_name -> clouditor.MetricConfiguration
-	0,  // 14: clouditor.Orchestrator.RegisterAssessmentTool:input_type -> clouditor.RegisterAssessmentToolRequest
-	1,  // 15: clouditor.Orchestrator.ListAssessmentTools:input_type -> clouditor.ListAssessmentToolsRequest
-	3,  // 16: clouditor.Orchestrator.GetAssessmentTool:input_type -> clouditor.GetAssessmentToolRequest
-	4,  // 17: clouditor.Orchestrator.UpdateAssessmentTool:input_type -> clouditor.UpdateAssessmentToolRequest
-	5,  // 18: clouditor.Orchestrator.DeregisterAssessmentTool:input_type -> clouditor.DeregisterAssessmentToolRequest
-	6,  // 19: clouditor.Orchestrator.StoreAssessmentResult:input_type -> clouditor.StoreAssessmentResultRequest
-	6,  // 20: clouditor.Orchestrator.StoreAssessmentResults:input_type -> clouditor.StoreAssessmentResultRequest
-	32, // 21: clouditor.Orchestrator.ListAssessmentResults:input_type -> clouditor.ListAssessmentResultsRequest
-	8,  // 22: clouditor.Orchestrator.CreateMetric:input_type -> clouditor.CreateMetricRequest
-	9,  // 23: clouditor.Orchestrator.UpdateMetric:input_type -> clouditor.UpdateMetricRequest
-	10, // 24: clouditor.Orchestrator.GetMetric:input_type -> clouditor.GetMetricRequest
-	11, // 25: clouditor.Orchestrator.ListMetrics:input_type -> clouditor.ListMetricsRequest
-	14, // 26: clouditor.Orchestrator.RegisterCloudService:input_type -> clouditor.RegisterCloudServiceRequest
-	15, // 27: clouditor.Orchestrator.UpdateCloudService:input_type -> clouditor.UpdateCloudServiceRequest
-	13, // 28: clouditor.Orchestrator.GetCloudService:input_type -> clouditor.GetCloudServiceRequest
-	17, // 29: clouditor.Orchestrator.ListCloudServices:input_type -> clouditor.ListCloudServicesRequest
-	16, // 30: clouditor.Orchestrator.RemoveCloudService:input_type -> clouditor.RemoveCloudServiceRequest
-	19, // 31: clouditor.Orchestrator.UpdateMetricConfiguration:input_type -> clouditor.UpdateMetricConfigurationRequest
-	20, // 32: clouditor.Orchestrator.GetMetricConfiguration:input_type -> clouditor.GetMetricConfigurationRequest
-	21, // 33: clouditor.Orchestrator.ListMetricConfigurations:input_type -> clouditor.ListMetricConfigurationRequest
-	23, // 34: clouditor.Orchestrator.UpdateMetricImplementation:input_type -> clouditor.UpdateMetricImplementationRequest
-	24, // 35: clouditor.Orchestrator.GetMetricImplementation:input_type -> clouditor.GetMetricImplementationRequest
-	25, // 36: clouditor.Orchestrator.RegisterAssessmentTool:output_type -> clouditor.AssessmentTool
-	2,  // 37: clouditor.Orchestrator.ListAssessmentTools:output_type -> clouditor.ListAssessmentToolsResponse
-	25, // 38: clouditor.Orchestrator.GetAssessmentTool:output_type -> clouditor.AssessmentTool
-	25, // 39: clouditor.Orchestrator.UpdateAssessmentTool:output_type -> clouditor.AssessmentTool
-	33, // 40: clouditor.Orchestrator.DeregisterAssessmentTool:output_type -> google.protobuf.Empty
-	7,  // 41: clouditor.Orchestrator.StoreAssessmentResult:output_type -> clouditor.StoreAssessmentResultResponse
-	7,  // 42: clouditor.Orchestrator.StoreAssessmentResults:output_type -> clouditor.StoreAssessmentResultResponse
-	34, // 43: clouditor.Orchestrator.ListAssessmentResults:output_type -> clouditor.ListAssessmentResultsResponse
-	29, // 44: clouditor.Orchestrator.CreateMetric:output_type -> clouditor.Metric
-	29, // 45: clouditor.Orchestrator.UpdateMetric:output_type -> clouditor.Metric
-	29, // 46: clouditor.Orchestrator.GetMetric:output_type -> clouditor.Metric
-	12, // 47: clouditor.Orchestrator.ListMetrics:output_type -> clouditor.ListMetricsResponse
-	26, // 48: clouditor.Orchestrator.RegisterCloudService:output_type -> clouditor.CloudService
-	26, // 49: clouditor.Orchestrator.UpdateCloudService:output_type -> clouditor.CloudService
-	26, // 50: clouditor.Orchestrator.GetCloudService:output_type -> clouditor.CloudService
-	18, // 51: clouditor.Orchestrator.ListCloudServices:output_type -> clouditor.ListCloudServicesResponse
-	33, // 52: clouditor.Orchestrator.RemoveCloudService:output_type -> google.protobuf.Empty
-	30, // 53: clouditor.Orchestrator.UpdateMetricConfiguration:output_type -> clouditor.MetricConfiguration
-	30, // 54: clouditor.Orchestrator.GetMetricConfiguration:output_type -> clouditor.MetricConfiguration
-	22, // 55: clouditor.Orchestrator.ListMetricConfigurations:output_type -> clouditor.ListMetricConfigurationResponse
-	31, // 56: clouditor.Orchestrator.UpdateMetricImplementation:output_type -> clouditor.MetricImplementation
-	31, // 57: clouditor.Orchestrator.GetMetricImplementation:output_type -> clouditor.MetricImplementation
-	36, // [36:58] is the sub-list for method output_type
-	14, // [14:36] is the sub-list for method input_type
-	14, // [14:14] is the sub-list for extension type_name
-	14, // [14:14] is the sub-list for extension extendee
-	0,  // [0:14] is the sub-list for field type_name
+	27, // 0: clouditor.RegisterAssessmentToolRequest.tool:type_name -> clouditor.AssessmentTool
+	27, // 1: clouditor.ListAssessmentToolsResponse.tools:type_name -> clouditor.AssessmentTool
+	27, // 2: clouditor.UpdateAssessmentToolRequest.tool:type_name -> clouditor.AssessmentTool
+	32, // 3: clouditor.StoreAssessmentResultRequest.result:type_name -> clouditor.AssessmentResult
+	33, // 4: clouditor.CreateMetricRequest.metric:type_name -> clouditor.Metric
+	33, // 5: clouditor.UpdateMetricRequest.metric:type_name -> clouditor.Metric
+	33, // 6: clouditor.ListMetricsResponse.metrics:type_name -> clouditor.Metric
+	29, // 7: clouditor.ListRequirementsResponse.requirements:type_name -> clouditor.Requirement
+	28, // 8: clouditor.RegisterCloudServiceRequest.service:type_name -> clouditor.CloudService
+	28, // 9: clouditor.UpdateCloudServiceRequest.service:type_name -> clouditor.CloudService
+	28, // 10: clouditor.ListCloudServicesResponse.services:type_name -> clouditor.CloudService
+	34, // 11: clouditor.UpdateMetricConfigurationRequest.configuration:type_name -> clouditor.MetricConfiguration
+	30, // 12: clouditor.ListMetricConfigurationResponse.configurations:type_name -> clouditor.ListMetricConfigurationResponse.ConfigurationsEntry
+	35, // 13: clouditor.UpdateMetricImplementationRequest.implementation:type_name -> clouditor.MetricImplementation
+	31, // 14: clouditor.CloudService.requirements:type_name -> clouditor.CloudService.Requirements
+	34, // 15: clouditor.ListMetricConfigurationResponse.ConfigurationsEntry.value:type_name -> clouditor.MetricConfiguration
+	0,  // 16: clouditor.Orchestrator.RegisterAssessmentTool:input_type -> clouditor.RegisterAssessmentToolRequest
+	1,  // 17: clouditor.Orchestrator.ListAssessmentTools:input_type -> clouditor.ListAssessmentToolsRequest
+	3,  // 18: clouditor.Orchestrator.GetAssessmentTool:input_type -> clouditor.GetAssessmentToolRequest
+	4,  // 19: clouditor.Orchestrator.UpdateAssessmentTool:input_type -> clouditor.UpdateAssessmentToolRequest
+	5,  // 20: clouditor.Orchestrator.DeregisterAssessmentTool:input_type -> clouditor.DeregisterAssessmentToolRequest
+	6,  // 21: clouditor.Orchestrator.StoreAssessmentResult:input_type -> clouditor.StoreAssessmentResultRequest
+	6,  // 22: clouditor.Orchestrator.StoreAssessmentResults:input_type -> clouditor.StoreAssessmentResultRequest
+	36, // 23: clouditor.Orchestrator.ListAssessmentResults:input_type -> clouditor.ListAssessmentResultsRequest
+	8,  // 24: clouditor.Orchestrator.CreateMetric:input_type -> clouditor.CreateMetricRequest
+	9,  // 25: clouditor.Orchestrator.UpdateMetric:input_type -> clouditor.UpdateMetricRequest
+	10, // 26: clouditor.Orchestrator.GetMetric:input_type -> clouditor.GetMetricRequest
+	11, // 27: clouditor.Orchestrator.ListMetrics:input_type -> clouditor.ListMetricsRequest
+	13, // 28: clouditor.Orchestrator.ListRequirements:input_type -> clouditor.ListRequirementsRequest
+	16, // 29: clouditor.Orchestrator.RegisterCloudService:input_type -> clouditor.RegisterCloudServiceRequest
+	17, // 30: clouditor.Orchestrator.UpdateCloudService:input_type -> clouditor.UpdateCloudServiceRequest
+	15, // 31: clouditor.Orchestrator.GetCloudService:input_type -> clouditor.GetCloudServiceRequest
+	19, // 32: clouditor.Orchestrator.ListCloudServices:input_type -> clouditor.ListCloudServicesRequest
+	18, // 33: clouditor.Orchestrator.RemoveCloudService:input_type -> clouditor.RemoveCloudServiceRequest
+	21, // 34: clouditor.Orchestrator.UpdateMetricConfiguration:input_type -> clouditor.UpdateMetricConfigurationRequest
+	22, // 35: clouditor.Orchestrator.GetMetricConfiguration:input_type -> clouditor.GetMetricConfigurationRequest
+	23, // 36: clouditor.Orchestrator.ListMetricConfigurations:input_type -> clouditor.ListMetricConfigurationRequest
+	25, // 37: clouditor.Orchestrator.UpdateMetricImplementation:input_type -> clouditor.UpdateMetricImplementationRequest
+	26, // 38: clouditor.Orchestrator.GetMetricImplementation:input_type -> clouditor.GetMetricImplementationRequest
+	27, // 39: clouditor.Orchestrator.RegisterAssessmentTool:output_type -> clouditor.AssessmentTool
+	2,  // 40: clouditor.Orchestrator.ListAssessmentTools:output_type -> clouditor.ListAssessmentToolsResponse
+	27, // 41: clouditor.Orchestrator.GetAssessmentTool:output_type -> clouditor.AssessmentTool
+	27, // 42: clouditor.Orchestrator.UpdateAssessmentTool:output_type -> clouditor.AssessmentTool
+	37, // 43: clouditor.Orchestrator.DeregisterAssessmentTool:output_type -> google.protobuf.Empty
+	7,  // 44: clouditor.Orchestrator.StoreAssessmentResult:output_type -> clouditor.StoreAssessmentResultResponse
+	7,  // 45: clouditor.Orchestrator.StoreAssessmentResults:output_type -> clouditor.StoreAssessmentResultResponse
+	38, // 46: clouditor.Orchestrator.ListAssessmentResults:output_type -> clouditor.ListAssessmentResultsResponse
+	33, // 47: clouditor.Orchestrator.CreateMetric:output_type -> clouditor.Metric
+	33, // 48: clouditor.Orchestrator.UpdateMetric:output_type -> clouditor.Metric
+	33, // 49: clouditor.Orchestrator.GetMetric:output_type -> clouditor.Metric
+	12, // 50: clouditor.Orchestrator.ListMetrics:output_type -> clouditor.ListMetricsResponse
+	14, // 51: clouditor.Orchestrator.ListRequirements:output_type -> clouditor.ListRequirementsResponse
+	28, // 52: clouditor.Orchestrator.RegisterCloudService:output_type -> clouditor.CloudService
+	28, // 53: clouditor.Orchestrator.UpdateCloudService:output_type -> clouditor.CloudService
+	28, // 54: clouditor.Orchestrator.GetCloudService:output_type -> clouditor.CloudService
+	20, // 55: clouditor.Orchestrator.ListCloudServices:output_type -> clouditor.ListCloudServicesResponse
+	37, // 56: clouditor.Orchestrator.RemoveCloudService:output_type -> google.protobuf.Empty
+	34, // 57: clouditor.Orchestrator.UpdateMetricConfiguration:output_type -> clouditor.MetricConfiguration
+	34, // 58: clouditor.Orchestrator.GetMetricConfiguration:output_type -> clouditor.MetricConfiguration
+	24, // 59: clouditor.Orchestrator.ListMetricConfigurations:output_type -> clouditor.ListMetricConfigurationResponse
+	35, // 60: clouditor.Orchestrator.UpdateMetricImplementation:output_type -> clouditor.MetricImplementation
+	35, // 61: clouditor.Orchestrator.GetMetricImplementation:output_type -> clouditor.MetricImplementation
+	39, // [39:62] is the sub-list for method output_type
+	16, // [16:39] is the sub-list for method input_type
+	16, // [16:16] is the sub-list for extension type_name
+	16, // [16:16] is the sub-list for extension extendee
+	0,  // [0:16] is the sub-list for field type_name
 }
 
 func init() { file_api_orchestrator_orchestrator_proto_init() }
@@ -2060,7 +2312,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetCloudServiceRequest); i {
+			switch v := v.(*ListRequirementsRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2072,7 +2324,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RegisterCloudServiceRequest); i {
+			switch v := v.(*ListRequirementsResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2084,7 +2336,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateCloudServiceRequest); i {
+			switch v := v.(*GetCloudServiceRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2096,7 +2348,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RemoveCloudServiceRequest); i {
+			switch v := v.(*RegisterCloudServiceRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2108,7 +2360,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListCloudServicesRequest); i {
+			switch v := v.(*UpdateCloudServiceRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2120,7 +2372,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListCloudServicesResponse); i {
+			switch v := v.(*RemoveCloudServiceRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2132,7 +2384,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateMetricConfigurationRequest); i {
+			switch v := v.(*ListCloudServicesRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2144,7 +2396,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetMetricConfigurationRequest); i {
+			switch v := v.(*ListCloudServicesResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2156,7 +2408,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListMetricConfigurationRequest); i {
+			switch v := v.(*UpdateMetricConfigurationRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2168,7 +2420,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListMetricConfigurationResponse); i {
+			switch v := v.(*GetMetricConfigurationRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2180,7 +2432,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateMetricImplementationRequest); i {
+			switch v := v.(*ListMetricConfigurationRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2192,7 +2444,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetMetricImplementationRequest); i {
+			switch v := v.(*ListMetricConfigurationResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2204,7 +2456,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AssessmentTool); i {
+			switch v := v.(*UpdateMetricImplementationRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2216,6 +2468,30 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			}
 		}
 		file_api_orchestrator_orchestrator_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetMetricImplementationRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_orchestrator_orchestrator_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AssessmentTool); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_orchestrator_orchestrator_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CloudService); i {
 			case 0:
 				return &v.state
@@ -2227,6 +2503,30 @@ func file_api_orchestrator_orchestrator_proto_init() {
 				return nil
 			}
 		}
+		file_api_orchestrator_orchestrator_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Requirement); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_orchestrator_orchestrator_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CloudService_Requirements); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -2234,7 +2534,7 @@ func file_api_orchestrator_orchestrator_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_api_orchestrator_orchestrator_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   28,
+			NumMessages:   32,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/api/orchestrator/orchestrator.pb.gw.go b/api/orchestrator/orchestrator.pb.gw.go
index 4601c761..fd75f229 100644
--- a/api/orchestrator/orchestrator.pb.gw.go
+++ b/api/orchestrator/orchestrator.pb.gw.go
@@ -550,6 +550,24 @@ func local_request_Orchestrator_ListMetrics_0(ctx context.Context, marshaler run
 
 }
 
+func request_Orchestrator_ListRequirements_0(ctx context.Context, marshaler runtime.Marshaler, client OrchestratorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq ListRequirementsRequest
+	var metadata runtime.ServerMetadata
+
+	msg, err := client.ListRequirements(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_Orchestrator_ListRequirements_0(ctx context.Context, marshaler runtime.Marshaler, server OrchestratorServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq ListRequirementsRequest
+	var metadata runtime.ServerMetadata
+
+	msg, err := server.ListRequirements(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
 func request_Orchestrator_RegisterCloudService_0(ctx context.Context, marshaler runtime.Marshaler, client OrchestratorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
 	var protoReq RegisterCloudServiceRequest
 	var metadata runtime.ServerMetadata
@@ -1388,6 +1406,29 @@ func RegisterOrchestratorHandlerServer(ctx context.Context, mux *runtime.ServeMu
 
 	})
 
+	mux.Handle("GET", pattern_Orchestrator_ListRequirements_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/clouditor.Orchestrator/ListRequirements", runtime.WithHTTPPathPattern("/v1/orchestrator/requirements"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_Orchestrator_ListRequirements_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_Orchestrator_ListRequirements_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	mux.Handle("POST", pattern_Orchestrator_RegisterCloudService_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
@@ -1899,6 +1940,26 @@ func RegisterOrchestratorHandlerClient(ctx context.Context, mux *runtime.ServeMu
 
 	})
 
+	mux.Handle("GET", pattern_Orchestrator_ListRequirements_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/clouditor.Orchestrator/ListRequirements", runtime.WithHTTPPathPattern("/v1/orchestrator/requirements"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_Orchestrator_ListRequirements_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_Orchestrator_ListRequirements_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	mux.Handle("POST", pattern_Orchestrator_RegisterCloudService_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
@@ -2127,6 +2188,8 @@ var (
 
 	pattern_Orchestrator_ListMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "metrics"}, ""))
 
+	pattern_Orchestrator_ListRequirements_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "requirements"}, ""))
+
 	pattern_Orchestrator_RegisterCloudService_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "orchestrator", "cloud_services"}, ""))
 
 	pattern_Orchestrator_UpdateCloudService_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "orchestrator", "cloud_services", "service_id"}, ""))
@@ -2173,6 +2236,8 @@ var (
 
 	forward_Orchestrator_ListMetrics_0 = runtime.ForwardResponseMessage
 
+	forward_Orchestrator_ListRequirements_0 = runtime.ForwardResponseMessage
+
 	forward_Orchestrator_RegisterCloudService_0 = runtime.ForwardResponseMessage
 
 	forward_Orchestrator_UpdateCloudService_0 = runtime.ForwardResponseMessage
diff --git a/api/orchestrator/orchestrator.proto b/api/orchestrator/orchestrator.proto
index af35b936..6727c710 100644
--- a/api/orchestrator/orchestrator.proto
+++ b/api/orchestrator/orchestrator.proto
@@ -135,6 +135,13 @@ service Orchestrator {
     };
   }
 
+  rpc ListRequirements(ListRequirementsRequest)
+      returns (ListRequirementsResponse) {
+    option (google.api.http) = {
+      get : "/v1/orchestrator/requirements"
+    };
+  }
+
   // Registers a new target cloud service
   rpc RegisterCloudService(RegisterCloudServiceRequest) returns (CloudService) {
     option (google.api.http) = {
@@ -259,6 +266,9 @@ message GetMetricRequest { string metric_id = 1; }
 message ListMetricsRequest {}
 message ListMetricsResponse { repeated Metric metrics = 1; }
 
+message ListRequirementsRequest {}
+message ListRequirementsResponse { repeated Requirement requirements = 1; }
+
 message GetCloudServiceRequest { string service_id = 1; }
 
 message RegisterCloudServiceRequest { CloudService service = 1; }
@@ -320,4 +330,20 @@ message CloudService {
   string name = 2;
 
   string description = 3;
+
+  message Requirements { repeated string requirement_ids = 1; }
+
+  Requirements requirements = 4;
+}
+
+// Requirement represents a certain requirement that needs to be fulfilled. It
+// could be a control in a certification catalog.
+message Requirement {
+  string id = 1;
+
+  string name = 2;
+
+  string description = 3;
+
+  repeated string metric_ids = 4;
 }
\ No newline at end of file
diff --git a/api/orchestrator/orchestrator_grpc.pb.go b/api/orchestrator/orchestrator_grpc.pb.go
index 69841037..711715e2 100644
--- a/api/orchestrator/orchestrator_grpc.pb.go
+++ b/api/orchestrator/orchestrator_grpc.pb.go
@@ -51,6 +51,7 @@ type OrchestratorClient interface {
 	GetMetric(ctx context.Context, in *GetMetricRequest, opts ...grpc.CallOption) (*assessment.Metric, error)
 	// List all metrics provided by the metric catalog
 	ListMetrics(ctx context.Context, in *ListMetricsRequest, opts ...grpc.CallOption) (*ListMetricsResponse, error)
+	ListRequirements(ctx context.Context, in *ListRequirementsRequest, opts ...grpc.CallOption) (*ListRequirementsResponse, error)
 	// Registers a new target cloud service
 	RegisterCloudService(ctx context.Context, in *RegisterCloudServiceRequest, opts ...grpc.CallOption) (*CloudService, error)
 	// Registers a new target cloud service
@@ -214,6 +215,15 @@ func (c *orchestratorClient) ListMetrics(ctx context.Context, in *ListMetricsReq
 	return out, nil
 }
 
+func (c *orchestratorClient) ListRequirements(ctx context.Context, in *ListRequirementsRequest, opts ...grpc.CallOption) (*ListRequirementsResponse, error) {
+	out := new(ListRequirementsResponse)
+	err := c.cc.Invoke(ctx, "/clouditor.Orchestrator/ListRequirements", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *orchestratorClient) RegisterCloudService(ctx context.Context, in *RegisterCloudServiceRequest, opts ...grpc.CallOption) (*CloudService, error) {
 	out := new(CloudService)
 	err := c.cc.Invoke(ctx, "/clouditor.Orchestrator/RegisterCloudService", in, out, opts...)
@@ -335,6 +345,7 @@ type OrchestratorServer interface {
 	GetMetric(context.Context, *GetMetricRequest) (*assessment.Metric, error)
 	// List all metrics provided by the metric catalog
 	ListMetrics(context.Context, *ListMetricsRequest) (*ListMetricsResponse, error)
+	ListRequirements(context.Context, *ListRequirementsRequest) (*ListRequirementsResponse, error)
 	// Registers a new target cloud service
 	RegisterCloudService(context.Context, *RegisterCloudServiceRequest) (*CloudService, error)
 	// Registers a new target cloud service
@@ -401,6 +412,9 @@ func (UnimplementedOrchestratorServer) GetMetric(context.Context, *GetMetricRequ
 func (UnimplementedOrchestratorServer) ListMetrics(context.Context, *ListMetricsRequest) (*ListMetricsResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ListMetrics not implemented")
 }
+func (UnimplementedOrchestratorServer) ListRequirements(context.Context, *ListRequirementsRequest) (*ListRequirementsResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ListRequirements not implemented")
+}
 func (UnimplementedOrchestratorServer) RegisterCloudService(context.Context, *RegisterCloudServiceRequest) (*CloudService, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method RegisterCloudService not implemented")
 }
@@ -668,6 +682,24 @@ func _Orchestrator_ListMetrics_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Orchestrator_ListRequirements_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListRequirementsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OrchestratorServer).ListRequirements(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/clouditor.Orchestrator/ListRequirements",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OrchestratorServer).ListRequirements(ctx, req.(*ListRequirementsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Orchestrator_RegisterCloudService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(RegisterCloudServiceRequest)
 	if err := dec(in); err != nil {
@@ -899,6 +931,10 @@ var Orchestrator_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "ListMetrics",
 			Handler:    _Orchestrator_ListMetrics_Handler,
 		},
+		{
+			MethodName: "ListRequirements",
+			Handler:    _Orchestrator_ListRequirements_Handler,
+		},
 		{
 			MethodName: "RegisterCloudService",
 			Handler:    _Orchestrator_RegisterCloudService_Handler,
diff --git a/cli/commands/cloud/cloud.go b/cli/commands/cloud/cloud.go
index 85c13c46..b75b16f4 100644
--- a/cli/commands/cloud/cloud.go
+++ b/cli/commands/cloud/cloud.go
@@ -199,26 +199,33 @@ func NewUpdateCloudServiceCommand() *cobra.Command {
 				Service: &orchestrator.CloudService{
 					Name:        viper.GetString("name"),
 					Description: viper.GetString("description"),
+					Requirements: &orchestrator.CloudService_Requirements{
+						RequirementIds: viper.GetStringSlice("requirement-ids"),
+					},
 				},
 			})
 
 			return session.HandleResponse(res, err)
 		},
-		ValidArgsFunction: cli.ValidArgsGetCloudServices,
+		ValidArgsFunction: cli.DefaultArgsShellComp,
 	}
 
 	cmd.PersistentFlags().String("id", "", "the cloud service id to update")
 	cmd.PersistentFlags().StringP("name", "n", "", "the name of the service")
 	cmd.PersistentFlags().StringP("description", "d", "", "an optional description")
+	cmd.PersistentFlags().StringSliceP("requirement-ids", "r", nil, "a list of requirements this cloud service should satisfy")
+
 	_ = cmd.MarkPersistentFlagRequired("id")
 	_ = cmd.MarkPersistentFlagRequired("name")
 	_ = viper.BindPFlag("id", cmd.PersistentFlags().Lookup("id"))
 	_ = viper.BindPFlag("name", cmd.PersistentFlags().Lookup("name"))
 	_ = viper.BindPFlag("description", cmd.PersistentFlags().Lookup("description"))
+	_ = viper.BindPFlag("requirement-ids", cmd.PersistentFlags().Lookup("requirement-ids"))
 
 	_ = cmd.RegisterFlagCompletionFunc("id", cli.ValidArgsGetCloudServices)
 	_ = cmd.RegisterFlagCompletionFunc("name", cli.DefaultArgsShellComp)
 	_ = cmd.RegisterFlagCompletionFunc("description", cli.DefaultArgsShellComp)
+	_ = cmd.RegisterFlagCompletionFunc("requirement-ids", cli.ValidArgsGetRequirements)
 
 	return cmd
 }
diff --git a/cli/commands/commands.go b/cli/commands/commands.go
index bc1285d7..126193cb 100644
--- a/cli/commands/commands.go
+++ b/cli/commands/commands.go
@@ -33,6 +33,7 @@ import (
 	"clouditor.io/clouditor/cli/commands/evidence"
 	"clouditor.io/clouditor/cli/commands/login"
 	"clouditor.io/clouditor/cli/commands/metric"
+	"clouditor.io/clouditor/cli/commands/requirement"
 	"clouditor.io/clouditor/cli/commands/resource"
 	"clouditor.io/clouditor/cli/commands/service"
 	"clouditor.io/clouditor/cli/commands/tool"
@@ -47,6 +48,7 @@ func AddCommands(cmd *cobra.Command) {
 		// commands for resources
 		login.NewLoginCommand(),
 		metric.NewMetricCommand(),
+		requirement.NewRequirementCommand(),
 		tool.NewToolCommand(),
 		resource.NewResourceCommand(),
 		evidence.NewEvidenceCommand(),
diff --git a/cli/commands/requirement/requirement.go b/cli/commands/requirement/requirement.go
new file mode 100644
index 00000000..31b8bd7f
--- /dev/null
+++ b/cli/commands/requirement/requirement.go
@@ -0,0 +1,60 @@
+// Copyright 2022 Fraunhofer AISEC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//           $$\                           $$\ $$\   $$\
+//           $$ |                          $$ |\__|  $$ |
+//  $$$$$$$\ $$ | $$$$$$\  $$\   $$\  $$$$$$$ |$$\ $$$$$$\    $$$$$$\   $$$$$$\
+// $$  _____|$$ |$$  __$$\ $$ |  $$ |$$  __$$ |$$ |\_$$  _|  $$  __$$\ $$  __$$\
+// $$ /      $$ |$$ /  $$ |$$ |  $$ |$$ /  $$ |$$ |  $$ |    $$ /  $$ |$$ | \__|
+// $$ |      $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$\ $$ |  $$ |$$ |
+// \$$$$$$\  $$ |\$$$$$   |\$$$$$   |\$$$$$$  |$$ |  \$$$   |\$$$$$   |$$ |
+//  \_______|\__| \______/  \______/  \_______|\__|   \____/  \______/ \__|
+//
+// This file is part of Clouditor Community Edition.
+
+package requirement
+
+import (
+	"clouditor.io/clouditor/cli/commands/service/orchestrator"
+	"github.com/spf13/cobra"
+)
+
+// NewListRequirementsCommand returns a cobra command for the `list` subcommand
+func NewListRequirementsCommand() *cobra.Command {
+	// Use Orchestrator's function for listing requirements
+	cmd := orchestrator.NewListRequirementsCommand()
+
+	// Change use for better readability
+	cmd.Use = "list"
+	return cmd
+}
+
+// NewRequirementCommand returns a cobra command for `requirement` subcommands
+func NewRequirementCommand() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "requirement",
+		Short: "Requirement commands",
+	}
+
+	AddCommands(cmd)
+
+	return cmd
+}
+
+// AddCommands adds all subcommands
+func AddCommands(cmd *cobra.Command) {
+	cmd.AddCommand(
+		NewListRequirementsCommand(),
+	)
+}
diff --git a/cli/commands/service/orchestrator/orchestrator.go b/cli/commands/service/orchestrator/orchestrator.go
index 0970a00d..c2759ceb 100644
--- a/cli/commands/service/orchestrator/orchestrator.go
+++ b/cli/commands/service/orchestrator/orchestrator.go
@@ -36,7 +36,7 @@ import (
 	"github.com/spf13/cobra"
 )
 
-// NewListAssessmentResultsCommand returns a cobra command for the `list` subcommand
+// NewListAssessmentResultsCommand returns a cobra command for the `list-assessment-results` subcommand
 func NewListAssessmentResultsCommand() *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "list-assessment-results",
@@ -68,7 +68,39 @@ func NewListAssessmentResultsCommand() *cobra.Command {
 	return cmd
 }
 
-// NewOrchestratorCommand returns a cobra command for `assessment` subcommands
+// NewListRequirementsCommand returns a cobra command for the `list-requirements` subcommand
+func NewListRequirementsCommand() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "list-requirements",
+		Short: "Lists all requirements",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			var (
+				err     error
+				session *cli.Session
+				client  orchestrator.OrchestratorClient
+				res     *orchestrator.ListRequirementsResponse
+			)
+
+			if session, err = cli.ContinueSession(); err != nil {
+				fmt.Printf("Error while retrieving the session. Please re-authenticate.\n")
+				return nil
+			}
+
+			client = orchestrator.NewOrchestratorClient(session)
+
+			res, err = client.ListRequirements(context.Background(), &orchestrator.ListRequirementsRequest{})
+
+			return session.HandleResponse(res, err)
+		},
+		ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
+			return []string{}, cobra.ShellCompDirectiveNoFileComp
+		},
+	}
+
+	return cmd
+}
+
+// NewOrchestratorCommand returns a cobra command for `orchestrator` subcommands
 func NewOrchestratorCommand() *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "orchestrator",
@@ -84,5 +116,6 @@ func NewOrchestratorCommand() *cobra.Command {
 func AddCommands(cmd *cobra.Command) {
 	cmd.AddCommand(
 		NewListAssessmentResultsCommand(),
+		NewListRequirementsCommand(),
 	)
 }
diff --git a/cli/session.go b/cli/session.go
index b2b55371..8eb54244 100644
--- a/cli/session.go
+++ b/cli/session.go
@@ -248,27 +248,19 @@ func DefaultArgsShellComp(*cobra.Command, []string, string) ([]string, cobra.She
 	return []string{}, cobra.ShellCompDirectiveNoFileComp
 }
 
-func ValidArgsGetTools(_ *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
-	if len(args) != 0 {
-		return nil, cobra.ShellCompDirectiveNoFileComp
-	}
-
+func ValidArgsGetTools(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
 	return getTools(toComplete), cobra.ShellCompDirectiveNoFileComp
 }
 
-func ValidArgsGetMetrics(_ *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
-	if len(args) != 0 {
-		return nil, cobra.ShellCompDirectiveNoFileComp
-	}
-
+func ValidArgsGetMetrics(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
 	return getMetrics(toComplete), cobra.ShellCompDirectiveNoFileComp
 }
 
-func ValidArgsGetCloudServices(_ *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
-	if len(args) != 0 {
-		return nil, cobra.ShellCompDirectiveNoFileComp
-	}
+func ValidArgsGetRequirements(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
+	return getRequirements(toComplete), cobra.ShellCompDirectiveNoFileComp
+}
 
+func ValidArgsGetCloudServices(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
 	return getCloudServices(toComplete), cobra.ShellCompDirectiveNoFileComp
 }
 
@@ -327,6 +319,34 @@ func getMetrics(_ string) []string {
 	return metrics
 }
 
+// TODO(oxisto): This could be an interesting use case for 1.18 Go generics
+func getRequirements(_ string) []string {
+	var (
+		err     error
+		session *Session
+		client  orchestrator.OrchestratorClient
+		res     *orchestrator.ListRequirementsResponse
+	)
+
+	if session, err = ContinueSession(); err != nil {
+		fmt.Printf("Error while retrieving the session. Please re-authenticate.\n")
+		return nil
+	}
+
+	client = orchestrator.NewOrchestratorClient(session)
+
+	if res, err = client.ListRequirements(context.Background(), &orchestrator.ListRequirementsRequest{}); err != nil {
+		return []string{}
+	}
+
+	var requirements []string
+	for _, v := range res.Requirements {
+		requirements = append(requirements, fmt.Sprintf("%s\t%s: %s", v.Id, v.Name, v.Description))
+	}
+
+	return requirements
+}
+
 func getCloudServices(_ string) []string {
 	var (
 		err     error
diff --git a/openapi/orchestrator/openapi.yaml b/openapi/orchestrator/openapi.yaml
index 8ed6e571..bb4cbf18 100644
--- a/openapi/orchestrator/openapi.yaml
+++ b/openapi/orchestrator/openapi.yaml
@@ -421,6 +421,18 @@ paths:
                         application/json:
                             schema:
                                 $ref: '#/components/schemas/MetricImplementation'
+    /v1/orchestrator/requirements:
+        get:
+            tags:
+                - Orchestrator
+            operationId: Orchestrator_ListRequirements
+            responses:
+                "200":
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/ListRequirementsResponse'
 components:
     schemas:
         AllowedValues:
@@ -483,6 +495,15 @@ components:
                     type: string
                 description:
                     type: string
+                requirements:
+                    $ref: '#/components/schemas/CloudService_Requirements'
+        CloudService_Requirements:
+            type: object
+            properties:
+                requirementIds:
+                    type: array
+                    items:
+                        type: string
         ListAssessmentResultsResponse:
             type: object
             properties:
@@ -519,6 +540,13 @@ components:
                     type: array
                     items:
                         $ref: '#/components/schemas/Metric'
+        ListRequirementsResponse:
+            type: object
+            properties:
+                requirements:
+                    type: array
+                    items:
+                        $ref: '#/components/schemas/Requirement'
         ListValue:
             type: object
             properties:
@@ -603,6 +631,20 @@ components:
                 minMax:
                     $ref: '#/components/schemas/MinMax'
             description: A range resource representing the range of values
+        Requirement:
+            type: object
+            properties:
+                id:
+                    type: string
+                name:
+                    type: string
+                description:
+                    type: string
+                metricIds:
+                    type: array
+                    items:
+                        type: string
+            description: Requirement represents a certain requirement that needs to be fulfilled. It could be a control in a certification catalog.
         StoreAssessmentResultResponse:
             type: object
             properties:
diff --git a/service/orchestrator/orchestrator.go b/service/orchestrator/orchestrator.go
index fa4ac9cb..8db7e4da 100644
--- a/service/orchestrator/orchestrator.go
+++ b/service/orchestrator/orchestrator.go
@@ -44,7 +44,7 @@ import (
 	"google.golang.org/grpc/status"
 )
 
-//go:embed metrics.json
+//go:embed *.json
 var f embed.FS
 
 var metrics []*assessment.Metric
@@ -53,6 +53,7 @@ var defaultMetricConfigurations map[string]*assessment.MetricConfiguration
 var log *logrus.Entry
 
 var DefaultMetricsFile = "metrics.json"
+var DefaultRequirementsFile = "requirements.json"
 
 // Service is an implementation of the Clouditor Orchestrator service
 type Service struct {
@@ -72,6 +73,8 @@ type Service struct {
 	storage persistence.Storage
 
 	metricsFile string
+
+	requirements []*orchestrator.Requirement
 }
 
 func init() {
@@ -88,6 +91,12 @@ func WithMetricsFile(file string) ServiceOption {
 	}
 }
 
+func WithRequirements(r []*orchestrator.Requirement) ServiceOption {
+	return func(s *Service) {
+		s.requirements = r
+	}
+}
+
 // WithStorage is an option to set the storage. If not set, NewService will use inmemory storage.
 func WithStorage(storage persistence.Storage) ServiceOption {
 	return func(s *Service) {
@@ -117,6 +126,13 @@ func NewService(opts ...ServiceOption) *Service {
 		}
 	}
 
+	// Load requirements if nothing was specified
+	if s.requirements == nil {
+		if s.requirements, err = LoadRequirements(DefaultRequirementsFile); err != nil {
+			log.Errorf("Could not load embedded requirements. Will continue with empty requirements list: %v", err)
+		}
+	}
+
 	if err = LoadMetrics(s.metricsFile); err != nil {
 		log.Errorf("Could not load embedded metrics. Will continue with empty metric list: %v", err)
 	}
diff --git a/service/orchestrator/requirements.go b/service/orchestrator/requirements.go
new file mode 100644
index 00000000..51ba0eef
--- /dev/null
+++ b/service/orchestrator/requirements.go
@@ -0,0 +1,63 @@
+// Copyright 2022 Fraunhofer AISEC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//           $$\                           $$\ $$\   $$\
+//           $$ |                          $$ |\__|  $$ |
+//  $$$$$$$\ $$ | $$$$$$\  $$\   $$\  $$$$$$$ |$$\ $$$$$$\    $$$$$$\   $$$$$$\
+// $$  _____|$$ |$$  __$$\ $$ |  $$ |$$  __$$ |$$ |\_$$  _|  $$  __$$\ $$  __$$\
+// $$ /      $$ |$$ /  $$ |$$ |  $$ |$$ /  $$ |$$ |  $$ |    $$ /  $$ |$$ | \__|
+// $$ |      $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$\ $$ |  $$ |$$ |
+// \$$$$$$\  $$ |\$$$$$   |\$$$$$   |\$$$$$$  |$$ |  \$$$   |\$$$$$   |$$ |
+//  \_______|\__| \______/  \______/  \_______|\__|   \____/  \______/ \__|
+//
+// This file is part of Clouditor Community Edition.
+
+package orchestrator
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"clouditor.io/clouditor/api/orchestrator"
+)
+
+// LoadRequirements loads requirements definitions from a JSON file.
+func LoadRequirements(file string) (requirements []*orchestrator.Requirement, err error) {
+	var (
+		b []byte
+	)
+
+	log.Infof("Loading requirements from %s", file)
+
+	b, err = f.ReadFile(file)
+	if err != nil {
+		return nil, fmt.Errorf("error while loading %s: %w", file, err)
+	}
+
+	err = json.Unmarshal(b, &requirements)
+	if err != nil {
+		return nil, fmt.Errorf("error in JSON marshal: %w", err)
+	}
+
+	return requirements, nil
+}
+
+// ListRequirements is a method implementation of the OrchestratorServer interface,
+// returning a list of requirements
+func (svc *Service) ListRequirements(_ context.Context, _ *orchestrator.ListRequirementsRequest) (response *orchestrator.ListRequirementsResponse, err error) {
+	return &orchestrator.ListRequirementsResponse{
+		Requirements: svc.requirements,
+	}, nil
+}
diff --git a/service/orchestrator/requirements.json b/service/orchestrator/requirements.json
new file mode 100644
index 00000000..3d59cc67
--- /dev/null
+++ b/service/orchestrator/requirements.json
@@ -0,0 +1,11 @@
+[
+    {
+        "id": "Req-1",
+        "name": "Make-it-Secure",
+        "description": "You should make everything secure",
+        "metric_ids": [
+            "TransportEncryptionEnabled",
+            "TransportEncryptionAlgorithm"
+        ]
+    }
+]
\ No newline at end of file


Test patch:
diff --git a/api/orchestrator/orchestrator_test.go b/api/orchestrator/orchestrator_test.go
new file mode 100644
index 00000000..52db7ea6
--- /dev/null
+++ b/api/orchestrator/orchestrator_test.go
@@ -0,0 +1,123 @@
+// Copyright 2022 Fraunhofer AISEC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//           $$\                           $$\ $$\   $$\
+//           $$ |                          $$ |\__|  $$ |
+//  $$$$$$$\ $$ | $$$$$$\  $$\   $$\  $$$$$$$ |$$\ $$$$$$\    $$$$$$\   $$$$$$\
+// $$  _____|$$ |$$  __$$\ $$ |  $$ |$$  __$$ |$$ |\_$$  _|  $$  __$$\ $$  __$$\
+// $$ /      $$ |$$ /  $$ |$$ |  $$ |$$ /  $$ |$$ |  $$ |    $$ /  $$ |$$ | \__|
+// $$ |      $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$\ $$ |  $$ |$$ |
+// \$$$$$$\  $$ |\$$$$$   |\$$$$$   |\$$$$$$  |$$ |  \$$$   |\$$$$$   |$$ |
+//  \_______|\__| \______/  \______/  \_______|\__|   \____/  \______/ \__|
+//
+// This file is part of Clouditor Community Edition.
+
+package orchestrator
+
+import (
+	"database/sql/driver"
+	"reflect"
+	"testing"
+)
+
+func TestCloudService_Requirements_Scan(t *testing.T) {
+	type args struct {
+		value interface{}
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+		want    *CloudService_Requirements
+	}{
+		{
+			name: "string type",
+			args: args{
+				value: "a,b",
+			},
+			wantErr: false,
+			want: &CloudService_Requirements{
+				RequirementIds: []string{"a", "b"},
+			},
+		},
+		{
+			name: "unsupported type",
+			args: args{
+				value: 0,
+			},
+			wantErr: true,
+			want:    &CloudService_Requirements{},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			c := &CloudService_Requirements{}
+
+			if err := c.Scan(tt.args.value); (err != nil) != tt.wantErr {
+				t.Errorf("CloudService_Requirements.Scan() error = %v, wantErr %v", err, tt.wantErr)
+			}
+
+			if !reflect.DeepEqual(c, tt.want) {
+				t.Errorf("CloudService_Requirements.Scan() = %v, want %v", c, tt.want)
+			}
+		})
+	}
+}
+
+func TestCloudService_Requirements_Value(t *testing.T) {
+	type fields struct {
+		RequirementIds []string
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		want    driver.Value
+		wantErr bool
+	}{
+		{
+			name: "empty requirements",
+			fields: fields{
+				RequirementIds: nil,
+			},
+			want:    nil,
+			wantErr: false,
+		},
+		{
+			name: "some requirements",
+			fields: fields{
+				RequirementIds: []string{"a", "b"},
+			},
+			want:    driver.Value(string("a,b")),
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			c := &CloudService_Requirements{
+				RequirementIds: tt.fields.RequirementIds,
+			}
+
+			got, err := c.Value()
+			if (err != nil) != tt.wantErr {
+				t.Errorf("CloudService_Requirements.Value() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("CloudService_Requirements.Value() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/cli/commands/requirement/requirement_test.go b/cli/commands/requirement/requirement_test.go
new file mode 100644
index 00000000..7e6f362c
--- /dev/null
+++ b/cli/commands/requirement/requirement_test.go
@@ -0,0 +1,68 @@
+// Copyright 2022 Fraunhofer AISEC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//           $$\                           $$\ $$\   $$\
+//           $$ |                          $$ |\__|  $$ |
+//  $$$$$$$\ $$ | $$$$$$\  $$\   $$\  $$$$$$$ |$$\ $$$$$$\    $$$$$$\   $$$$$$\
+// $$  _____|$$ |$$  __$$\ $$ |  $$ |$$  __$$ |$$ |\_$$  _|  $$  __$$\ $$  __$$\
+// $$ /      $$ |$$ /  $$ |$$ |  $$ |$$ /  $$ |$$ |  $$ |    $$ /  $$ |$$ | \__|
+// $$ |      $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$\ $$ |  $$ |$$ |
+// \$$$$$$\  $$ |\$$$$$   |\$$$$$   |\$$$$$$  |$$ |  \$$$   |\$$$$$   |$$ |
+//  \_______|\__| \______/  \______/  \_______|\__|   \____/  \______/ \__|
+//
+// This file is part of Clouditor Community Edition.
+
+package requirement
+
+import (
+	"bytes"
+	"os"
+	"testing"
+
+	"clouditor.io/clouditor/internal/testutil/clitest"
+	"clouditor.io/clouditor/service"
+
+	"clouditor.io/clouditor/api/orchestrator"
+	"clouditor.io/clouditor/cli"
+	service_orchestrator "clouditor.io/clouditor/service/orchestrator"
+
+	"github.com/stretchr/testify/assert"
+	"google.golang.org/protobuf/encoding/protojson"
+)
+
+func TestMain(m *testing.M) {
+	clitest.AutoChdir()
+
+	os.Exit(clitest.RunCLITest(m, service.WithOrchestrator(service_orchestrator.NewService())))
+}
+
+func TestListRequirements(t *testing.T) {
+	var err error
+	var b bytes.Buffer
+
+	cli.Output = &b
+
+	cmd := NewListRequirementsCommand()
+	err = cmd.RunE(nil, []string{})
+
+	assert.NoError(t, err)
+
+	var response *orchestrator.ListRequirementsResponse = &orchestrator.ListRequirementsResponse{}
+
+	err = protojson.Unmarshal(b.Bytes(), response)
+
+	assert.NoError(t, err)
+	assert.NotNil(t, response)
+	assert.NotEmpty(t, response.Requirements)
+}
diff --git a/cli/session_test.go b/cli/session_test.go
index d112b7b2..d16d1b57 100644
--- a/cli/session_test.go
+++ b/cli/session_test.go
@@ -169,6 +169,45 @@ func TestValidArgsGetMetrics(t *testing.T) {
 	}
 }
 
+func TestValidArgsGetRequirements(t *testing.T) {
+	type args struct {
+		in0        *cobra.Command
+		args       []string
+		toComplete string
+	}
+	tests := []struct {
+		name  string
+		args  args
+		want  assert.ValueAssertionFunc
+		want1 cobra.ShellCompDirective
+	}{
+		{
+			name: "some requirements",
+			args: args{
+				toComplete: "",
+			},
+			want: func(tt assert.TestingT, i1 interface{}, i2 ...interface{}) bool {
+				return assert.NotNil(tt, i1)
+			},
+			want1: cobra.ShellCompDirectiveNoFileComp,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, got1 := cli.ValidArgsGetRequirements(tt.args.in0, tt.args.args, tt.args.toComplete)
+
+			if tt.want != nil {
+				tt.want(t, got)
+			}
+
+			if !reflect.DeepEqual(got1, tt.want1) {
+				t.Errorf("ValidArgsGetRequirements() got1 = %v, want %v", got1, tt.want1)
+			}
+		})
+	}
+}
+
 func TestValidArgsGetCloudServices(t *testing.T) {
 	type args struct {
 		in0        *cobra.Command