diff --git a/apis/go/mlops/agent/agent.pb.go b/apis/go/mlops/agent/agent.pb.go index 463998e6fe..1ce99795e4 100644 --- a/apis/go/mlops/agent/agent.pb.go +++ b/apis/go/mlops/agent/agent.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 diff --git a/apis/go/mlops/agent/agent_grpc.pb.go b/apis/go/mlops/agent/agent_grpc.pb.go index e883442903..f20384413f 100644 --- a/apis/go/mlops/agent/agent_grpc.pb.go +++ b/apis/go/mlops/agent/agent_grpc.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 diff --git a/apis/go/mlops/agent_debug/agent_debug.pb.go b/apis/go/mlops/agent_debug/agent_debug.pb.go index 8affc2991d..4507be2417 100644 --- a/apis/go/mlops/agent_debug/agent_debug.pb.go +++ b/apis/go/mlops/agent_debug/agent_debug.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Debug service for agent replica // Code generated by protoc-gen-go. DO NOT EDIT. diff --git a/apis/go/mlops/agent_debug/agent_debug_grpc.pb.go b/apis/go/mlops/agent_debug/agent_debug_grpc.pb.go index 7c85ff2316..c66eda6366 100644 --- a/apis/go/mlops/agent_debug/agent_debug_grpc.pb.go +++ b/apis/go/mlops/agent_debug/agent_debug_grpc.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 diff --git a/apis/go/mlops/chainer/chainer.pb.go b/apis/go/mlops/chainer/chainer.pb.go index 6b64e39be1..bd60b4eb7e 100644 --- a/apis/go/mlops/chainer/chainer.pb.go +++ b/apis/go/mlops/chainer/chainer.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 @@ -272,15 +256,15 @@ type PipelineStepUpdate struct { // Pipeline Resource example, e.g. transform.outputs.traffic // // seldon.... - Sources []string `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` - Triggers []string `protobuf:"bytes,2,rep,name=triggers,proto3" json:"triggers,omitempty"` - Sink string `protobuf:"bytes,3,opt,name=sink,proto3" json:"sink,omitempty"` + Sources []*PipelineTopic `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` + Triggers []*PipelineTopic `protobuf:"bytes,2,rep,name=triggers,proto3" json:"triggers,omitempty"` + Sink *PipelineTopic `protobuf:"bytes,3,opt,name=sink,proto3" json:"sink,omitempty"` InputJoinTy PipelineStepUpdate_PipelineJoinType `protobuf:"varint,4,opt,name=inputJoinTy,proto3,enum=seldon.mlops.chainer.PipelineStepUpdate_PipelineJoinType" json:"inputJoinTy,omitempty"` TriggersJoinTy PipelineStepUpdate_PipelineJoinType `protobuf:"varint,5,opt,name=triggersJoinTy,proto3,enum=seldon.mlops.chainer.PipelineStepUpdate_PipelineJoinType" json:"triggersJoinTy,omitempty"` - PassEmptyResponses bool `protobuf:"varint,6,opt,name=passEmptyResponses,proto3" json:"passEmptyResponses,omitempty"` // Forward empty response to following steps, default false - JoinWindowMs *uint32 `protobuf:"varint,7,opt,name=joinWindowMs,proto3,oneof" json:"joinWindowMs,omitempty"` // Join window millisecs, some nozero default (TBD) - TensorMap map[string]string `protobuf:"bytes,8,rep,name=tensorMap,proto3" json:"tensorMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // optional map of tensor name mappings - Batch *Batch `protobuf:"bytes,9,opt,name=batch,proto3" json:"batch,omitempty"` // Batch settings + PassEmptyResponses bool `protobuf:"varint,6,opt,name=passEmptyResponses,proto3" json:"passEmptyResponses,omitempty"` // Forward empty response to following steps, default false + JoinWindowMs *uint32 `protobuf:"varint,7,opt,name=joinWindowMs,proto3,oneof" json:"joinWindowMs,omitempty"` // Join window millisecs, some nozero default (TBD) + TensorMap []*PipelineTensorMapping `protobuf:"bytes,8,rep,name=tensorMap,proto3" json:"tensorMap,omitempty"` // optional list of tensor name mappings + Batch *Batch `protobuf:"bytes,9,opt,name=batch,proto3" json:"batch,omitempty"` // Batch settings } func (x *PipelineStepUpdate) Reset() { @@ -315,25 +299,25 @@ func (*PipelineStepUpdate) Descriptor() ([]byte, []int) { return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{2} } -func (x *PipelineStepUpdate) GetSources() []string { +func (x *PipelineStepUpdate) GetSources() []*PipelineTopic { if x != nil { return x.Sources } return nil } -func (x *PipelineStepUpdate) GetTriggers() []string { +func (x *PipelineStepUpdate) GetTriggers() []*PipelineTopic { if x != nil { return x.Triggers } return nil } -func (x *PipelineStepUpdate) GetSink() string { +func (x *PipelineStepUpdate) GetSink() *PipelineTopic { if x != nil { return x.Sink } - return "" + return nil } func (x *PipelineStepUpdate) GetInputJoinTy() PipelineStepUpdate_PipelineJoinType { @@ -364,7 +348,7 @@ func (x *PipelineStepUpdate) GetJoinWindowMs() uint32 { return 0 } -func (x *PipelineStepUpdate) GetTensorMap() map[string]string { +func (x *PipelineStepUpdate) GetTensorMap() []*PipelineTensorMapping { if x != nil { return x.TensorMap } @@ -378,6 +362,124 @@ func (x *PipelineStepUpdate) GetBatch() *Batch { return nil } +type PipelineTensorMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PipelineName string `protobuf:"bytes,1,opt,name=pipelineName,proto3" json:"pipelineName,omitempty"` + TopicAndTensor string `protobuf:"bytes,2,opt,name=topicAndTensor,proto3" json:"topicAndTensor,omitempty"` + TensorName string `protobuf:"bytes,3,opt,name=tensorName,proto3" json:"tensorName,omitempty"` +} + +func (x *PipelineTensorMapping) Reset() { + *x = PipelineTensorMapping{} + if protoimpl.UnsafeEnabled { + mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PipelineTensorMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PipelineTensorMapping) ProtoMessage() {} + +func (x *PipelineTensorMapping) ProtoReflect() protoreflect.Message { + mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + 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 PipelineTensorMapping.ProtoReflect.Descriptor instead. +func (*PipelineTensorMapping) Descriptor() ([]byte, []int) { + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{3} +} + +func (x *PipelineTensorMapping) GetPipelineName() string { + if x != nil { + return x.PipelineName + } + return "" +} + +func (x *PipelineTensorMapping) GetTopicAndTensor() string { + if x != nil { + return x.TopicAndTensor + } + return "" +} + +func (x *PipelineTensorMapping) GetTensorName() string { + if x != nil { + return x.TensorName + } + return "" +} + +type PipelineTopic struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PipelineName string `protobuf:"bytes,1,opt,name=pipelineName,proto3" json:"pipelineName,omitempty"` + TopicName string `protobuf:"bytes,2,opt,name=topicName,proto3" json:"topicName,omitempty"` +} + +func (x *PipelineTopic) Reset() { + *x = PipelineTopic{} + if protoimpl.UnsafeEnabled { + mi := &file_mlops_chainer_chainer_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PipelineTopic) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PipelineTopic) ProtoMessage() {} + +func (x *PipelineTopic) ProtoReflect() protoreflect.Message { + mi := &file_mlops_chainer_chainer_proto_msgTypes[4] + 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 PipelineTopic.ProtoReflect.Descriptor instead. +func (*PipelineTopic) Descriptor() ([]byte, []int) { + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{4} +} + +func (x *PipelineTopic) GetPipelineName() string { + if x != nil { + return x.PipelineName + } + return "" +} + +func (x *PipelineTopic) GetTopicName() string { + if x != nil { + return x.TopicName + } + return "" +} + type Batch struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -391,7 +493,7 @@ type Batch struct { func (x *Batch) Reset() { *x = Batch{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + mi := &file_mlops_chainer_chainer_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -404,7 +506,7 @@ func (x *Batch) String() string { func (*Batch) ProtoMessage() {} func (x *Batch) ProtoReflect() protoreflect.Message { - mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + mi := &file_mlops_chainer_chainer_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -417,7 +519,7 @@ func (x *Batch) ProtoReflect() protoreflect.Message { // Deprecated: Use Batch.ProtoReflect.Descriptor instead. func (*Batch) Descriptor() ([]byte, []int) { - return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{3} + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{5} } func (x *Batch) GetSize() uint32 { @@ -455,7 +557,7 @@ type PipelineUpdateStatusMessage struct { func (x *PipelineUpdateStatusMessage) Reset() { *x = PipelineUpdateStatusMessage{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_chainer_chainer_proto_msgTypes[4] + mi := &file_mlops_chainer_chainer_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -468,7 +570,7 @@ func (x *PipelineUpdateStatusMessage) String() string { func (*PipelineUpdateStatusMessage) ProtoMessage() {} func (x *PipelineUpdateStatusMessage) ProtoReflect() protoreflect.Message { - mi := &file_mlops_chainer_chainer_proto_msgTypes[4] + mi := &file_mlops_chainer_chainer_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -481,7 +583,7 @@ func (x *PipelineUpdateStatusMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineUpdateStatusMessage.ProtoReflect.Descriptor instead. func (*PipelineUpdateStatusMessage) Descriptor() ([]byte, []int) { - return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{4} + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{6} } func (x *PipelineUpdateStatusMessage) GetUpdate() *PipelineUpdateMessage { @@ -514,7 +616,7 @@ type PipelineUpdateStatusResponse struct { func (x *PipelineUpdateStatusResponse) Reset() { *x = PipelineUpdateStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_chainer_chainer_proto_msgTypes[5] + mi := &file_mlops_chainer_chainer_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -527,7 +629,7 @@ func (x *PipelineUpdateStatusResponse) String() string { func (*PipelineUpdateStatusResponse) ProtoMessage() {} func (x *PipelineUpdateStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_chainer_chainer_proto_msgTypes[5] + mi := &file_mlops_chainer_chainer_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -540,7 +642,7 @@ func (x *PipelineUpdateStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineUpdateStatusResponse.ProtoReflect.Descriptor instead. func (*PipelineUpdateStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{5} + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{7} } var File_mlops_chainer_chainer_proto protoreflect.FileDescriptor @@ -571,89 +673,105 @@ var file_mlops_chainer_chainer_proto_rawDesc = []byte{ 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0x90, 0x05, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x73, 0x69, 0x6e, 0x6b, 0x12, 0x5b, 0x0a, 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4a, - 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, - 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4a, 0x6f, 0x69, - 0x6e, 0x54, 0x79, 0x12, 0x61, 0x0a, 0x0e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, - 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, - 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, - 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, - 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x55, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x6e, 0x6e, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x10, 0x02, 0x12, 0x07, - 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x10, 0x03, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, - 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x71, 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x00, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x08, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x6f, - 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x1b, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x32, 0x89, 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x7e, - 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, - 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0xb5, 0x05, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x07, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x70, + 0x69, 0x63, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x7e, - 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x32, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x70, + 0x69, 0x63, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x04, + 0x73, 0x69, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, + 0x04, 0x73, 0x69, 0x6e, 0x6b, 0x12, 0x5b, 0x0a, 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4a, 0x6f, + 0x69, 0x6e, 0x54, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x69, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4a, 0x6f, 0x69, 0x6e, + 0x54, 0x79, 0x12, 0x61, 0x0a, 0x0e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, + 0x69, 0x6e, 0x54, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x69, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, + 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, + 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x49, + 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x09, + 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3e, 0x0a, 0x10, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x75, 0x74, 0x65, + 0x72, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x10, 0x03, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x83, 0x01, + 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x74, + 0x6f, 0x70, 0x69, 0x63, 0x41, 0x6e, 0x64, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x41, 0x6e, 0x64, 0x54, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, + 0x6f, 0x70, 0x69, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x70, + 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x71, 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x08, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x1b, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x89, 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x7e, 0x0a, 0x18, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x53, - 0x0a, 0x17, 0x69, 0x6f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, - 0x67, 0x6f, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x32, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x53, 0x0a, 0x17, + 0x69, 0x6f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x6f, + 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -669,35 +787,39 @@ func file_mlops_chainer_chainer_proto_rawDescGZIP() []byte { } var file_mlops_chainer_chainer_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_mlops_chainer_chainer_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_mlops_chainer_chainer_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_mlops_chainer_chainer_proto_goTypes = []interface{}{ (PipelineUpdateMessage_PipelineOperation)(0), // 0: seldon.mlops.chainer.PipelineUpdateMessage.PipelineOperation (PipelineStepUpdate_PipelineJoinType)(0), // 1: seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType (*PipelineSubscriptionRequest)(nil), // 2: seldon.mlops.chainer.PipelineSubscriptionRequest (*PipelineUpdateMessage)(nil), // 3: seldon.mlops.chainer.PipelineUpdateMessage (*PipelineStepUpdate)(nil), // 4: seldon.mlops.chainer.PipelineStepUpdate - (*Batch)(nil), // 5: seldon.mlops.chainer.Batch - (*PipelineUpdateStatusMessage)(nil), // 6: seldon.mlops.chainer.PipelineUpdateStatusMessage - (*PipelineUpdateStatusResponse)(nil), // 7: seldon.mlops.chainer.PipelineUpdateStatusResponse - nil, // 8: seldon.mlops.chainer.PipelineStepUpdate.TensorMapEntry + (*PipelineTensorMapping)(nil), // 5: seldon.mlops.chainer.PipelineTensorMapping + (*PipelineTopic)(nil), // 6: seldon.mlops.chainer.PipelineTopic + (*Batch)(nil), // 7: seldon.mlops.chainer.Batch + (*PipelineUpdateStatusMessage)(nil), // 8: seldon.mlops.chainer.PipelineUpdateStatusMessage + (*PipelineUpdateStatusResponse)(nil), // 9: seldon.mlops.chainer.PipelineUpdateStatusResponse } var file_mlops_chainer_chainer_proto_depIdxs = []int32{ - 0, // 0: seldon.mlops.chainer.PipelineUpdateMessage.op:type_name -> seldon.mlops.chainer.PipelineUpdateMessage.PipelineOperation - 4, // 1: seldon.mlops.chainer.PipelineUpdateMessage.updates:type_name -> seldon.mlops.chainer.PipelineStepUpdate - 1, // 2: seldon.mlops.chainer.PipelineStepUpdate.inputJoinTy:type_name -> seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType - 1, // 3: seldon.mlops.chainer.PipelineStepUpdate.triggersJoinTy:type_name -> seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType - 8, // 4: seldon.mlops.chainer.PipelineStepUpdate.tensorMap:type_name -> seldon.mlops.chainer.PipelineStepUpdate.TensorMapEntry - 5, // 5: seldon.mlops.chainer.PipelineStepUpdate.batch:type_name -> seldon.mlops.chainer.Batch - 3, // 6: seldon.mlops.chainer.PipelineUpdateStatusMessage.update:type_name -> seldon.mlops.chainer.PipelineUpdateMessage - 2, // 7: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:input_type -> seldon.mlops.chainer.PipelineSubscriptionRequest - 6, // 8: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:input_type -> seldon.mlops.chainer.PipelineUpdateStatusMessage - 3, // 9: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:output_type -> seldon.mlops.chainer.PipelineUpdateMessage - 7, // 10: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:output_type -> seldon.mlops.chainer.PipelineUpdateStatusResponse - 9, // [9:11] is the sub-list for method output_type - 7, // [7:9] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 0, // 0: seldon.mlops.chainer.PipelineUpdateMessage.op:type_name -> seldon.mlops.chainer.PipelineUpdateMessage.PipelineOperation + 4, // 1: seldon.mlops.chainer.PipelineUpdateMessage.updates:type_name -> seldon.mlops.chainer.PipelineStepUpdate + 6, // 2: seldon.mlops.chainer.PipelineStepUpdate.sources:type_name -> seldon.mlops.chainer.PipelineTopic + 6, // 3: seldon.mlops.chainer.PipelineStepUpdate.triggers:type_name -> seldon.mlops.chainer.PipelineTopic + 6, // 4: seldon.mlops.chainer.PipelineStepUpdate.sink:type_name -> seldon.mlops.chainer.PipelineTopic + 1, // 5: seldon.mlops.chainer.PipelineStepUpdate.inputJoinTy:type_name -> seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType + 1, // 6: seldon.mlops.chainer.PipelineStepUpdate.triggersJoinTy:type_name -> seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType + 5, // 7: seldon.mlops.chainer.PipelineStepUpdate.tensorMap:type_name -> seldon.mlops.chainer.PipelineTensorMapping + 7, // 8: seldon.mlops.chainer.PipelineStepUpdate.batch:type_name -> seldon.mlops.chainer.Batch + 3, // 9: seldon.mlops.chainer.PipelineUpdateStatusMessage.update:type_name -> seldon.mlops.chainer.PipelineUpdateMessage + 2, // 10: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:input_type -> seldon.mlops.chainer.PipelineSubscriptionRequest + 8, // 11: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:input_type -> seldon.mlops.chainer.PipelineUpdateStatusMessage + 3, // 12: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:output_type -> seldon.mlops.chainer.PipelineUpdateMessage + 9, // 13: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:output_type -> seldon.mlops.chainer.PipelineUpdateStatusResponse + 12, // [12:14] is the sub-list for method output_type + 10, // [10:12] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_mlops_chainer_chainer_proto_init() } @@ -743,7 +865,7 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Batch); i { + switch v := v.(*PipelineTensorMapping); i { case 0: return &v.state case 1: @@ -755,7 +877,7 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineUpdateStatusMessage); i { + switch v := v.(*PipelineTopic); i { case 0: return &v.state case 1: @@ -767,6 +889,30 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Batch); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mlops_chainer_chainer_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PipelineUpdateStatusMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mlops_chainer_chainer_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PipelineUpdateStatusResponse); i { case 0: return &v.state @@ -780,14 +926,14 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[2].OneofWrappers = []interface{}{} - file_mlops_chainer_chainer_proto_msgTypes[3].OneofWrappers = []interface{}{} + file_mlops_chainer_chainer_proto_msgTypes[5].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mlops_chainer_chainer_proto_rawDesc, NumEnums: 2, - NumMessages: 7, + NumMessages: 8, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/go/mlops/chainer/chainer_grpc.pb.go b/apis/go/mlops/chainer/chainer_grpc.pb.go index 9fda44f0de..85d299adb0 100644 --- a/apis/go/mlops/chainer/chainer_grpc.pb.go +++ b/apis/go/mlops/chainer/chainer_grpc.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 diff --git a/apis/go/mlops/proxy/proxy.pb.go b/apis/go/mlops/proxy/proxy.pb.go index 21bd1a7192..6ccbbbace8 100644 --- a/apis/go/mlops/proxy/proxy.pb.go +++ b/apis/go/mlops/proxy/proxy.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 diff --git a/apis/go/mlops/proxy/proxy_grpc.pb.go b/apis/go/mlops/proxy/proxy_grpc.pb.go index 0ef992ade3..973e9d4790 100644 --- a/apis/go/mlops/proxy/proxy_grpc.pb.go +++ b/apis/go/mlops/proxy/proxy_grpc.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 diff --git a/apis/go/mlops/scheduler/scheduler.pb.go b/apis/go/mlops/scheduler/scheduler.pb.go index 649d0ec991..d3f8338f95 100644 --- a/apis/go/mlops/scheduler/scheduler.pb.go +++ b/apis/go/mlops/scheduler/scheduler.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 @@ -275,6 +259,55 @@ func (PipelineStep_JoinOp) EnumDescriptor() ([]byte, []int) { return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{39, 0} } +type PipelineInput_JoinOp int32 + +const ( + PipelineInput_INNER PipelineInput_JoinOp = 0 + PipelineInput_OUTER PipelineInput_JoinOp = 1 + PipelineInput_ANY PipelineInput_JoinOp = 2 +) + +// Enum value maps for PipelineInput_JoinOp. +var ( + PipelineInput_JoinOp_name = map[int32]string{ + 0: "INNER", + 1: "OUTER", + 2: "ANY", + } + PipelineInput_JoinOp_value = map[string]int32{ + "INNER": 0, + "OUTER": 1, + "ANY": 2, + } +) + +func (x PipelineInput_JoinOp) Enum() *PipelineInput_JoinOp { + p := new(PipelineInput_JoinOp) + *p = x + return p +} + +func (x PipelineInput_JoinOp) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PipelineInput_JoinOp) Descriptor() protoreflect.EnumDescriptor { + return file_mlops_scheduler_scheduler_proto_enumTypes[4].Descriptor() +} + +func (PipelineInput_JoinOp) Type() protoreflect.EnumType { + return &file_mlops_scheduler_scheduler_proto_enumTypes[4] +} + +func (x PipelineInput_JoinOp) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PipelineInput_JoinOp.Descriptor instead. +func (PipelineInput_JoinOp) EnumDescriptor() ([]byte, []int) { + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41, 0} +} + type PipelineOutput_JoinOp int32 const ( @@ -308,11 +341,11 @@ func (x PipelineOutput_JoinOp) String() string { } func (PipelineOutput_JoinOp) Descriptor() protoreflect.EnumDescriptor { - return file_mlops_scheduler_scheduler_proto_enumTypes[4].Descriptor() + return file_mlops_scheduler_scheduler_proto_enumTypes[5].Descriptor() } func (PipelineOutput_JoinOp) Type() protoreflect.EnumType { - return &file_mlops_scheduler_scheduler_proto_enumTypes[4] + return &file_mlops_scheduler_scheduler_proto_enumTypes[5] } func (x PipelineOutput_JoinOp) Number() protoreflect.EnumNumber { @@ -321,7 +354,7 @@ func (x PipelineOutput_JoinOp) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineOutput_JoinOp.Descriptor instead. func (PipelineOutput_JoinOp) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42, 0} } type PipelineVersionState_PipelineStatus int32 @@ -372,11 +405,11 @@ func (x PipelineVersionState_PipelineStatus) String() string { } func (PipelineVersionState_PipelineStatus) Descriptor() protoreflect.EnumDescriptor { - return file_mlops_scheduler_scheduler_proto_enumTypes[5].Descriptor() + return file_mlops_scheduler_scheduler_proto_enumTypes[6].Descriptor() } func (PipelineVersionState_PipelineStatus) Type() protoreflect.EnumType { - return &file_mlops_scheduler_scheduler_proto_enumTypes[5] + return &file_mlops_scheduler_scheduler_proto_enumTypes[6] } func (x PipelineVersionState_PipelineStatus) Number() protoreflect.EnumNumber { @@ -385,7 +418,7 @@ func (x PipelineVersionState_PipelineStatus) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineVersionState_PipelineStatus.Descriptor instead. func (PipelineVersionState_PipelineStatus) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{49, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{50, 0} } type LoadModelRequest struct { @@ -2699,6 +2732,7 @@ type Pipeline struct { Steps []*PipelineStep `protobuf:"bytes,4,rep,name=steps,proto3" json:"steps,omitempty"` Output *PipelineOutput `protobuf:"bytes,5,opt,name=output,proto3,oneof" json:"output,omitempty"` KubernetesMeta *KubernetesMeta `protobuf:"bytes,6,opt,name=kubernetesMeta,proto3,oneof" json:"kubernetesMeta,omitempty"` + Input *PipelineInput `protobuf:"bytes,7,opt,name=input,proto3,oneof" json:"input,omitempty"` } func (x *Pipeline) Reset() { @@ -2775,6 +2809,13 @@ func (x *Pipeline) GetKubernetesMeta() *KubernetesMeta { return nil } +func (x *Pipeline) GetInput() *PipelineInput { + if x != nil { + return x.Input + } + return nil +} + type PipelineStep struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2933,6 +2974,93 @@ func (x *Batch) GetWindowMs() uint32 { return 0 } +type PipelineInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExternalInputs []string `protobuf:"bytes,1,rep,name=externalInputs,proto3" json:"externalInputs,omitempty"` + ExternalTriggers []string `protobuf:"bytes,2,rep,name=externalTriggers,proto3" json:"externalTriggers,omitempty"` + JoinWindowMs *uint32 `protobuf:"varint,3,opt,name=joinWindowMs,proto3,oneof" json:"joinWindowMs,omitempty"` // Join window millisecs for output, default 0 + JoinType PipelineInput_JoinOp `protobuf:"varint,4,opt,name=joinType,proto3,enum=seldon.mlops.scheduler.PipelineInput_JoinOp" json:"joinType,omitempty"` + TriggersJoin PipelineInput_JoinOp `protobuf:"varint,5,opt,name=triggersJoin,proto3,enum=seldon.mlops.scheduler.PipelineInput_JoinOp" json:"triggersJoin,omitempty"` + TensorMap map[string]string `protobuf:"bytes,6,rep,name=tensorMap,proto3" json:"tensorMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // optional map of tensor name mappings +} + +func (x *PipelineInput) Reset() { + *x = PipelineInput{} + if protoimpl.UnsafeEnabled { + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PipelineInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PipelineInput) ProtoMessage() {} + +func (x *PipelineInput) ProtoReflect() protoreflect.Message { + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + 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 PipelineInput.ProtoReflect.Descriptor instead. +func (*PipelineInput) Descriptor() ([]byte, []int) { + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41} +} + +func (x *PipelineInput) GetExternalInputs() []string { + if x != nil { + return x.ExternalInputs + } + return nil +} + +func (x *PipelineInput) GetExternalTriggers() []string { + if x != nil { + return x.ExternalTriggers + } + return nil +} + +func (x *PipelineInput) GetJoinWindowMs() uint32 { + if x != nil && x.JoinWindowMs != nil { + return *x.JoinWindowMs + } + return 0 +} + +func (x *PipelineInput) GetJoinType() PipelineInput_JoinOp { + if x != nil { + return x.JoinType + } + return PipelineInput_INNER +} + +func (x *PipelineInput) GetTriggersJoin() PipelineInput_JoinOp { + if x != nil { + return x.TriggersJoin + } + return PipelineInput_INNER +} + +func (x *PipelineInput) GetTensorMap() map[string]string { + if x != nil { + return x.TensorMap + } + return nil +} + type PipelineOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2947,7 +3075,7 @@ type PipelineOutput struct { func (x *PipelineOutput) Reset() { *x = PipelineOutput{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2960,7 +3088,7 @@ func (x *PipelineOutput) String() string { func (*PipelineOutput) ProtoMessage() {} func (x *PipelineOutput) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2973,7 +3101,7 @@ func (x *PipelineOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineOutput.ProtoReflect.Descriptor instead. func (*PipelineOutput) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42} } func (x *PipelineOutput) GetSteps() []string { @@ -3013,7 +3141,7 @@ type LoadPipelineResponse struct { func (x *LoadPipelineResponse) Reset() { *x = LoadPipelineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3026,7 +3154,7 @@ func (x *LoadPipelineResponse) String() string { func (*LoadPipelineResponse) ProtoMessage() {} func (x *LoadPipelineResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3039,7 +3167,7 @@ func (x *LoadPipelineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadPipelineResponse.ProtoReflect.Descriptor instead. func (*LoadPipelineResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{43} } type UnloadPipelineRequest struct { @@ -3053,7 +3181,7 @@ type UnloadPipelineRequest struct { func (x *UnloadPipelineRequest) Reset() { *x = UnloadPipelineRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3066,7 +3194,7 @@ func (x *UnloadPipelineRequest) String() string { func (*UnloadPipelineRequest) ProtoMessage() {} func (x *UnloadPipelineRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3079,7 +3207,7 @@ func (x *UnloadPipelineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadPipelineRequest.ProtoReflect.Descriptor instead. func (*UnloadPipelineRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{43} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44} } func (x *UnloadPipelineRequest) GetName() string { @@ -3098,7 +3226,7 @@ type UnloadPipelineResponse struct { func (x *UnloadPipelineResponse) Reset() { *x = UnloadPipelineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3111,7 +3239,7 @@ func (x *UnloadPipelineResponse) String() string { func (*UnloadPipelineResponse) ProtoMessage() {} func (x *UnloadPipelineResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3124,7 +3252,7 @@ func (x *UnloadPipelineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadPipelineResponse.ProtoReflect.Descriptor instead. func (*UnloadPipelineResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45} } type PipelineStatusRequest struct { @@ -3140,7 +3268,7 @@ type PipelineStatusRequest struct { func (x *PipelineStatusRequest) Reset() { *x = PipelineStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3153,7 +3281,7 @@ func (x *PipelineStatusRequest) String() string { func (*PipelineStatusRequest) ProtoMessage() {} func (x *PipelineStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3166,7 +3294,7 @@ func (x *PipelineStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStatusRequest.ProtoReflect.Descriptor instead. func (*PipelineStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46} } func (x *PipelineStatusRequest) GetSubscriberName() string { @@ -3201,7 +3329,7 @@ type PipelineSubscriptionRequest struct { func (x *PipelineSubscriptionRequest) Reset() { *x = PipelineSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3214,7 +3342,7 @@ func (x *PipelineSubscriptionRequest) String() string { func (*PipelineSubscriptionRequest) ProtoMessage() {} func (x *PipelineSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3227,7 +3355,7 @@ func (x *PipelineSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineSubscriptionRequest.ProtoReflect.Descriptor instead. func (*PipelineSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47} } func (x *PipelineSubscriptionRequest) GetSubscriberName() string { @@ -3249,7 +3377,7 @@ type PipelineStatusResponse struct { func (x *PipelineStatusResponse) Reset() { *x = PipelineStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3262,7 +3390,7 @@ func (x *PipelineStatusResponse) String() string { func (*PipelineStatusResponse) ProtoMessage() {} func (x *PipelineStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3275,7 +3403,7 @@ func (x *PipelineStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStatusResponse.ProtoReflect.Descriptor instead. func (*PipelineStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{48} } func (x *PipelineStatusResponse) GetPipelineName() string { @@ -3304,7 +3432,7 @@ type PipelineWithState struct { func (x *PipelineWithState) Reset() { *x = PipelineWithState{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3317,7 +3445,7 @@ func (x *PipelineWithState) String() string { func (*PipelineWithState) ProtoMessage() {} func (x *PipelineWithState) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3330,7 +3458,7 @@ func (x *PipelineWithState) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineWithState.ProtoReflect.Descriptor instead. func (*PipelineWithState) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{48} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{49} } func (x *PipelineWithState) GetPipeline() *Pipeline { @@ -3362,7 +3490,7 @@ type PipelineVersionState struct { func (x *PipelineVersionState) Reset() { *x = PipelineVersionState{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3375,7 +3503,7 @@ func (x *PipelineVersionState) String() string { func (*PipelineVersionState) ProtoMessage() {} func (x *PipelineVersionState) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3388,7 +3516,7 @@ func (x *PipelineVersionState) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineVersionState.ProtoReflect.Descriptor instead. func (*PipelineVersionState) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{49} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{50} } func (x *PipelineVersionState) GetPipelineVersion() uint32 { @@ -3437,7 +3565,7 @@ type SchedulerStatusRequest struct { func (x *SchedulerStatusRequest) Reset() { *x = SchedulerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3450,7 +3578,7 @@ func (x *SchedulerStatusRequest) String() string { func (*SchedulerStatusRequest) ProtoMessage() {} func (x *SchedulerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3463,7 +3591,7 @@ func (x *SchedulerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SchedulerStatusRequest.ProtoReflect.Descriptor instead. func (*SchedulerStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{50} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{51} } func (x *SchedulerStatusRequest) GetSubscriberName() string { @@ -3484,7 +3612,7 @@ type SchedulerStatusResponse struct { func (x *SchedulerStatusResponse) Reset() { *x = SchedulerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3497,7 +3625,7 @@ func (x *SchedulerStatusResponse) String() string { func (*SchedulerStatusResponse) ProtoMessage() {} func (x *SchedulerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3510,7 +3638,7 @@ func (x *SchedulerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SchedulerStatusResponse.ProtoReflect.Descriptor instead. func (*SchedulerStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{51} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{52} } func (x *SchedulerStatusResponse) GetApplicationVersion() string { @@ -3927,7 +4055,7 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, - 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xbe, 0x02, 0x0a, 0x08, 0x50, 0x69, + 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8a, 0x03, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, @@ -3945,271 +4073,307 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x9d, 0x04, 0x0a, 0x0c, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, - 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x51, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x4b, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x4a, 0x6f, 0x69, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, - 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x4a, 0x6f, - 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x0c, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, - 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x33, 0x0a, - 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, - 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, - 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x6f, - 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x57, 0x0a, 0x05, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, - 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, - 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x4d, 0x73, 0x22, 0xd3, 0x02, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, - 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x48, 0x02, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x08, 0x0a, 0x06, + 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x9d, 0x04, 0x0a, 0x0c, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, + 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x09, + 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, + 0x4b, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, - 0x4f, 0x70, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x53, 0x0a, - 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, + 0x52, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, + 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x65, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x0c, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x05, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x3c, + 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, 0x0a, 0x06, + 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, + 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x57, 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x08, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, + 0xf4, 0x03, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, + 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x48, + 0x0a, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, - 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, - 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, - 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x6f, 0x61, - 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, - 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, - 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, - 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, - 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x11, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, - 0x42, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x08, + 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x50, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x22, 0xe4, 0x03, 0x0a, 0x14, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x0c, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x52, 0x0a, 0x09, 0x74, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, + 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, 0x0a, 0x06, + 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, + 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0xd3, 0x02, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, + 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x4d, 0x73, 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, - 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, - 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x10, 0x07, 0x22, 0x40, 0x0a, 0x16, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x17, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x27, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x44, 0x45, 0x4c, - 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, - 0x32, 0xd9, 0x0e, 0x0a, 0x09, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x6b, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x2b, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x4a, + 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, + 0x12, 0x53, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, + 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, + 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x22, 0x16, 0x0a, 0x14, + 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x18, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, + 0x01, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xe4, 0x03, 0x0a, 0x14, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, + 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, + 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x10, 0x07, 0x22, 0x40, 0x0a, + 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x49, 0x0a, 0x17, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x27, 0x0a, 0x0c, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, + 0x44, 0x45, 0x4c, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, + 0x45, 0x10, 0x01, 0x32, 0xd9, 0x0e, 0x0a, 0x09, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, + 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, + 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x09, 0x4c, - 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x68, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, - 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, - 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, - 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, + 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, - 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, - 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0f, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x6a, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x73, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7c, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x6a, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x73, 0x0a, - 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x88, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x17, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, - 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x74, 0x0a, - 0x0f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x7c, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x88, 0x01, 0x0a, - 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x73, 0x65, 0x6c, - 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x3c, 0x5a, 0x3a, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, + 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4224,157 +4388,164 @@ func file_mlops_scheduler_scheduler_proto_rawDescGZIP() []byte { return file_mlops_scheduler_scheduler_proto_rawDescData } -var file_mlops_scheduler_scheduler_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_mlops_scheduler_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 55) +var file_mlops_scheduler_scheduler_proto_enumTypes = make([]protoimpl.EnumInfo, 7) +var file_mlops_scheduler_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 57) var file_mlops_scheduler_scheduler_proto_goTypes = []interface{}{ (ResourceType)(0), // 0: seldon.mlops.scheduler.ResourceType (ModelStatus_ModelState)(0), // 1: seldon.mlops.scheduler.ModelStatus.ModelState (ModelReplicaStatus_ModelReplicaState)(0), // 2: seldon.mlops.scheduler.ModelReplicaStatus.ModelReplicaState (PipelineStep_JoinOp)(0), // 3: seldon.mlops.scheduler.PipelineStep.JoinOp - (PipelineOutput_JoinOp)(0), // 4: seldon.mlops.scheduler.PipelineOutput.JoinOp - (PipelineVersionState_PipelineStatus)(0), // 5: seldon.mlops.scheduler.PipelineVersionState.PipelineStatus - (*LoadModelRequest)(nil), // 6: seldon.mlops.scheduler.LoadModelRequest - (*Model)(nil), // 7: seldon.mlops.scheduler.Model - (*MetaData)(nil), // 8: seldon.mlops.scheduler.MetaData - (*DeploymentSpec)(nil), // 9: seldon.mlops.scheduler.DeploymentSpec - (*ModelSpec)(nil), // 10: seldon.mlops.scheduler.ModelSpec - (*ParameterSpec)(nil), // 11: seldon.mlops.scheduler.ParameterSpec - (*ExplainerSpec)(nil), // 12: seldon.mlops.scheduler.ExplainerSpec - (*KubernetesMeta)(nil), // 13: seldon.mlops.scheduler.KubernetesMeta - (*StreamSpec)(nil), // 14: seldon.mlops.scheduler.StreamSpec - (*StorageConfig)(nil), // 15: seldon.mlops.scheduler.StorageConfig - (*LoadModelResponse)(nil), // 16: seldon.mlops.scheduler.LoadModelResponse - (*ModelReference)(nil), // 17: seldon.mlops.scheduler.ModelReference - (*UnloadModelRequest)(nil), // 18: seldon.mlops.scheduler.UnloadModelRequest - (*UnloadModelResponse)(nil), // 19: seldon.mlops.scheduler.UnloadModelResponse - (*ModelStatusResponse)(nil), // 20: seldon.mlops.scheduler.ModelStatusResponse - (*ModelVersionStatus)(nil), // 21: seldon.mlops.scheduler.ModelVersionStatus - (*ModelStatus)(nil), // 22: seldon.mlops.scheduler.ModelStatus - (*ModelReplicaStatus)(nil), // 23: seldon.mlops.scheduler.ModelReplicaStatus - (*ServerStatusRequest)(nil), // 24: seldon.mlops.scheduler.ServerStatusRequest - (*ServerStatusResponse)(nil), // 25: seldon.mlops.scheduler.ServerStatusResponse - (*ServerReplicaResources)(nil), // 26: seldon.mlops.scheduler.ServerReplicaResources - (*ModelSubscriptionRequest)(nil), // 27: seldon.mlops.scheduler.ModelSubscriptionRequest - (*ModelStatusRequest)(nil), // 28: seldon.mlops.scheduler.ModelStatusRequest - (*ServerNotifyRequest)(nil), // 29: seldon.mlops.scheduler.ServerNotifyRequest - (*ServerNotifyResponse)(nil), // 30: seldon.mlops.scheduler.ServerNotifyResponse - (*ServerSubscriptionRequest)(nil), // 31: seldon.mlops.scheduler.ServerSubscriptionRequest - (*StartExperimentRequest)(nil), // 32: seldon.mlops.scheduler.StartExperimentRequest - (*Experiment)(nil), // 33: seldon.mlops.scheduler.Experiment - (*ExperimentConfig)(nil), // 34: seldon.mlops.scheduler.ExperimentConfig - (*ExperimentCandidate)(nil), // 35: seldon.mlops.scheduler.ExperimentCandidate - (*ExperimentMirror)(nil), // 36: seldon.mlops.scheduler.ExperimentMirror - (*StartExperimentResponse)(nil), // 37: seldon.mlops.scheduler.StartExperimentResponse - (*StopExperimentRequest)(nil), // 38: seldon.mlops.scheduler.StopExperimentRequest - (*StopExperimentResponse)(nil), // 39: seldon.mlops.scheduler.StopExperimentResponse - (*ExperimentSubscriptionRequest)(nil), // 40: seldon.mlops.scheduler.ExperimentSubscriptionRequest - (*ExperimentStatusResponse)(nil), // 41: seldon.mlops.scheduler.ExperimentStatusResponse - (*LoadPipelineRequest)(nil), // 42: seldon.mlops.scheduler.LoadPipelineRequest - (*ExperimentStatusRequest)(nil), // 43: seldon.mlops.scheduler.ExperimentStatusRequest - (*Pipeline)(nil), // 44: seldon.mlops.scheduler.Pipeline - (*PipelineStep)(nil), // 45: seldon.mlops.scheduler.PipelineStep - (*Batch)(nil), // 46: seldon.mlops.scheduler.Batch - (*PipelineOutput)(nil), // 47: seldon.mlops.scheduler.PipelineOutput - (*LoadPipelineResponse)(nil), // 48: seldon.mlops.scheduler.LoadPipelineResponse - (*UnloadPipelineRequest)(nil), // 49: seldon.mlops.scheduler.UnloadPipelineRequest - (*UnloadPipelineResponse)(nil), // 50: seldon.mlops.scheduler.UnloadPipelineResponse - (*PipelineStatusRequest)(nil), // 51: seldon.mlops.scheduler.PipelineStatusRequest - (*PipelineSubscriptionRequest)(nil), // 52: seldon.mlops.scheduler.PipelineSubscriptionRequest - (*PipelineStatusResponse)(nil), // 53: seldon.mlops.scheduler.PipelineStatusResponse - (*PipelineWithState)(nil), // 54: seldon.mlops.scheduler.PipelineWithState - (*PipelineVersionState)(nil), // 55: seldon.mlops.scheduler.PipelineVersionState - (*SchedulerStatusRequest)(nil), // 56: seldon.mlops.scheduler.SchedulerStatusRequest - (*SchedulerStatusResponse)(nil), // 57: seldon.mlops.scheduler.SchedulerStatusResponse - nil, // 58: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry - nil, // 59: seldon.mlops.scheduler.PipelineStep.TensorMapEntry - nil, // 60: seldon.mlops.scheduler.PipelineOutput.TensorMapEntry - (*timestamppb.Timestamp)(nil), // 61: google.protobuf.Timestamp + (PipelineInput_JoinOp)(0), // 4: seldon.mlops.scheduler.PipelineInput.JoinOp + (PipelineOutput_JoinOp)(0), // 5: seldon.mlops.scheduler.PipelineOutput.JoinOp + (PipelineVersionState_PipelineStatus)(0), // 6: seldon.mlops.scheduler.PipelineVersionState.PipelineStatus + (*LoadModelRequest)(nil), // 7: seldon.mlops.scheduler.LoadModelRequest + (*Model)(nil), // 8: seldon.mlops.scheduler.Model + (*MetaData)(nil), // 9: seldon.mlops.scheduler.MetaData + (*DeploymentSpec)(nil), // 10: seldon.mlops.scheduler.DeploymentSpec + (*ModelSpec)(nil), // 11: seldon.mlops.scheduler.ModelSpec + (*ParameterSpec)(nil), // 12: seldon.mlops.scheduler.ParameterSpec + (*ExplainerSpec)(nil), // 13: seldon.mlops.scheduler.ExplainerSpec + (*KubernetesMeta)(nil), // 14: seldon.mlops.scheduler.KubernetesMeta + (*StreamSpec)(nil), // 15: seldon.mlops.scheduler.StreamSpec + (*StorageConfig)(nil), // 16: seldon.mlops.scheduler.StorageConfig + (*LoadModelResponse)(nil), // 17: seldon.mlops.scheduler.LoadModelResponse + (*ModelReference)(nil), // 18: seldon.mlops.scheduler.ModelReference + (*UnloadModelRequest)(nil), // 19: seldon.mlops.scheduler.UnloadModelRequest + (*UnloadModelResponse)(nil), // 20: seldon.mlops.scheduler.UnloadModelResponse + (*ModelStatusResponse)(nil), // 21: seldon.mlops.scheduler.ModelStatusResponse + (*ModelVersionStatus)(nil), // 22: seldon.mlops.scheduler.ModelVersionStatus + (*ModelStatus)(nil), // 23: seldon.mlops.scheduler.ModelStatus + (*ModelReplicaStatus)(nil), // 24: seldon.mlops.scheduler.ModelReplicaStatus + (*ServerStatusRequest)(nil), // 25: seldon.mlops.scheduler.ServerStatusRequest + (*ServerStatusResponse)(nil), // 26: seldon.mlops.scheduler.ServerStatusResponse + (*ServerReplicaResources)(nil), // 27: seldon.mlops.scheduler.ServerReplicaResources + (*ModelSubscriptionRequest)(nil), // 28: seldon.mlops.scheduler.ModelSubscriptionRequest + (*ModelStatusRequest)(nil), // 29: seldon.mlops.scheduler.ModelStatusRequest + (*ServerNotifyRequest)(nil), // 30: seldon.mlops.scheduler.ServerNotifyRequest + (*ServerNotifyResponse)(nil), // 31: seldon.mlops.scheduler.ServerNotifyResponse + (*ServerSubscriptionRequest)(nil), // 32: seldon.mlops.scheduler.ServerSubscriptionRequest + (*StartExperimentRequest)(nil), // 33: seldon.mlops.scheduler.StartExperimentRequest + (*Experiment)(nil), // 34: seldon.mlops.scheduler.Experiment + (*ExperimentConfig)(nil), // 35: seldon.mlops.scheduler.ExperimentConfig + (*ExperimentCandidate)(nil), // 36: seldon.mlops.scheduler.ExperimentCandidate + (*ExperimentMirror)(nil), // 37: seldon.mlops.scheduler.ExperimentMirror + (*StartExperimentResponse)(nil), // 38: seldon.mlops.scheduler.StartExperimentResponse + (*StopExperimentRequest)(nil), // 39: seldon.mlops.scheduler.StopExperimentRequest + (*StopExperimentResponse)(nil), // 40: seldon.mlops.scheduler.StopExperimentResponse + (*ExperimentSubscriptionRequest)(nil), // 41: seldon.mlops.scheduler.ExperimentSubscriptionRequest + (*ExperimentStatusResponse)(nil), // 42: seldon.mlops.scheduler.ExperimentStatusResponse + (*LoadPipelineRequest)(nil), // 43: seldon.mlops.scheduler.LoadPipelineRequest + (*ExperimentStatusRequest)(nil), // 44: seldon.mlops.scheduler.ExperimentStatusRequest + (*Pipeline)(nil), // 45: seldon.mlops.scheduler.Pipeline + (*PipelineStep)(nil), // 46: seldon.mlops.scheduler.PipelineStep + (*Batch)(nil), // 47: seldon.mlops.scheduler.Batch + (*PipelineInput)(nil), // 48: seldon.mlops.scheduler.PipelineInput + (*PipelineOutput)(nil), // 49: seldon.mlops.scheduler.PipelineOutput + (*LoadPipelineResponse)(nil), // 50: seldon.mlops.scheduler.LoadPipelineResponse + (*UnloadPipelineRequest)(nil), // 51: seldon.mlops.scheduler.UnloadPipelineRequest + (*UnloadPipelineResponse)(nil), // 52: seldon.mlops.scheduler.UnloadPipelineResponse + (*PipelineStatusRequest)(nil), // 53: seldon.mlops.scheduler.PipelineStatusRequest + (*PipelineSubscriptionRequest)(nil), // 54: seldon.mlops.scheduler.PipelineSubscriptionRequest + (*PipelineStatusResponse)(nil), // 55: seldon.mlops.scheduler.PipelineStatusResponse + (*PipelineWithState)(nil), // 56: seldon.mlops.scheduler.PipelineWithState + (*PipelineVersionState)(nil), // 57: seldon.mlops.scheduler.PipelineVersionState + (*SchedulerStatusRequest)(nil), // 58: seldon.mlops.scheduler.SchedulerStatusRequest + (*SchedulerStatusResponse)(nil), // 59: seldon.mlops.scheduler.SchedulerStatusResponse + nil, // 60: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry + nil, // 61: seldon.mlops.scheduler.PipelineStep.TensorMapEntry + nil, // 62: seldon.mlops.scheduler.PipelineInput.TensorMapEntry + nil, // 63: seldon.mlops.scheduler.PipelineOutput.TensorMapEntry + (*timestamppb.Timestamp)(nil), // 64: google.protobuf.Timestamp } var file_mlops_scheduler_scheduler_proto_depIdxs = []int32{ - 7, // 0: seldon.mlops.scheduler.LoadModelRequest.model:type_name -> seldon.mlops.scheduler.Model - 8, // 1: seldon.mlops.scheduler.Model.meta:type_name -> seldon.mlops.scheduler.MetaData - 10, // 2: seldon.mlops.scheduler.Model.modelSpec:type_name -> seldon.mlops.scheduler.ModelSpec - 9, // 3: seldon.mlops.scheduler.Model.deploymentSpec:type_name -> seldon.mlops.scheduler.DeploymentSpec - 14, // 4: seldon.mlops.scheduler.Model.streamSpec:type_name -> seldon.mlops.scheduler.StreamSpec - 13, // 5: seldon.mlops.scheduler.MetaData.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 15, // 6: seldon.mlops.scheduler.ModelSpec.storageConfig:type_name -> seldon.mlops.scheduler.StorageConfig - 12, // 7: seldon.mlops.scheduler.ModelSpec.explainer:type_name -> seldon.mlops.scheduler.ExplainerSpec - 11, // 8: seldon.mlops.scheduler.ModelSpec.parameters:type_name -> seldon.mlops.scheduler.ParameterSpec - 17, // 9: seldon.mlops.scheduler.UnloadModelRequest.model:type_name -> seldon.mlops.scheduler.ModelReference - 13, // 10: seldon.mlops.scheduler.UnloadModelRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 21, // 11: seldon.mlops.scheduler.ModelStatusResponse.versions:type_name -> seldon.mlops.scheduler.ModelVersionStatus - 13, // 12: seldon.mlops.scheduler.ModelVersionStatus.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 58, // 13: seldon.mlops.scheduler.ModelVersionStatus.modelReplicaState:type_name -> seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry - 22, // 14: seldon.mlops.scheduler.ModelVersionStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus - 7, // 15: seldon.mlops.scheduler.ModelVersionStatus.modelDefn:type_name -> seldon.mlops.scheduler.Model + 8, // 0: seldon.mlops.scheduler.LoadModelRequest.model:type_name -> seldon.mlops.scheduler.Model + 9, // 1: seldon.mlops.scheduler.Model.meta:type_name -> seldon.mlops.scheduler.MetaData + 11, // 2: seldon.mlops.scheduler.Model.modelSpec:type_name -> seldon.mlops.scheduler.ModelSpec + 10, // 3: seldon.mlops.scheduler.Model.deploymentSpec:type_name -> seldon.mlops.scheduler.DeploymentSpec + 15, // 4: seldon.mlops.scheduler.Model.streamSpec:type_name -> seldon.mlops.scheduler.StreamSpec + 14, // 5: seldon.mlops.scheduler.MetaData.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 16, // 6: seldon.mlops.scheduler.ModelSpec.storageConfig:type_name -> seldon.mlops.scheduler.StorageConfig + 13, // 7: seldon.mlops.scheduler.ModelSpec.explainer:type_name -> seldon.mlops.scheduler.ExplainerSpec + 12, // 8: seldon.mlops.scheduler.ModelSpec.parameters:type_name -> seldon.mlops.scheduler.ParameterSpec + 18, // 9: seldon.mlops.scheduler.UnloadModelRequest.model:type_name -> seldon.mlops.scheduler.ModelReference + 14, // 10: seldon.mlops.scheduler.UnloadModelRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 22, // 11: seldon.mlops.scheduler.ModelStatusResponse.versions:type_name -> seldon.mlops.scheduler.ModelVersionStatus + 14, // 12: seldon.mlops.scheduler.ModelVersionStatus.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 60, // 13: seldon.mlops.scheduler.ModelVersionStatus.modelReplicaState:type_name -> seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry + 23, // 14: seldon.mlops.scheduler.ModelVersionStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus + 8, // 15: seldon.mlops.scheduler.ModelVersionStatus.modelDefn:type_name -> seldon.mlops.scheduler.Model 1, // 16: seldon.mlops.scheduler.ModelStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus.ModelState - 61, // 17: seldon.mlops.scheduler.ModelStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 64, // 17: seldon.mlops.scheduler.ModelStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp 2, // 18: seldon.mlops.scheduler.ModelReplicaStatus.state:type_name -> seldon.mlops.scheduler.ModelReplicaStatus.ModelReplicaState - 61, // 19: seldon.mlops.scheduler.ModelReplicaStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp - 26, // 20: seldon.mlops.scheduler.ServerStatusResponse.resources:type_name -> seldon.mlops.scheduler.ServerReplicaResources - 13, // 21: seldon.mlops.scheduler.ServerStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 17, // 22: seldon.mlops.scheduler.ModelStatusRequest.model:type_name -> seldon.mlops.scheduler.ModelReference - 13, // 23: seldon.mlops.scheduler.ServerNotifyRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 33, // 24: seldon.mlops.scheduler.StartExperimentRequest.experiment:type_name -> seldon.mlops.scheduler.Experiment - 35, // 25: seldon.mlops.scheduler.Experiment.candidates:type_name -> seldon.mlops.scheduler.ExperimentCandidate - 36, // 26: seldon.mlops.scheduler.Experiment.mirror:type_name -> seldon.mlops.scheduler.ExperimentMirror - 34, // 27: seldon.mlops.scheduler.Experiment.config:type_name -> seldon.mlops.scheduler.ExperimentConfig - 13, // 28: seldon.mlops.scheduler.Experiment.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 64, // 19: seldon.mlops.scheduler.ModelReplicaStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 27, // 20: seldon.mlops.scheduler.ServerStatusResponse.resources:type_name -> seldon.mlops.scheduler.ServerReplicaResources + 14, // 21: seldon.mlops.scheduler.ServerStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 18, // 22: seldon.mlops.scheduler.ModelStatusRequest.model:type_name -> seldon.mlops.scheduler.ModelReference + 14, // 23: seldon.mlops.scheduler.ServerNotifyRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 34, // 24: seldon.mlops.scheduler.StartExperimentRequest.experiment:type_name -> seldon.mlops.scheduler.Experiment + 36, // 25: seldon.mlops.scheduler.Experiment.candidates:type_name -> seldon.mlops.scheduler.ExperimentCandidate + 37, // 26: seldon.mlops.scheduler.Experiment.mirror:type_name -> seldon.mlops.scheduler.ExperimentMirror + 35, // 27: seldon.mlops.scheduler.Experiment.config:type_name -> seldon.mlops.scheduler.ExperimentConfig + 14, // 28: seldon.mlops.scheduler.Experiment.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta 0, // 29: seldon.mlops.scheduler.Experiment.resourceType:type_name -> seldon.mlops.scheduler.ResourceType - 13, // 30: seldon.mlops.scheduler.ExperimentStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 44, // 31: seldon.mlops.scheduler.LoadPipelineRequest.pipeline:type_name -> seldon.mlops.scheduler.Pipeline - 45, // 32: seldon.mlops.scheduler.Pipeline.steps:type_name -> seldon.mlops.scheduler.PipelineStep - 47, // 33: seldon.mlops.scheduler.Pipeline.output:type_name -> seldon.mlops.scheduler.PipelineOutput - 13, // 34: seldon.mlops.scheduler.Pipeline.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 59, // 35: seldon.mlops.scheduler.PipelineStep.tensorMap:type_name -> seldon.mlops.scheduler.PipelineStep.TensorMapEntry - 3, // 36: seldon.mlops.scheduler.PipelineStep.inputsJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp - 3, // 37: seldon.mlops.scheduler.PipelineStep.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp - 46, // 38: seldon.mlops.scheduler.PipelineStep.batch:type_name -> seldon.mlops.scheduler.Batch - 4, // 39: seldon.mlops.scheduler.PipelineOutput.stepsJoin:type_name -> seldon.mlops.scheduler.PipelineOutput.JoinOp - 60, // 40: seldon.mlops.scheduler.PipelineOutput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineOutput.TensorMapEntry - 54, // 41: seldon.mlops.scheduler.PipelineStatusResponse.versions:type_name -> seldon.mlops.scheduler.PipelineWithState - 44, // 42: seldon.mlops.scheduler.PipelineWithState.pipeline:type_name -> seldon.mlops.scheduler.Pipeline - 55, // 43: seldon.mlops.scheduler.PipelineWithState.state:type_name -> seldon.mlops.scheduler.PipelineVersionState - 5, // 44: seldon.mlops.scheduler.PipelineVersionState.status:type_name -> seldon.mlops.scheduler.PipelineVersionState.PipelineStatus - 61, // 45: seldon.mlops.scheduler.PipelineVersionState.lastChangeTimestamp:type_name -> google.protobuf.Timestamp - 23, // 46: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry.value:type_name -> seldon.mlops.scheduler.ModelReplicaStatus - 29, // 47: seldon.mlops.scheduler.Scheduler.ServerNotify:input_type -> seldon.mlops.scheduler.ServerNotifyRequest - 6, // 48: seldon.mlops.scheduler.Scheduler.LoadModel:input_type -> seldon.mlops.scheduler.LoadModelRequest - 18, // 49: seldon.mlops.scheduler.Scheduler.UnloadModel:input_type -> seldon.mlops.scheduler.UnloadModelRequest - 42, // 50: seldon.mlops.scheduler.Scheduler.LoadPipeline:input_type -> seldon.mlops.scheduler.LoadPipelineRequest - 49, // 51: seldon.mlops.scheduler.Scheduler.UnloadPipeline:input_type -> seldon.mlops.scheduler.UnloadPipelineRequest - 32, // 52: seldon.mlops.scheduler.Scheduler.StartExperiment:input_type -> seldon.mlops.scheduler.StartExperimentRequest - 38, // 53: seldon.mlops.scheduler.Scheduler.StopExperiment:input_type -> seldon.mlops.scheduler.StopExperimentRequest - 24, // 54: seldon.mlops.scheduler.Scheduler.ServerStatus:input_type -> seldon.mlops.scheduler.ServerStatusRequest - 28, // 55: seldon.mlops.scheduler.Scheduler.ModelStatus:input_type -> seldon.mlops.scheduler.ModelStatusRequest - 51, // 56: seldon.mlops.scheduler.Scheduler.PipelineStatus:input_type -> seldon.mlops.scheduler.PipelineStatusRequest - 43, // 57: seldon.mlops.scheduler.Scheduler.ExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentStatusRequest - 56, // 58: seldon.mlops.scheduler.Scheduler.SchedulerStatus:input_type -> seldon.mlops.scheduler.SchedulerStatusRequest - 31, // 59: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:input_type -> seldon.mlops.scheduler.ServerSubscriptionRequest - 27, // 60: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:input_type -> seldon.mlops.scheduler.ModelSubscriptionRequest - 40, // 61: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentSubscriptionRequest - 52, // 62: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:input_type -> seldon.mlops.scheduler.PipelineSubscriptionRequest - 30, // 63: seldon.mlops.scheduler.Scheduler.ServerNotify:output_type -> seldon.mlops.scheduler.ServerNotifyResponse - 16, // 64: seldon.mlops.scheduler.Scheduler.LoadModel:output_type -> seldon.mlops.scheduler.LoadModelResponse - 19, // 65: seldon.mlops.scheduler.Scheduler.UnloadModel:output_type -> seldon.mlops.scheduler.UnloadModelResponse - 48, // 66: seldon.mlops.scheduler.Scheduler.LoadPipeline:output_type -> seldon.mlops.scheduler.LoadPipelineResponse - 50, // 67: seldon.mlops.scheduler.Scheduler.UnloadPipeline:output_type -> seldon.mlops.scheduler.UnloadPipelineResponse - 37, // 68: seldon.mlops.scheduler.Scheduler.StartExperiment:output_type -> seldon.mlops.scheduler.StartExperimentResponse - 39, // 69: seldon.mlops.scheduler.Scheduler.StopExperiment:output_type -> seldon.mlops.scheduler.StopExperimentResponse - 25, // 70: seldon.mlops.scheduler.Scheduler.ServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse - 20, // 71: seldon.mlops.scheduler.Scheduler.ModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse - 53, // 72: seldon.mlops.scheduler.Scheduler.PipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse - 41, // 73: seldon.mlops.scheduler.Scheduler.ExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse - 57, // 74: seldon.mlops.scheduler.Scheduler.SchedulerStatus:output_type -> seldon.mlops.scheduler.SchedulerStatusResponse - 25, // 75: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse - 20, // 76: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse - 41, // 77: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse - 53, // 78: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse - 63, // [63:79] is the sub-list for method output_type - 47, // [47:63] is the sub-list for method input_type - 47, // [47:47] is the sub-list for extension type_name - 47, // [47:47] is the sub-list for extension extendee - 0, // [0:47] is the sub-list for field type_name + 14, // 30: seldon.mlops.scheduler.ExperimentStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 45, // 31: seldon.mlops.scheduler.LoadPipelineRequest.pipeline:type_name -> seldon.mlops.scheduler.Pipeline + 46, // 32: seldon.mlops.scheduler.Pipeline.steps:type_name -> seldon.mlops.scheduler.PipelineStep + 49, // 33: seldon.mlops.scheduler.Pipeline.output:type_name -> seldon.mlops.scheduler.PipelineOutput + 14, // 34: seldon.mlops.scheduler.Pipeline.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 48, // 35: seldon.mlops.scheduler.Pipeline.input:type_name -> seldon.mlops.scheduler.PipelineInput + 61, // 36: seldon.mlops.scheduler.PipelineStep.tensorMap:type_name -> seldon.mlops.scheduler.PipelineStep.TensorMapEntry + 3, // 37: seldon.mlops.scheduler.PipelineStep.inputsJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp + 3, // 38: seldon.mlops.scheduler.PipelineStep.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp + 47, // 39: seldon.mlops.scheduler.PipelineStep.batch:type_name -> seldon.mlops.scheduler.Batch + 4, // 40: seldon.mlops.scheduler.PipelineInput.joinType:type_name -> seldon.mlops.scheduler.PipelineInput.JoinOp + 4, // 41: seldon.mlops.scheduler.PipelineInput.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineInput.JoinOp + 62, // 42: seldon.mlops.scheduler.PipelineInput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineInput.TensorMapEntry + 5, // 43: seldon.mlops.scheduler.PipelineOutput.stepsJoin:type_name -> seldon.mlops.scheduler.PipelineOutput.JoinOp + 63, // 44: seldon.mlops.scheduler.PipelineOutput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineOutput.TensorMapEntry + 56, // 45: seldon.mlops.scheduler.PipelineStatusResponse.versions:type_name -> seldon.mlops.scheduler.PipelineWithState + 45, // 46: seldon.mlops.scheduler.PipelineWithState.pipeline:type_name -> seldon.mlops.scheduler.Pipeline + 57, // 47: seldon.mlops.scheduler.PipelineWithState.state:type_name -> seldon.mlops.scheduler.PipelineVersionState + 6, // 48: seldon.mlops.scheduler.PipelineVersionState.status:type_name -> seldon.mlops.scheduler.PipelineVersionState.PipelineStatus + 64, // 49: seldon.mlops.scheduler.PipelineVersionState.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 24, // 50: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry.value:type_name -> seldon.mlops.scheduler.ModelReplicaStatus + 30, // 51: seldon.mlops.scheduler.Scheduler.ServerNotify:input_type -> seldon.mlops.scheduler.ServerNotifyRequest + 7, // 52: seldon.mlops.scheduler.Scheduler.LoadModel:input_type -> seldon.mlops.scheduler.LoadModelRequest + 19, // 53: seldon.mlops.scheduler.Scheduler.UnloadModel:input_type -> seldon.mlops.scheduler.UnloadModelRequest + 43, // 54: seldon.mlops.scheduler.Scheduler.LoadPipeline:input_type -> seldon.mlops.scheduler.LoadPipelineRequest + 51, // 55: seldon.mlops.scheduler.Scheduler.UnloadPipeline:input_type -> seldon.mlops.scheduler.UnloadPipelineRequest + 33, // 56: seldon.mlops.scheduler.Scheduler.StartExperiment:input_type -> seldon.mlops.scheduler.StartExperimentRequest + 39, // 57: seldon.mlops.scheduler.Scheduler.StopExperiment:input_type -> seldon.mlops.scheduler.StopExperimentRequest + 25, // 58: seldon.mlops.scheduler.Scheduler.ServerStatus:input_type -> seldon.mlops.scheduler.ServerStatusRequest + 29, // 59: seldon.mlops.scheduler.Scheduler.ModelStatus:input_type -> seldon.mlops.scheduler.ModelStatusRequest + 53, // 60: seldon.mlops.scheduler.Scheduler.PipelineStatus:input_type -> seldon.mlops.scheduler.PipelineStatusRequest + 44, // 61: seldon.mlops.scheduler.Scheduler.ExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentStatusRequest + 58, // 62: seldon.mlops.scheduler.Scheduler.SchedulerStatus:input_type -> seldon.mlops.scheduler.SchedulerStatusRequest + 32, // 63: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:input_type -> seldon.mlops.scheduler.ServerSubscriptionRequest + 28, // 64: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:input_type -> seldon.mlops.scheduler.ModelSubscriptionRequest + 41, // 65: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentSubscriptionRequest + 54, // 66: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:input_type -> seldon.mlops.scheduler.PipelineSubscriptionRequest + 31, // 67: seldon.mlops.scheduler.Scheduler.ServerNotify:output_type -> seldon.mlops.scheduler.ServerNotifyResponse + 17, // 68: seldon.mlops.scheduler.Scheduler.LoadModel:output_type -> seldon.mlops.scheduler.LoadModelResponse + 20, // 69: seldon.mlops.scheduler.Scheduler.UnloadModel:output_type -> seldon.mlops.scheduler.UnloadModelResponse + 50, // 70: seldon.mlops.scheduler.Scheduler.LoadPipeline:output_type -> seldon.mlops.scheduler.LoadPipelineResponse + 52, // 71: seldon.mlops.scheduler.Scheduler.UnloadPipeline:output_type -> seldon.mlops.scheduler.UnloadPipelineResponse + 38, // 72: seldon.mlops.scheduler.Scheduler.StartExperiment:output_type -> seldon.mlops.scheduler.StartExperimentResponse + 40, // 73: seldon.mlops.scheduler.Scheduler.StopExperiment:output_type -> seldon.mlops.scheduler.StopExperimentResponse + 26, // 74: seldon.mlops.scheduler.Scheduler.ServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse + 21, // 75: seldon.mlops.scheduler.Scheduler.ModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse + 55, // 76: seldon.mlops.scheduler.Scheduler.PipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse + 42, // 77: seldon.mlops.scheduler.Scheduler.ExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse + 59, // 78: seldon.mlops.scheduler.Scheduler.SchedulerStatus:output_type -> seldon.mlops.scheduler.SchedulerStatusResponse + 26, // 79: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse + 21, // 80: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse + 42, // 81: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse + 55, // 82: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse + 67, // [67:83] is the sub-list for method output_type + 51, // [51:67] is the sub-list for method input_type + 51, // [51:51] is the sub-list for extension type_name + 51, // [51:51] is the sub-list for extension extendee + 0, // [0:51] is the sub-list for field type_name } func init() { file_mlops_scheduler_scheduler_proto_init() } @@ -4876,7 +5047,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineOutput); i { + switch v := v.(*PipelineInput); i { case 0: return &v.state case 1: @@ -4888,7 +5059,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadPipelineResponse); i { + switch v := v.(*PipelineOutput); i { case 0: return &v.state case 1: @@ -4900,7 +5071,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadPipelineRequest); i { + switch v := v.(*LoadPipelineResponse); i { case 0: return &v.state case 1: @@ -4912,7 +5083,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadPipelineResponse); i { + switch v := v.(*UnloadPipelineRequest); i { case 0: return &v.state case 1: @@ -4924,7 +5095,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineStatusRequest); i { + switch v := v.(*UnloadPipelineResponse); i { case 0: return &v.state case 1: @@ -4936,7 +5107,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineSubscriptionRequest); i { + switch v := v.(*PipelineStatusRequest); i { case 0: return &v.state case 1: @@ -4948,7 +5119,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineStatusResponse); i { + switch v := v.(*PipelineSubscriptionRequest); i { case 0: return &v.state case 1: @@ -4960,7 +5131,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineWithState); i { + switch v := v.(*PipelineStatusResponse); i { case 0: return &v.state case 1: @@ -4972,7 +5143,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineVersionState); i { + switch v := v.(*PipelineWithState); i { case 0: return &v.state case 1: @@ -4984,7 +5155,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SchedulerStatusRequest); i { + switch v := v.(*PipelineVersionState); i { case 0: return &v.state case 1: @@ -4996,6 +5167,18 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mlops_scheduler_scheduler_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SchedulerStatusResponse); i { case 0: return &v.state @@ -5028,14 +5211,15 @@ func file_mlops_scheduler_scheduler_proto_init() { file_mlops_scheduler_scheduler_proto_msgTypes[38].OneofWrappers = []interface{}{} file_mlops_scheduler_scheduler_proto_msgTypes[39].OneofWrappers = []interface{}{} file_mlops_scheduler_scheduler_proto_msgTypes[40].OneofWrappers = []interface{}{} - file_mlops_scheduler_scheduler_proto_msgTypes[45].OneofWrappers = []interface{}{} + file_mlops_scheduler_scheduler_proto_msgTypes[41].OneofWrappers = []interface{}{} + file_mlops_scheduler_scheduler_proto_msgTypes[46].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mlops_scheduler_scheduler_proto_rawDesc, - NumEnums: 6, - NumMessages: 55, + NumEnums: 7, + NumMessages: 57, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/go/mlops/scheduler/scheduler_grpc.pb.go b/apis/go/mlops/scheduler/scheduler_grpc.pb.go index 757dd82a05..1541bdf442 100644 --- a/apis/go/mlops/scheduler/scheduler_grpc.pb.go +++ b/apis/go/mlops/scheduler/scheduler_grpc.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 diff --git a/apis/go/mlops/scheduler/storage.pb.go b/apis/go/mlops/scheduler/storage.pb.go index 5965f6f19c..b453f9cfb8 100644 --- a/apis/go/mlops/scheduler/storage.pb.go +++ b/apis/go/mlops/scheduler/storage.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 diff --git a/apis/go/mlops/v2_dataplane/v2_dataplane_grpc.pb.go b/apis/go/mlops/v2_dataplane/v2_dataplane_grpc.pb.go index 4e31d889f5..80f7ee7457 100644 --- a/apis/go/mlops/v2_dataplane/v2_dataplane_grpc.pb.go +++ b/apis/go/mlops/v2_dataplane/v2_dataplane_grpc.pb.go @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 diff --git a/apis/mlops/chainer/chainer.proto b/apis/mlops/chainer/chainer.proto index 977c90a4ff..5f9c62442d 100644 --- a/apis/mlops/chainer/chainer.proto +++ b/apis/mlops/chainer/chainer.proto @@ -32,17 +32,28 @@ message PipelineStepUpdate { // https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit // Pipeline Resource example, e.g. transform.outputs.traffic // seldon.... - repeated string sources = 1; - repeated string triggers = 2; - string sink = 3; + repeated PipelineTopic sources = 1; + repeated PipelineTopic triggers = 2; + PipelineTopic sink = 3; PipelineJoinType inputJoinTy = 4; PipelineJoinType triggersJoinTy = 5; bool passEmptyResponses = 6; // Forward empty response to following steps, default false optional uint32 joinWindowMs = 7; // Join window millisecs, some nozero default (TBD) - map tensorMap = 8; // optional map of tensor name mappings + repeated PipelineTensorMapping tensorMap = 8; // optional list of tensor name mappings Batch batch = 9; // Batch settings } +message PipelineTensorMapping { + string pipelineName = 1; + string topicAndTensor = 2; + string tensorName = 3; +} + +message PipelineTopic { + string pipelineName = 1; + string topicName = 2; +} + message Batch { optional uint32 size = 1; optional uint32 windowMs = 2; diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt index dd17ff027f..459db9bb81 100644 --- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - //Generated by the protocol buffer compiler. DO NOT EDIT! // source: chainer.proto diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java index ff7faf578e..b84a9ee87c 100644 --- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java @@ -1955,10 +1955,9 @@ public interface PipelineStepUpdateOrBuilder extends * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @return A list containing the sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - java.util.List + java.util.List getSourcesList(); /** *
@@ -1967,8 +1966,17 @@ public interface PipelineStepUpdateOrBuilder extends
      *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
      * 
* - * repeated string sources = 1; - * @return The count of sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; + */ + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getSources(int index); + /** + *
+     * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+     * Pipeline Resource example, e.g. transform.outputs.traffic
+     *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+     * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ int getSourcesCount(); /** @@ -1978,11 +1986,10 @@ public interface PipelineStepUpdateOrBuilder extends * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @param index The index of the element to return. - * @return The sources at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - java.lang.String getSources(int index); + java.util.List + getSourcesOrBuilderList(); /** *
      * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
@@ -1990,49 +1997,49 @@ public interface PipelineStepUpdateOrBuilder extends
      *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
      * 
* - * repeated string sources = 1; - * @param index The index of the value to return. - * @return The bytes of the sources at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - com.google.protobuf.ByteString - getSourcesBytes(int index); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getSourcesOrBuilder( + int index); /** - * repeated string triggers = 2; - * @return A list containing the triggers. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - java.util.List + java.util.List getTriggersList(); /** - * repeated string triggers = 2; - * @return The count of triggers. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; + */ + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getTriggers(int index); + /** + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ int getTriggersCount(); /** - * repeated string triggers = 2; - * @param index The index of the element to return. - * @return The triggers at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - java.lang.String getTriggers(int index); + java.util.List + getTriggersOrBuilderList(); /** - * repeated string triggers = 2; - * @param index The index of the value to return. - * @return The bytes of the triggers at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - com.google.protobuf.ByteString - getTriggersBytes(int index); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getTriggersOrBuilder( + int index); /** - * string sink = 3; + * .seldon.mlops.chainer.PipelineTopic sink = 3; + * @return Whether the sink field is set. + */ + boolean hasSink(); + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; * @return The sink. */ - java.lang.String getSink(); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getSink(); /** - * string sink = 3; - * @return The bytes for sink. + * .seldon.mlops.chainer.PipelineTopic sink = 3; */ - com.google.protobuf.ByteString - getSinkBytes(); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getSinkOrBuilder(); /** * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; @@ -2087,57 +2094,47 @@ public interface PipelineStepUpdateOrBuilder extends /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - int getTensorMapCount(); + java.util.List + getTensorMapList(); /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; - */ - boolean containsTensorMap( - java.lang.String key); - /** - * Use {@link #getTensorMapMap()} instead. + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - @java.lang.Deprecated - java.util.Map - getTensorMap(); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping getTensorMap(int index); /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - java.util.Map - getTensorMapMap(); + int getTensorMapCount(); /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - /* nullable */ -java.lang.String getTensorMapOrDefault( - java.lang.String key, - /* nullable */ -java.lang.String defaultValue); + java.util.List + getTensorMapOrBuilderList(); /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - java.lang.String getTensorMapOrThrow( - java.lang.String key); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder getTensorMapOrBuilder( + int index); /** *
@@ -2179,11 +2176,11 @@ private PipelineStepUpdate(com.google.protobuf.GeneratedMessageV3.Builder bui
       super(builder);
     }
     private PipelineStepUpdate() {
-      sources_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      triggers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
-      sink_ = "";
+      sources_ = java.util.Collections.emptyList();
+      triggers_ = java.util.Collections.emptyList();
       inputJoinTy_ = 0;
       triggersJoinTy_ = 0;
+      tensorMap_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
@@ -2203,18 +2200,6 @@ protected java.lang.Object newInstance(
       return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineStepUpdate_descriptor;
     }
 
-    @SuppressWarnings({"rawtypes"})
-    @java.lang.Override
-    protected com.google.protobuf.MapField internalGetMapField(
-        int number) {
-      switch (number) {
-        case 8:
-          return internalGetTensorMap();
-        default:
-          throw new RuntimeException(
-              "Invalid map field number: " + number);
-      }
-    }
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
@@ -2352,7 +2337,20 @@ private PipelineJoinType(int value) {
     private int bitField0_;
     public static final int SOURCES_FIELD_NUMBER = 1;
     @SuppressWarnings("serial")
-    private com.google.protobuf.LazyStringList sources_;
+    private java.util.List sources_;
+    /**
+     * 
+     * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+     * Pipeline Resource example, e.g. transform.outputs.traffic
+     *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+     * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; + */ + @java.lang.Override + public java.util.List getSourcesList() { + return sources_; + } /** *
      * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
@@ -2360,11 +2358,11 @@ private PipelineJoinType(int value) {
      *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
      * 
* - * repeated string sources = 1; - * @return A list containing the sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public com.google.protobuf.ProtocolStringList - getSourcesList() { + @java.lang.Override + public java.util.List + getSourcesOrBuilderList() { return sources_; } /** @@ -2374,9 +2372,9 @@ private PipelineJoinType(int value) { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> *
* - * repeated string sources = 1; - * @return The count of sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ + @java.lang.Override public int getSourcesCount() { return sources_.size(); } @@ -2387,11 +2385,10 @@ public int getSourcesCount() { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @param index The index of the element to return. - * @return The sources at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public java.lang.String getSources(int index) { + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getSources(int index) { return sources_.get(index); } /** @@ -2401,88 +2398,79 @@ public java.lang.String getSources(int index) { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @param index The index of the value to return. - * @return The bytes of the sources at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public com.google.protobuf.ByteString - getSourcesBytes(int index) { - return sources_.getByteString(index); + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getSourcesOrBuilder( + int index) { + return sources_.get(index); } public static final int TRIGGERS_FIELD_NUMBER = 2; @SuppressWarnings("serial") - private com.google.protobuf.LazyStringList triggers_; + private java.util.List triggers_; + /** + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; + */ + @java.lang.Override + public java.util.List getTriggersList() { + return triggers_; + } /** - * repeated string triggers = 2; - * @return A list containing the triggers. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public com.google.protobuf.ProtocolStringList - getTriggersList() { + @java.lang.Override + public java.util.List + getTriggersOrBuilderList() { return triggers_; } /** - * repeated string triggers = 2; - * @return The count of triggers. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ + @java.lang.Override public int getTriggersCount() { return triggers_.size(); } /** - * repeated string triggers = 2; - * @param index The index of the element to return. - * @return The triggers at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public java.lang.String getTriggers(int index) { + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getTriggers(int index) { return triggers_.get(index); } /** - * repeated string triggers = 2; - * @param index The index of the value to return. - * @return The bytes of the triggers at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public com.google.protobuf.ByteString - getTriggersBytes(int index) { - return triggers_.getByteString(index); + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getTriggersOrBuilder( + int index) { + return triggers_.get(index); } public static final int SINK_FIELD_NUMBER = 3; - @SuppressWarnings("serial") - private volatile java.lang.Object sink_ = ""; + private io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic sink_; /** - * string sink = 3; + * .seldon.mlops.chainer.PipelineTopic sink = 3; + * @return Whether the sink field is set. + */ + @java.lang.Override + public boolean hasSink() { + return sink_ != null; + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; * @return The sink. */ @java.lang.Override - public java.lang.String getSink() { - java.lang.Object ref = sink_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - sink_ = s; - return s; - } + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getSink() { + return sink_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance() : sink_; } /** - * string sink = 3; - * @return The bytes for sink. + * .seldon.mlops.chainer.PipelineTopic sink = 3; */ @java.lang.Override - public com.google.protobuf.ByteString - getSinkBytes() { - java.lang.Object ref = sink_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - sink_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getSinkOrBuilder() { + return sink_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance() : sink_; } public static final int INPUTJOINTY_FIELD_NUMBER = 4; @@ -2564,98 +2552,64 @@ public int getJoinWindowMs() { } public static final int TENSORMAP_FIELD_NUMBER = 8; - private static final class TensorMapDefaultEntryHolder { - static final com.google.protobuf.MapEntry< - java.lang.String, java.lang.String> defaultEntry = - com.google.protobuf.MapEntry - .newDefaultInstance( - io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_descriptor, - com.google.protobuf.WireFormat.FieldType.STRING, - "", - com.google.protobuf.WireFormat.FieldType.STRING, - ""); - } @SuppressWarnings("serial") - private com.google.protobuf.MapField< - java.lang.String, java.lang.String> tensorMap_; - private com.google.protobuf.MapField - internalGetTensorMap() { - if (tensorMap_ == null) { - return com.google.protobuf.MapField.emptyMapField( - TensorMapDefaultEntryHolder.defaultEntry); - } - return tensorMap_; - } - public int getTensorMapCount() { - return internalGetTensorMap().getMap().size(); - } + private java.util.List tensorMap_; /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ @java.lang.Override - public boolean containsTensorMap( - java.lang.String key) { - if (key == null) { throw new NullPointerException("map key"); } - return internalGetTensorMap().getMap().containsKey(key); + public java.util.List getTensorMapList() { + return tensorMap_; } /** - * Use {@link #getTensorMapMap()} instead. + *
+     * optional list of tensor name mappings
+     * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ @java.lang.Override - @java.lang.Deprecated - public java.util.Map getTensorMap() { - return getTensorMapMap(); + public java.util.List + getTensorMapOrBuilderList() { + return tensorMap_; } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ @java.lang.Override - public java.util.Map getTensorMapMap() { - return internalGetTensorMap().getMap(); + public int getTensorMapCount() { + return tensorMap_.size(); } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ @java.lang.Override - public /* nullable */ -java.lang.String getTensorMapOrDefault( - java.lang.String key, - /* nullable */ -java.lang.String defaultValue) { - if (key == null) { throw new NullPointerException("map key"); } - java.util.Map map = - internalGetTensorMap().getMap(); - return map.containsKey(key) ? map.get(key) : defaultValue; + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping getTensorMap(int index) { + return tensorMap_.get(index); } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ @java.lang.Override - public java.lang.String getTensorMapOrThrow( - java.lang.String key) { - if (key == null) { throw new NullPointerException("map key"); } - java.util.Map map = - internalGetTensorMap().getMap(); - if (!map.containsKey(key)) { - throw new java.lang.IllegalArgumentException(); - } - return map.get(key); + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder getTensorMapOrBuilder( + int index) { + return tensorMap_.get(index); } public static final int BATCH_FIELD_NUMBER = 9; @@ -2711,13 +2665,13 @@ public final boolean isInitialized() { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { for (int i = 0; i < sources_.size(); i++) { - com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sources_.getRaw(i)); + output.writeMessage(1, sources_.get(i)); } for (int i = 0; i < triggers_.size(); i++) { - com.google.protobuf.GeneratedMessageV3.writeString(output, 2, triggers_.getRaw(i)); + output.writeMessage(2, triggers_.get(i)); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sink_)) { - com.google.protobuf.GeneratedMessageV3.writeString(output, 3, sink_); + if (sink_ != null) { + output.writeMessage(3, getSink()); } if (inputJoinTy_ != io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Unknown.getNumber()) { output.writeEnum(4, inputJoinTy_); @@ -2731,12 +2685,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000001) != 0)) { output.writeUInt32(7, joinWindowMs_); } - com.google.protobuf.GeneratedMessageV3 - .serializeStringMapTo( - output, - internalGetTensorMap(), - TensorMapDefaultEntryHolder.defaultEntry, - 8); + for (int i = 0; i < tensorMap_.size(); i++) { + output.writeMessage(8, tensorMap_.get(i)); + } if (batch_ != null) { output.writeMessage(9, getBatch()); } @@ -2749,24 +2700,17 @@ public int getSerializedSize() { if (size != -1) return size; size = 0; - { - int dataSize = 0; - for (int i = 0; i < sources_.size(); i++) { - dataSize += computeStringSizeNoTag(sources_.getRaw(i)); - } - size += dataSize; - size += 1 * getSourcesList().size(); + for (int i = 0; i < sources_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, sources_.get(i)); } - { - int dataSize = 0; - for (int i = 0; i < triggers_.size(); i++) { - dataSize += computeStringSizeNoTag(triggers_.getRaw(i)); - } - size += dataSize; - size += 1 * getTriggersList().size(); + for (int i = 0; i < triggers_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, triggers_.get(i)); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sink_)) { - size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, sink_); + if (sink_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getSink()); } if (inputJoinTy_ != io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Unknown.getNumber()) { size += com.google.protobuf.CodedOutputStream @@ -2784,15 +2728,9 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeUInt32Size(7, joinWindowMs_); } - for (java.util.Map.Entry entry - : internalGetTensorMap().getMap().entrySet()) { - com.google.protobuf.MapEntry - tensorMap__ = TensorMapDefaultEntryHolder.defaultEntry.newBuilderForType() - .setKey(entry.getKey()) - .setValue(entry.getValue()) - .build(); + for (int i = 0; i < tensorMap_.size(); i++) { size += com.google.protobuf.CodedOutputStream - .computeMessageSize(8, tensorMap__); + .computeMessageSize(8, tensorMap_.get(i)); } if (batch_ != null) { size += com.google.protobuf.CodedOutputStream @@ -2817,8 +2755,11 @@ public boolean equals(final java.lang.Object obj) { .equals(other.getSourcesList())) return false; if (!getTriggersList() .equals(other.getTriggersList())) return false; - if (!getSink() - .equals(other.getSink())) return false; + if (hasSink() != other.hasSink()) return false; + if (hasSink()) { + if (!getSink() + .equals(other.getSink())) return false; + } if (inputJoinTy_ != other.inputJoinTy_) return false; if (triggersJoinTy_ != other.triggersJoinTy_) return false; if (getPassEmptyResponses() @@ -2828,8 +2769,8 @@ public boolean equals(final java.lang.Object obj) { if (getJoinWindowMs() != other.getJoinWindowMs()) return false; } - if (!internalGetTensorMap().equals( - other.internalGetTensorMap())) return false; + if (!getTensorMapList() + .equals(other.getTensorMapList())) return false; if (hasBatch() != other.hasBatch()) return false; if (hasBatch()) { if (!getBatch() @@ -2854,8 +2795,10 @@ public int hashCode() { hash = (37 * hash) + TRIGGERS_FIELD_NUMBER; hash = (53 * hash) + getTriggersList().hashCode(); } - hash = (37 * hash) + SINK_FIELD_NUMBER; - hash = (53 * hash) + getSink().hashCode(); + if (hasSink()) { + hash = (37 * hash) + SINK_FIELD_NUMBER; + hash = (53 * hash) + getSink().hashCode(); + } hash = (37 * hash) + INPUTJOINTY_FIELD_NUMBER; hash = (53 * hash) + inputJoinTy_; hash = (37 * hash) + TRIGGERSJOINTY_FIELD_NUMBER; @@ -2867,9 +2810,9 @@ public int hashCode() { hash = (37 * hash) + JOINWINDOWMS_FIELD_NUMBER; hash = (53 * hash) + getJoinWindowMs(); } - if (!internalGetTensorMap().getMap().isEmpty()) { + if (getTensorMapCount() > 0) { hash = (37 * hash) + TENSORMAP_FIELD_NUMBER; - hash = (53 * hash) + internalGetTensorMap().hashCode(); + hash = (53 * hash) + getTensorMapList().hashCode(); } if (hasBatch()) { hash = (37 * hash) + BATCH_FIELD_NUMBER; @@ -2982,28 +2925,6 @@ public static final class Builder extends return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineStepUpdate_descriptor; } - @SuppressWarnings({"rawtypes"}) - protected com.google.protobuf.MapField internalGetMapField( - int number) { - switch (number) { - case 8: - return internalGetTensorMap(); - default: - throw new RuntimeException( - "Invalid map field number: " + number); - } - } - @SuppressWarnings({"rawtypes"}) - protected com.google.protobuf.MapField internalGetMutableMapField( - int number) { - switch (number) { - case 8: - return internalGetMutableTensorMap(); - default: - throw new RuntimeException( - "Invalid map field number: " + number); - } - } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { @@ -3026,16 +2947,36 @@ private Builder( public Builder clear() { super.clear(); bitField0_ = 0; - sources_ = com.google.protobuf.LazyStringArrayList.EMPTY; + if (sourcesBuilder_ == null) { + sources_ = java.util.Collections.emptyList(); + } else { + sources_ = null; + sourcesBuilder_.clear(); + } bitField0_ = (bitField0_ & ~0x00000001); - triggers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + if (triggersBuilder_ == null) { + triggers_ = java.util.Collections.emptyList(); + } else { + triggers_ = null; + triggersBuilder_.clear(); + } bitField0_ = (bitField0_ & ~0x00000002); - sink_ = ""; + sink_ = null; + if (sinkBuilder_ != null) { + sinkBuilder_.dispose(); + sinkBuilder_ = null; + } inputJoinTy_ = 0; triggersJoinTy_ = 0; passEmptyResponses_ = false; joinWindowMs_ = 0; - internalGetMutableTensorMap().clear(); + if (tensorMapBuilder_ == null) { + tensorMap_ = java.util.Collections.emptyList(); + } else { + tensorMap_ = null; + tensorMapBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); batch_ = null; if (batchBuilder_ != null) { batchBuilder_.dispose(); @@ -3074,22 +3015,41 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate buildPartial } private void buildPartialRepeatedFields(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate result) { - if (((bitField0_ & 0x00000001) != 0)) { - sources_ = sources_.getUnmodifiableView(); - bitField0_ = (bitField0_ & ~0x00000001); + if (sourcesBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + sources_ = java.util.Collections.unmodifiableList(sources_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.sources_ = sources_; + } else { + result.sources_ = sourcesBuilder_.build(); } - result.sources_ = sources_; - if (((bitField0_ & 0x00000002) != 0)) { - triggers_ = triggers_.getUnmodifiableView(); - bitField0_ = (bitField0_ & ~0x00000002); + if (triggersBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + triggers_ = java.util.Collections.unmodifiableList(triggers_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.triggers_ = triggers_; + } else { + result.triggers_ = triggersBuilder_.build(); + } + if (tensorMapBuilder_ == null) { + if (((bitField0_ & 0x00000080) != 0)) { + tensorMap_ = java.util.Collections.unmodifiableList(tensorMap_); + bitField0_ = (bitField0_ & ~0x00000080); + } + result.tensorMap_ = tensorMap_; + } else { + result.tensorMap_ = tensorMapBuilder_.build(); } - result.triggers_ = triggers_; } private void buildPartial0(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate result) { int from_bitField0_ = bitField0_; if (((from_bitField0_ & 0x00000004) != 0)) { - result.sink_ = sink_; + result.sink_ = sinkBuilder_ == null + ? sink_ + : sinkBuilder_.build(); } if (((from_bitField0_ & 0x00000008) != 0)) { result.inputJoinTy_ = inputJoinTy_; @@ -3105,10 +3065,6 @@ private void buildPartial0(io.seldon.mlops.chainer.ChainerOuterClass.PipelineSte result.joinWindowMs_ = joinWindowMs_; to_bitField0_ |= 0x00000001; } - if (((from_bitField0_ & 0x00000080) != 0)) { - result.tensorMap_ = internalGetTensorMap(); - result.tensorMap_.makeImmutable(); - } if (((from_bitField0_ & 0x00000100) != 0)) { result.batch_ = batchBuilder_ == null ? batch_ @@ -3161,30 +3117,60 @@ public Builder mergeFrom(com.google.protobuf.Message other) { public Builder mergeFrom(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate other) { if (other == io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.getDefaultInstance()) return this; - if (!other.sources_.isEmpty()) { - if (sources_.isEmpty()) { - sources_ = other.sources_; - bitField0_ = (bitField0_ & ~0x00000001); - } else { - ensureSourcesIsMutable(); - sources_.addAll(other.sources_); + if (sourcesBuilder_ == null) { + if (!other.sources_.isEmpty()) { + if (sources_.isEmpty()) { + sources_ = other.sources_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureSourcesIsMutable(); + sources_.addAll(other.sources_); + } + onChanged(); + } + } else { + if (!other.sources_.isEmpty()) { + if (sourcesBuilder_.isEmpty()) { + sourcesBuilder_.dispose(); + sourcesBuilder_ = null; + sources_ = other.sources_; + bitField0_ = (bitField0_ & ~0x00000001); + sourcesBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getSourcesFieldBuilder() : null; + } else { + sourcesBuilder_.addAllMessages(other.sources_); + } } - onChanged(); } - if (!other.triggers_.isEmpty()) { - if (triggers_.isEmpty()) { - triggers_ = other.triggers_; - bitField0_ = (bitField0_ & ~0x00000002); - } else { - ensureTriggersIsMutable(); - triggers_.addAll(other.triggers_); + if (triggersBuilder_ == null) { + if (!other.triggers_.isEmpty()) { + if (triggers_.isEmpty()) { + triggers_ = other.triggers_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureTriggersIsMutable(); + triggers_.addAll(other.triggers_); + } + onChanged(); + } + } else { + if (!other.triggers_.isEmpty()) { + if (triggersBuilder_.isEmpty()) { + triggersBuilder_.dispose(); + triggersBuilder_ = null; + triggers_ = other.triggers_; + bitField0_ = (bitField0_ & ~0x00000002); + triggersBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getTriggersFieldBuilder() : null; + } else { + triggersBuilder_.addAllMessages(other.triggers_); + } } - onChanged(); } - if (!other.getSink().isEmpty()) { - sink_ = other.sink_; - bitField0_ |= 0x00000004; - onChanged(); + if (other.hasSink()) { + mergeSink(other.getSink()); } if (other.inputJoinTy_ != 0) { setInputJoinTyValue(other.getInputJoinTyValue()); @@ -3198,9 +3184,32 @@ public Builder mergeFrom(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepU if (other.hasJoinWindowMs()) { setJoinWindowMs(other.getJoinWindowMs()); } - internalGetMutableTensorMap().mergeFrom( - other.internalGetTensorMap()); - bitField0_ |= 0x00000080; + if (tensorMapBuilder_ == null) { + if (!other.tensorMap_.isEmpty()) { + if (tensorMap_.isEmpty()) { + tensorMap_ = other.tensorMap_; + bitField0_ = (bitField0_ & ~0x00000080); + } else { + ensureTensorMapIsMutable(); + tensorMap_.addAll(other.tensorMap_); + } + onChanged(); + } + } else { + if (!other.tensorMap_.isEmpty()) { + if (tensorMapBuilder_.isEmpty()) { + tensorMapBuilder_.dispose(); + tensorMapBuilder_ = null; + tensorMap_ = other.tensorMap_; + bitField0_ = (bitField0_ & ~0x00000080); + tensorMapBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getTensorMapFieldBuilder() : null; + } else { + tensorMapBuilder_.addAllMessages(other.tensorMap_); + } + } + } if (other.hasBatch()) { mergeBatch(other.getBatch()); } @@ -3231,19 +3240,35 @@ public Builder mergeFrom( done = true; break; case 10: { - java.lang.String s = input.readStringRequireUtf8(); - ensureSourcesIsMutable(); - sources_.add(s); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic m = + input.readMessage( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.parser(), + extensionRegistry); + if (sourcesBuilder_ == null) { + ensureSourcesIsMutable(); + sources_.add(m); + } else { + sourcesBuilder_.addMessage(m); + } break; } // case 10 case 18: { - java.lang.String s = input.readStringRequireUtf8(); - ensureTriggersIsMutable(); - triggers_.add(s); + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic m = + input.readMessage( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.parser(), + extensionRegistry); + if (triggersBuilder_ == null) { + ensureTriggersIsMutable(); + triggers_.add(m); + } else { + triggersBuilder_.addMessage(m); + } break; } // case 18 case 26: { - sink_ = input.readStringRequireUtf8(); + input.readMessage( + getSinkFieldBuilder().getBuilder(), + extensionRegistry); bitField0_ |= 0x00000004; break; } // case 26 @@ -3268,12 +3293,16 @@ public Builder mergeFrom( break; } // case 56 case 66: { - com.google.protobuf.MapEntry - tensorMap__ = input.readMessage( - TensorMapDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); - internalGetMutableTensorMap().getMutableMap().put( - tensorMap__.getKey(), tensorMap__.getValue()); - bitField0_ |= 0x00000080; + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping m = + input.readMessage( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.parser(), + extensionRegistry); + if (tensorMapBuilder_ == null) { + ensureTensorMapIsMutable(); + tensorMap_.add(m); + } else { + tensorMapBuilder_.addMessage(m); + } break; } // case 66 case 74: { @@ -3300,13 +3329,18 @@ public Builder mergeFrom( } private int bitField0_; - private com.google.protobuf.LazyStringList sources_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private java.util.List sources_ = + java.util.Collections.emptyList(); private void ensureSourcesIsMutable() { if (!((bitField0_ & 0x00000001) != 0)) { - sources_ = new com.google.protobuf.LazyStringArrayList(sources_); + sources_ = new java.util.ArrayList(sources_); bitField0_ |= 0x00000001; } } + + private com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder> sourcesBuilder_; + /** *
        * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
@@ -3314,12 +3348,14 @@ private void ensureSourcesIsMutable() {
        *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
        * 
* - * repeated string sources = 1; - * @return A list containing the sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public com.google.protobuf.ProtocolStringList - getSourcesList() { - return sources_.getUnmodifiableView(); + public java.util.List getSourcesList() { + if (sourcesBuilder_ == null) { + return java.util.Collections.unmodifiableList(sources_); + } else { + return sourcesBuilder_.getMessageList(); + } } /** *
@@ -3328,11 +3364,14 @@ private void ensureSourcesIsMutable() {
        *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
        * 
* - * repeated string sources = 1; - * @return The count of sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ public int getSourcesCount() { - return sources_.size(); + if (sourcesBuilder_ == null) { + return sources_.size(); + } else { + return sourcesBuilder_.getCount(); + } } /** *
@@ -3341,12 +3380,14 @@ public int getSourcesCount() {
        *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
        * 
* - * repeated string sources = 1; - * @param index The index of the element to return. - * @return The sources at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public java.lang.String getSources(int index) { - return sources_.get(index); + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getSources(int index) { + if (sourcesBuilder_ == null) { + return sources_.get(index); + } else { + return sourcesBuilder_.getMessage(index); + } } /** *
@@ -3355,13 +3396,21 @@ public java.lang.String getSources(int index) {
        *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
        * 
* - * repeated string sources = 1; - * @param index The index of the value to return. - * @return The bytes of the sources at the given index. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public com.google.protobuf.ByteString - getSourcesBytes(int index) { - return sources_.getByteString(index); + public Builder setSources( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (sourcesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSourcesIsMutable(); + sources_.set(index, value); + onChanged(); + } else { + sourcesBuilder_.setMessage(index, value); + } + return this; } /** *
@@ -3370,17 +3419,17 @@ public java.lang.String getSources(int index) {
        *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
        * 
* - * repeated string sources = 1; - * @param index The index to set the value at. - * @param value The sources to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ public Builder setSources( - int index, java.lang.String value) { - if (value == null) { throw new NullPointerException(); } - ensureSourcesIsMutable(); - sources_.set(index, value); - onChanged(); + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (sourcesBuilder_ == null) { + ensureSourcesIsMutable(); + sources_.set(index, builderForValue.build()); + onChanged(); + } else { + sourcesBuilder_.setMessage(index, builderForValue.build()); + } return this; } /** @@ -3390,16 +3439,19 @@ public Builder setSources( * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @param value The sources to add. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder addSources( - java.lang.String value) { - if (value == null) { throw new NullPointerException(); } - ensureSourcesIsMutable(); - sources_.add(value); - onChanged(); + public Builder addSources(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (sourcesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSourcesIsMutable(); + sources_.add(value); + onChanged(); + } else { + sourcesBuilder_.addMessage(value); + } return this; } /** @@ -3409,16 +3461,20 @@ public Builder addSources( * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @param values The sources to add. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder addAllSources( - java.lang.Iterable values) { - ensureSourcesIsMutable(); - com.google.protobuf.AbstractMessageLite.Builder.addAll( - values, sources_); - onChanged(); + public Builder addSources( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (sourcesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSourcesIsMutable(); + sources_.add(index, value); + onChanged(); + } else { + sourcesBuilder_.addMessage(index, value); + } return this; } /** @@ -3428,13 +3484,17 @@ public Builder addAllSources( * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder clearSources() { - sources_ = com.google.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000001); - onChanged(); + public Builder addSources( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (sourcesBuilder_ == null) { + ensureSourcesIsMutable(); + sources_.add(builderForValue.build()); + onChanged(); + } else { + sourcesBuilder_.addMessage(builderForValue.build()); + } return this; } /** @@ -3444,297 +3504,639 @@ public Builder clearSources() { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @param value The bytes of the sources to add. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder addSourcesBytes( - com.google.protobuf.ByteString value) { - if (value == null) { throw new NullPointerException(); } - checkByteStringIsUtf8(value); - ensureSourcesIsMutable(); - sources_.add(value); - onChanged(); + public Builder addSources( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (sourcesBuilder_ == null) { + ensureSourcesIsMutable(); + sources_.add(index, builderForValue.build()); + onChanged(); + } else { + sourcesBuilder_.addMessage(index, builderForValue.build()); + } return this; } - - private com.google.protobuf.LazyStringList triggers_ = com.google.protobuf.LazyStringArrayList.EMPTY; - private void ensureTriggersIsMutable() { - if (!((bitField0_ & 0x00000002) != 0)) { - triggers_ = new com.google.protobuf.LazyStringArrayList(triggers_); - bitField0_ |= 0x00000002; - } - } /** - * repeated string triggers = 2; - * @return A list containing the triggers. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public com.google.protobuf.ProtocolStringList - getTriggersList() { - return triggers_.getUnmodifiableView(); + public Builder addAllSources( + java.lang.Iterable values) { + if (sourcesBuilder_ == null) { + ensureSourcesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, sources_); + onChanged(); + } else { + sourcesBuilder_.addAllMessages(values); + } + return this; } /** - * repeated string triggers = 2; - * @return The count of triggers. - */ - public int getTriggersCount() { - return triggers_.size(); + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; + */ + public Builder clearSources() { + if (sourcesBuilder_ == null) { + sources_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + sourcesBuilder_.clear(); + } + return this; } /** - * repeated string triggers = 2; - * @param index The index of the element to return. - * @return The triggers at the given index. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public java.lang.String getTriggers(int index) { - return triggers_.get(index); + public Builder removeSources(int index) { + if (sourcesBuilder_ == null) { + ensureSourcesIsMutable(); + sources_.remove(index); + onChanged(); + } else { + sourcesBuilder_.remove(index); + } + return this; } /** - * repeated string triggers = 2; - * @param index The index of the value to return. - * @return The bytes of the triggers at the given index. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public com.google.protobuf.ByteString - getTriggersBytes(int index) { - return triggers_.getByteString(index); + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder getSourcesBuilder( + int index) { + return getSourcesFieldBuilder().getBuilder(index); } /** - * repeated string triggers = 2; - * @param index The index to set the value at. - * @param value The triggers to set. - * @return This builder for chaining. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder setTriggers( - int index, java.lang.String value) { - if (value == null) { throw new NullPointerException(); } - ensureTriggersIsMutable(); - triggers_.set(index, value); - onChanged(); - return this; + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getSourcesOrBuilder( + int index) { + if (sourcesBuilder_ == null) { + return sources_.get(index); } else { + return sourcesBuilder_.getMessageOrBuilder(index); + } } /** - * repeated string triggers = 2; - * @param value The triggers to add. - * @return This builder for chaining. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder addTriggers( - java.lang.String value) { - if (value == null) { throw new NullPointerException(); } - ensureTriggersIsMutable(); - triggers_.add(value); - onChanged(); - return this; + public java.util.List + getSourcesOrBuilderList() { + if (sourcesBuilder_ != null) { + return sourcesBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(sources_); + } } /** - * repeated string triggers = 2; - * @param values The triggers to add. - * @return This builder for chaining. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder addAllTriggers( - java.lang.Iterable values) { - ensureTriggersIsMutable(); - com.google.protobuf.AbstractMessageLite.Builder.addAll( - values, triggers_); - onChanged(); - return this; + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder addSourcesBuilder() { + return getSourcesFieldBuilder().addBuilder( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance()); } /** - * repeated string triggers = 2; - * @return This builder for chaining. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder clearTriggers() { - triggers_ = com.google.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000002); - onChanged(); - return this; + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder addSourcesBuilder( + int index) { + return getSourcesFieldBuilder().addBuilder( + index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance()); } /** - * repeated string triggers = 2; - * @param value The bytes of the triggers to add. - * @return This builder for chaining. + *
+       * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
+       * Pipeline Resource example, e.g. transform.outputs.traffic
+       *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public Builder addTriggersBytes( - com.google.protobuf.ByteString value) { - if (value == null) { throw new NullPointerException(); } - checkByteStringIsUtf8(value); - ensureTriggersIsMutable(); - triggers_.add(value); - onChanged(); - return this; + public java.util.List + getSourcesBuilderList() { + return getSourcesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder> + getSourcesFieldBuilder() { + if (sourcesBuilder_ == null) { + sourcesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder>( + sources_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + sources_ = null; + } + return sourcesBuilder_; + } + + private java.util.List triggers_ = + java.util.Collections.emptyList(); + private void ensureTriggersIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + triggers_ = new java.util.ArrayList(triggers_); + bitField0_ |= 0x00000002; + } } - private java.lang.Object sink_ = ""; + private com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder> triggersBuilder_; + /** - * string sink = 3; - * @return The sink. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public java.lang.String getSink() { - java.lang.Object ref = sink_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - sink_ = s; - return s; + public java.util.List getTriggersList() { + if (triggersBuilder_ == null) { + return java.util.Collections.unmodifiableList(triggers_); } else { - return (java.lang.String) ref; + return triggersBuilder_.getMessageList(); } } /** - * string sink = 3; - * @return The bytes for sink. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public com.google.protobuf.ByteString - getSinkBytes() { - java.lang.Object ref = sink_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - sink_ = b; - return b; + public int getTriggersCount() { + if (triggersBuilder_ == null) { + return triggers_.size(); } else { - return (com.google.protobuf.ByteString) ref; + return triggersBuilder_.getCount(); } } /** - * string sink = 3; - * @param value The sink to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder setSink( - java.lang.String value) { - if (value == null) { throw new NullPointerException(); } - sink_ = value; - bitField0_ |= 0x00000004; - onChanged(); - return this; + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getTriggers(int index) { + if (triggersBuilder_ == null) { + return triggers_.get(index); + } else { + return triggersBuilder_.getMessage(index); + } } /** - * string sink = 3; - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder clearSink() { - sink_ = getDefaultInstance().getSink(); - bitField0_ = (bitField0_ & ~0x00000004); - onChanged(); + public Builder setTriggers( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (triggersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTriggersIsMutable(); + triggers_.set(index, value); + onChanged(); + } else { + triggersBuilder_.setMessage(index, value); + } return this; } /** - * string sink = 3; - * @param value The bytes for sink to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder setSinkBytes( - com.google.protobuf.ByteString value) { - if (value == null) { throw new NullPointerException(); } - checkByteStringIsUtf8(value); - sink_ = value; - bitField0_ |= 0x00000004; - onChanged(); + public Builder setTriggers( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (triggersBuilder_ == null) { + ensureTriggersIsMutable(); + triggers_.set(index, builderForValue.build()); + onChanged(); + } else { + triggersBuilder_.setMessage(index, builderForValue.build()); + } return this; } - - private int inputJoinTy_ = 0; /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; - * @return The enum numeric value on the wire for inputJoinTy. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - @java.lang.Override public int getInputJoinTyValue() { - return inputJoinTy_; + public Builder addTriggers(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (triggersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTriggersIsMutable(); + triggers_.add(value); + onChanged(); + } else { + triggersBuilder_.addMessage(value); + } + return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; - * @param value The enum numeric value on the wire for inputJoinTy to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder setInputJoinTyValue(int value) { - inputJoinTy_ = value; - bitField0_ |= 0x00000008; - onChanged(); + public Builder addTriggers( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (triggersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTriggersIsMutable(); + triggers_.add(index, value); + onChanged(); + } else { + triggersBuilder_.addMessage(index, value); + } return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; - * @return The inputJoinTy. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - @java.lang.Override - public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType getInputJoinTy() { - io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType result = io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.forNumber(inputJoinTy_); - return result == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.UNRECOGNIZED : result; + public Builder addTriggers( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (triggersBuilder_ == null) { + ensureTriggersIsMutable(); + triggers_.add(builderForValue.build()); + onChanged(); + } else { + triggersBuilder_.addMessage(builderForValue.build()); + } + return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; - * @param value The inputJoinTy to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder setInputJoinTy(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType value) { - if (value == null) { - throw new NullPointerException(); + public Builder addTriggers( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (triggersBuilder_ == null) { + ensureTriggersIsMutable(); + triggers_.add(index, builderForValue.build()); + onChanged(); + } else { + triggersBuilder_.addMessage(index, builderForValue.build()); } - bitField0_ |= 0x00000008; - inputJoinTy_ = value.getNumber(); - onChanged(); return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder clearInputJoinTy() { - bitField0_ = (bitField0_ & ~0x00000008); - inputJoinTy_ = 0; - onChanged(); + public Builder addAllTriggers( + java.lang.Iterable values) { + if (triggersBuilder_ == null) { + ensureTriggersIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, triggers_); + onChanged(); + } else { + triggersBuilder_.addAllMessages(values); + } return this; } - - private int triggersJoinTy_ = 0; /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; - * @return The enum numeric value on the wire for triggersJoinTy. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - @java.lang.Override public int getTriggersJoinTyValue() { - return triggersJoinTy_; + public Builder clearTriggers() { + if (triggersBuilder_ == null) { + triggers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + triggersBuilder_.clear(); + } + return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; - * @param value The enum numeric value on the wire for triggersJoinTy to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder setTriggersJoinTyValue(int value) { - triggersJoinTy_ = value; - bitField0_ |= 0x00000010; - onChanged(); + public Builder removeTriggers(int index) { + if (triggersBuilder_ == null) { + ensureTriggersIsMutable(); + triggers_.remove(index); + onChanged(); + } else { + triggersBuilder_.remove(index); + } return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; - * @return The triggersJoinTy. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - @java.lang.Override - public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType getTriggersJoinTy() { - io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType result = io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.forNumber(triggersJoinTy_); - return result == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.UNRECOGNIZED : result; + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder getTriggersBuilder( + int index) { + return getTriggersFieldBuilder().getBuilder(index); } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; - * @param value The triggersJoinTy to set. - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder setTriggersJoinTy(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType value) { - if (value == null) { - throw new NullPointerException(); + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getTriggersOrBuilder( + int index) { + if (triggersBuilder_ == null) { + return triggers_.get(index); } else { + return triggersBuilder_.getMessageOrBuilder(index); } - bitField0_ |= 0x00000010; - triggersJoinTy_ = value.getNumber(); - onChanged(); - return this; } /** - * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; - * @return This builder for chaining. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public Builder clearTriggersJoinTy() { - bitField0_ = (bitField0_ & ~0x00000010); + public java.util.List + getTriggersOrBuilderList() { + if (triggersBuilder_ != null) { + return triggersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(triggers_); + } + } + /** + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder addTriggersBuilder() { + return getTriggersFieldBuilder().addBuilder( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance()); + } + /** + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder addTriggersBuilder( + int index) { + return getTriggersFieldBuilder().addBuilder( + index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance()); + } + /** + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; + */ + public java.util.List + getTriggersBuilderList() { + return getTriggersFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder> + getTriggersFieldBuilder() { + if (triggersBuilder_ == null) { + triggersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder>( + triggers_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + triggers_ = null; + } + return triggersBuilder_; + } + + private io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic sink_; + private com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder> sinkBuilder_; + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + * @return Whether the sink field is set. + */ + public boolean hasSink() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + * @return The sink. + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getSink() { + if (sinkBuilder_ == null) { + return sink_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance() : sink_; + } else { + return sinkBuilder_.getMessage(); + } + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + public Builder setSink(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (sinkBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + sink_ = value; + } else { + sinkBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + public Builder setSink( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder builderForValue) { + if (sinkBuilder_ == null) { + sink_ = builderForValue.build(); + } else { + sinkBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + public Builder mergeSink(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic value) { + if (sinkBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + sink_ != null && + sink_ != io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance()) { + getSinkBuilder().mergeFrom(value); + } else { + sink_ = value; + } + } else { + sinkBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + public Builder clearSink() { + bitField0_ = (bitField0_ & ~0x00000004); + sink_ = null; + if (sinkBuilder_ != null) { + sinkBuilder_.dispose(); + sinkBuilder_ = null; + } + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder getSinkBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getSinkFieldBuilder().getBuilder(); + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder getSinkOrBuilder() { + if (sinkBuilder_ != null) { + return sinkBuilder_.getMessageOrBuilder(); + } else { + return sink_ == null ? + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance() : sink_; + } + } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder> + getSinkFieldBuilder() { + if (sinkBuilder_ == null) { + sinkBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder>( + getSink(), + getParentForChildren(), + isClean()); + sink_ = null; + } + return sinkBuilder_; + } + + private int inputJoinTy_ = 0; + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; + * @return The enum numeric value on the wire for inputJoinTy. + */ + @java.lang.Override public int getInputJoinTyValue() { + return inputJoinTy_; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; + * @param value The enum numeric value on the wire for inputJoinTy to set. + * @return This builder for chaining. + */ + public Builder setInputJoinTyValue(int value) { + inputJoinTy_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; + * @return The inputJoinTy. + */ + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType getInputJoinTy() { + io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType result = io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.forNumber(inputJoinTy_); + return result == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.UNRECOGNIZED : result; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; + * @param value The inputJoinTy to set. + * @return This builder for chaining. + */ + public Builder setInputJoinTy(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + inputJoinTy_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; + * @return This builder for chaining. + */ + public Builder clearInputJoinTy() { + bitField0_ = (bitField0_ & ~0x00000008); + inputJoinTy_ = 0; + onChanged(); + return this; + } + + private int triggersJoinTy_ = 0; + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; + * @return The enum numeric value on the wire for triggersJoinTy. + */ + @java.lang.Override public int getTriggersJoinTyValue() { + return triggersJoinTy_; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; + * @param value The enum numeric value on the wire for triggersJoinTy to set. + * @return This builder for chaining. + */ + public Builder setTriggersJoinTyValue(int value) { + triggersJoinTy_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; + * @return The triggersJoinTy. + */ + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType getTriggersJoinTy() { + io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType result = io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.forNumber(triggersJoinTy_); + return result == null ? io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.UNRECOGNIZED : result; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; + * @param value The triggersJoinTy to set. + * @return This builder for chaining. + */ + public Builder setTriggersJoinTy(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + triggersJoinTy_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType triggersJoinTy = 5; + * @return This builder for chaining. + */ + public Builder clearTriggersJoinTy() { + bitField0_ = (bitField0_ & ~0x00000010); triggersJoinTy_ = 0; onChanged(); return this; @@ -3840,315 +4242,2026 @@ public Builder clearJoinWindowMs() { return this; } - private com.google.protobuf.MapField< - java.lang.String, java.lang.String> tensorMap_; - private com.google.protobuf.MapField - internalGetTensorMap() { - if (tensorMap_ == null) { - return com.google.protobuf.MapField.emptyMapField( - TensorMapDefaultEntryHolder.defaultEntry); + private java.util.List tensorMap_ = + java.util.Collections.emptyList(); + private void ensureTensorMapIsMutable() { + if (!((bitField0_ & 0x00000080) != 0)) { + tensorMap_ = new java.util.ArrayList(tensorMap_); + bitField0_ |= 0x00000080; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder> tensorMapBuilder_; + + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public java.util.List getTensorMapList() { + if (tensorMapBuilder_ == null) { + return java.util.Collections.unmodifiableList(tensorMap_); + } else { + return tensorMapBuilder_.getMessageList(); } - return tensorMap_; } - private com.google.protobuf.MapField - internalGetMutableTensorMap() { - if (tensorMap_ == null) { - tensorMap_ = com.google.protobuf.MapField.newMapField( - TensorMapDefaultEntryHolder.defaultEntry); + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public int getTensorMapCount() { + if (tensorMapBuilder_ == null) { + return tensorMap_.size(); + } else { + return tensorMapBuilder_.getCount(); } - if (!tensorMap_.isMutable()) { - tensorMap_ = tensorMap_.copy(); + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping getTensorMap(int index) { + if (tensorMapBuilder_ == null) { + return tensorMap_.get(index); + } else { + return tensorMapBuilder_.getMessage(index); } - bitField0_ |= 0x00000080; - onChanged(); - return tensorMap_; } - public int getTensorMapCount() { - return internalGetTensorMap().getMap().size(); + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public Builder setTensorMap( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping value) { + if (tensorMapBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTensorMapIsMutable(); + tensorMap_.set(index, value); + onChanged(); + } else { + tensorMapBuilder_.setMessage(index, value); + } + return this; } /** *
-       * optional map of tensor name mappings
+       * optional list of tensor name mappings
        * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - @java.lang.Override - public boolean containsTensorMap( - java.lang.String key) { - if (key == null) { throw new NullPointerException("map key"); } - return internalGetTensorMap().getMap().containsKey(key); + public Builder setTensorMap( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder builderForValue) { + if (tensorMapBuilder_ == null) { + ensureTensorMapIsMutable(); + tensorMap_.set(index, builderForValue.build()); + onChanged(); + } else { + tensorMapBuilder_.setMessage(index, builderForValue.build()); + } + return this; } /** - * Use {@link #getTensorMapMap()} instead. + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - @java.lang.Override - @java.lang.Deprecated - public java.util.Map getTensorMap() { - return getTensorMapMap(); + public Builder addTensorMap(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping value) { + if (tensorMapBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTensorMapIsMutable(); + tensorMap_.add(value); + onChanged(); + } else { + tensorMapBuilder_.addMessage(value); + } + return this; } /** *
-       * optional map of tensor name mappings
+       * optional list of tensor name mappings
        * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - @java.lang.Override - public java.util.Map getTensorMapMap() { - return internalGetTensorMap().getMap(); + public Builder addTensorMap( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping value) { + if (tensorMapBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTensorMapIsMutable(); + tensorMap_.add(index, value); + onChanged(); + } else { + tensorMapBuilder_.addMessage(index, value); + } + return this; } /** *
-       * optional map of tensor name mappings
+       * optional list of tensor name mappings
        * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - @java.lang.Override - public /* nullable */ -java.lang.String getTensorMapOrDefault( - java.lang.String key, - /* nullable */ -java.lang.String defaultValue) { - if (key == null) { throw new NullPointerException("map key"); } - java.util.Map map = - internalGetTensorMap().getMap(); - return map.containsKey(key) ? map.get(key) : defaultValue; + public Builder addTensorMap( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder builderForValue) { + if (tensorMapBuilder_ == null) { + ensureTensorMapIsMutable(); + tensorMap_.add(builderForValue.build()); + onChanged(); + } else { + tensorMapBuilder_.addMessage(builderForValue.build()); + } + return this; } /** *
-       * optional map of tensor name mappings
+       * optional list of tensor name mappings
        * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ + public Builder addTensorMap( + int index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder builderForValue) { + if (tensorMapBuilder_ == null) { + ensureTensorMapIsMutable(); + tensorMap_.add(index, builderForValue.build()); + onChanged(); + } else { + tensorMapBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public Builder addAllTensorMap( + java.lang.Iterable values) { + if (tensorMapBuilder_ == null) { + ensureTensorMapIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, tensorMap_); + onChanged(); + } else { + tensorMapBuilder_.addAllMessages(values); + } + return this; + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public Builder clearTensorMap() { + if (tensorMapBuilder_ == null) { + tensorMap_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000080); + onChanged(); + } else { + tensorMapBuilder_.clear(); + } + return this; + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public Builder removeTensorMap(int index) { + if (tensorMapBuilder_ == null) { + ensureTensorMapIsMutable(); + tensorMap_.remove(index); + onChanged(); + } else { + tensorMapBuilder_.remove(index); + } + return this; + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder getTensorMapBuilder( + int index) { + return getTensorMapFieldBuilder().getBuilder(index); + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder getTensorMapOrBuilder( + int index) { + if (tensorMapBuilder_ == null) { + return tensorMap_.get(index); } else { + return tensorMapBuilder_.getMessageOrBuilder(index); + } + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public java.util.List + getTensorMapOrBuilderList() { + if (tensorMapBuilder_ != null) { + return tensorMapBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(tensorMap_); + } + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder addTensorMapBuilder() { + return getTensorMapFieldBuilder().addBuilder( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.getDefaultInstance()); + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder addTensorMapBuilder( + int index) { + return getTensorMapFieldBuilder().addBuilder( + index, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.getDefaultInstance()); + } + /** + *
+       * optional list of tensor name mappings
+       * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + public java.util.List + getTensorMapBuilderList() { + return getTensorMapFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder> + getTensorMapFieldBuilder() { + if (tensorMapBuilder_ == null) { + tensorMapBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder>( + tensorMap_, + ((bitField0_ & 0x00000080) != 0), + getParentForChildren(), + isClean()); + tensorMap_ = null; + } + return tensorMapBuilder_; + } + + private io.seldon.mlops.chainer.ChainerOuterClass.Batch batch_; + private com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder> batchBuilder_; + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + * @return Whether the batch field is set. + */ + public boolean hasBatch() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + * @return The batch. + */ + public io.seldon.mlops.chainer.ChainerOuterClass.Batch getBatch() { + if (batchBuilder_ == null) { + return batch_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; + } else { + return batchBuilder_.getMessage(); + } + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + public Builder setBatch(io.seldon.mlops.chainer.ChainerOuterClass.Batch value) { + if (batchBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + batch_ = value; + } else { + batchBuilder_.setMessage(value); + } + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + public Builder setBatch( + io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder builderForValue) { + if (batchBuilder_ == null) { + batch_ = builderForValue.build(); + } else { + batchBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + public Builder mergeBatch(io.seldon.mlops.chainer.ChainerOuterClass.Batch value) { + if (batchBuilder_ == null) { + if (((bitField0_ & 0x00000100) != 0) && + batch_ != null && + batch_ != io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance()) { + getBatchBuilder().mergeFrom(value); + } else { + batch_ = value; + } + } else { + batchBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + public Builder clearBatch() { + bitField0_ = (bitField0_ & ~0x00000100); + batch_ = null; + if (batchBuilder_ != null) { + batchBuilder_.dispose(); + batchBuilder_ = null; + } + onChanged(); + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder getBatchBuilder() { + bitField0_ |= 0x00000100; + onChanged(); + return getBatchFieldBuilder().getBuilder(); + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder getBatchOrBuilder() { + if (batchBuilder_ != null) { + return batchBuilder_.getMessageOrBuilder(); + } else { + return batch_ == null ? + io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; + } + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 9; + */ + private com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder> + getBatchFieldBuilder() { + if (batchBuilder_ == null) { + batchBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder>( + getBatch(), + getParentForChildren(), + isClean()); + batch_ = null; + } + return batchBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.PipelineStepUpdate) + } + + // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.PipelineStepUpdate) + private static final io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate(); + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public PipelineStepUpdate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface PipelineTensorMappingOrBuilder extends + // @@protoc_insertion_point(interface_extends:seldon.mlops.chainer.PipelineTensorMapping) + com.google.protobuf.MessageOrBuilder { + + /** + * string pipelineName = 1; + * @return The pipelineName. + */ + java.lang.String getPipelineName(); + /** + * string pipelineName = 1; + * @return The bytes for pipelineName. + */ + com.google.protobuf.ByteString + getPipelineNameBytes(); + + /** + * string topicAndTensor = 2; + * @return The topicAndTensor. + */ + java.lang.String getTopicAndTensor(); + /** + * string topicAndTensor = 2; + * @return The bytes for topicAndTensor. + */ + com.google.protobuf.ByteString + getTopicAndTensorBytes(); + + /** + * string tensorName = 3; + * @return The tensorName. + */ + java.lang.String getTensorName(); + /** + * string tensorName = 3; + * @return The bytes for tensorName. + */ + com.google.protobuf.ByteString + getTensorNameBytes(); + } + /** + * Protobuf type {@code seldon.mlops.chainer.PipelineTensorMapping} + */ + public static final class PipelineTensorMapping extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:seldon.mlops.chainer.PipelineTensorMapping) + PipelineTensorMappingOrBuilder { + private static final long serialVersionUID = 0L; + // Use PipelineTensorMapping.newBuilder() to construct. + private PipelineTensorMapping(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private PipelineTensorMapping() { + pipelineName_ = ""; + topicAndTensor_ = ""; + tensorName_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new PipelineTensorMapping(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTensorMapping_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTensorMapping_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.class, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder.class); + } + + public static final int PIPELINENAME_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object pipelineName_ = ""; + /** + * string pipelineName = 1; + * @return The pipelineName. + */ + @java.lang.Override + public java.lang.String getPipelineName() { + java.lang.Object ref = pipelineName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pipelineName_ = s; + return s; + } + } + /** + * string pipelineName = 1; + * @return The bytes for pipelineName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getPipelineNameBytes() { + java.lang.Object ref = pipelineName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + pipelineName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TOPICANDTENSOR_FIELD_NUMBER = 2; + @SuppressWarnings("serial") + private volatile java.lang.Object topicAndTensor_ = ""; + /** + * string topicAndTensor = 2; + * @return The topicAndTensor. + */ + @java.lang.Override + public java.lang.String getTopicAndTensor() { + java.lang.Object ref = topicAndTensor_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + topicAndTensor_ = s; + return s; + } + } + /** + * string topicAndTensor = 2; + * @return The bytes for topicAndTensor. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTopicAndTensorBytes() { + java.lang.Object ref = topicAndTensor_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + topicAndTensor_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TENSORNAME_FIELD_NUMBER = 3; + @SuppressWarnings("serial") + private volatile java.lang.Object tensorName_ = ""; + /** + * string tensorName = 3; + * @return The tensorName. + */ + @java.lang.Override + public java.lang.String getTensorName() { + java.lang.Object ref = tensorName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + tensorName_ = s; + return s; + } + } + /** + * string tensorName = 3; + * @return The bytes for tensorName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTensorNameBytes() { + java.lang.Object ref = tensorName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + tensorName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pipelineName_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, pipelineName_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(topicAndTensor_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, topicAndTensor_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(tensorName_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, tensorName_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pipelineName_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, pipelineName_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(topicAndTensor_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, topicAndTensor_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(tensorName_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, tensorName_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping)) { + return super.equals(obj); + } + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping other = (io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping) obj; + + if (!getPipelineName() + .equals(other.getPipelineName())) return false; + if (!getTopicAndTensor() + .equals(other.getTopicAndTensor())) return false; + if (!getTensorName() + .equals(other.getTensorName())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PIPELINENAME_FIELD_NUMBER; + hash = (53 * hash) + getPipelineName().hashCode(); + hash = (37 * hash) + TOPICANDTENSOR_FIELD_NUMBER; + hash = (53 * hash) + getTopicAndTensor().hashCode(); + hash = (37 * hash) + TENSORNAME_FIELD_NUMBER; + hash = (53 * hash) + getTensorName().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code seldon.mlops.chainer.PipelineTensorMapping} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:seldon.mlops.chainer.PipelineTensorMapping) + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMappingOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTensorMapping_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTensorMapping_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.class, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder.class); + } + + // Construct using io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + pipelineName_ = ""; + topicAndTensor_ = ""; + tensorName_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTensorMapping_descriptor; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping getDefaultInstanceForType() { + return io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.getDefaultInstance(); + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping build() { + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping buildPartial() { + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping result = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.pipelineName_ = pipelineName_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.topicAndTensor_ = topicAndTensor_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.tensorName_ = tensorName_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping) { + return mergeFrom((io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping other) { + if (other == io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.getDefaultInstance()) return this; + if (!other.getPipelineName().isEmpty()) { + pipelineName_ = other.pipelineName_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (!other.getTopicAndTensor().isEmpty()) { + topicAndTensor_ = other.topicAndTensor_; + bitField0_ |= 0x00000002; + onChanged(); + } + if (!other.getTensorName().isEmpty()) { + tensorName_ = other.tensorName_; + bitField0_ |= 0x00000004; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + pipelineName_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: { + topicAndTensor_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + case 26: { + tensorName_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } // case 26 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object pipelineName_ = ""; + /** + * string pipelineName = 1; + * @return The pipelineName. + */ + public java.lang.String getPipelineName() { + java.lang.Object ref = pipelineName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pipelineName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string pipelineName = 1; + * @return The bytes for pipelineName. + */ + public com.google.protobuf.ByteString + getPipelineNameBytes() { + java.lang.Object ref = pipelineName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + pipelineName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string pipelineName = 1; + * @param value The pipelineName to set. + * @return This builder for chaining. + */ + public Builder setPipelineName( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + pipelineName_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string pipelineName = 1; + * @return This builder for chaining. + */ + public Builder clearPipelineName() { + pipelineName_ = getDefaultInstance().getPipelineName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string pipelineName = 1; + * @param value The bytes for pipelineName to set. + * @return This builder for chaining. + */ + public Builder setPipelineNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + pipelineName_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private java.lang.Object topicAndTensor_ = ""; + /** + * string topicAndTensor = 2; + * @return The topicAndTensor. + */ + public java.lang.String getTopicAndTensor() { + java.lang.Object ref = topicAndTensor_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + topicAndTensor_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string topicAndTensor = 2; + * @return The bytes for topicAndTensor. + */ + public com.google.protobuf.ByteString + getTopicAndTensorBytes() { + java.lang.Object ref = topicAndTensor_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + topicAndTensor_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string topicAndTensor = 2; + * @param value The topicAndTensor to set. + * @return This builder for chaining. + */ + public Builder setTopicAndTensor( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + topicAndTensor_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * string topicAndTensor = 2; + * @return This builder for chaining. + */ + public Builder clearTopicAndTensor() { + topicAndTensor_ = getDefaultInstance().getTopicAndTensor(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * string topicAndTensor = 2; + * @param value The bytes for topicAndTensor to set. + * @return This builder for chaining. + */ + public Builder setTopicAndTensorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + topicAndTensor_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + private java.lang.Object tensorName_ = ""; + /** + * string tensorName = 3; + * @return The tensorName. + */ + public java.lang.String getTensorName() { + java.lang.Object ref = tensorName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + tensorName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string tensorName = 3; + * @return The bytes for tensorName. + */ + public com.google.protobuf.ByteString + getTensorNameBytes() { + java.lang.Object ref = tensorName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + tensorName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string tensorName = 3; + * @param value The tensorName to set. + * @return This builder for chaining. + */ + public Builder setTensorName( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + tensorName_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * string tensorName = 3; + * @return This builder for chaining. + */ + public Builder clearTensorName() { + tensorName_ = getDefaultInstance().getTensorName(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + * string tensorName = 3; + * @param value The bytes for tensorName to set. + * @return This builder for chaining. + */ + public Builder setTensorNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + tensorName_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.PipelineTensorMapping) + } + + // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.PipelineTensorMapping) + private static final io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping(); + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public PipelineTensorMapping parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface PipelineTopicOrBuilder extends + // @@protoc_insertion_point(interface_extends:seldon.mlops.chainer.PipelineTopic) + com.google.protobuf.MessageOrBuilder { + + /** + * string pipelineName = 1; + * @return The pipelineName. + */ + java.lang.String getPipelineName(); + /** + * string pipelineName = 1; + * @return The bytes for pipelineName. + */ + com.google.protobuf.ByteString + getPipelineNameBytes(); + + /** + * string topicName = 2; + * @return The topicName. + */ + java.lang.String getTopicName(); + /** + * string topicName = 2; + * @return The bytes for topicName. + */ + com.google.protobuf.ByteString + getTopicNameBytes(); + } + /** + * Protobuf type {@code seldon.mlops.chainer.PipelineTopic} + */ + public static final class PipelineTopic extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:seldon.mlops.chainer.PipelineTopic) + PipelineTopicOrBuilder { + private static final long serialVersionUID = 0L; + // Use PipelineTopic.newBuilder() to construct. + private PipelineTopic(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private PipelineTopic() { + pipelineName_ = ""; + topicName_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new PipelineTopic(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTopic_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTopic_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.class, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder.class); + } + + public static final int PIPELINENAME_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object pipelineName_ = ""; + /** + * string pipelineName = 1; + * @return The pipelineName. + */ + @java.lang.Override + public java.lang.String getPipelineName() { + java.lang.Object ref = pipelineName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pipelineName_ = s; + return s; + } + } + /** + * string pipelineName = 1; + * @return The bytes for pipelineName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getPipelineNameBytes() { + java.lang.Object ref = pipelineName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + pipelineName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TOPICNAME_FIELD_NUMBER = 2; + @SuppressWarnings("serial") + private volatile java.lang.Object topicName_ = ""; + /** + * string topicName = 2; + * @return The topicName. + */ + @java.lang.Override + public java.lang.String getTopicName() { + java.lang.Object ref = topicName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + topicName_ = s; + return s; + } + } + /** + * string topicName = 2; + * @return The bytes for topicName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTopicNameBytes() { + java.lang.Object ref = topicName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + topicName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pipelineName_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, pipelineName_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(topicName_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, topicName_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pipelineName_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, pipelineName_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(topicName_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, topicName_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic)) { + return super.equals(obj); + } + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic other = (io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) obj; + + if (!getPipelineName() + .equals(other.getPipelineName())) return false; + if (!getTopicName() + .equals(other.getTopicName())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PIPELINENAME_FIELD_NUMBER; + hash = (53 * hash) + getPipelineName().hashCode(); + hash = (37 * hash) + TOPICNAME_FIELD_NUMBER; + hash = (53 * hash) + getTopicName().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code seldon.mlops.chainer.PipelineTopic} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:seldon.mlops.chainer.PipelineTopic) + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopicOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTopic_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTopic_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.class, io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder.class); + } + + // Construct using io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + pipelineName_ = ""; + topicName_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_PipelineTopic_descriptor; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getDefaultInstanceForType() { + return io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance(); + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic build() { + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic buildPartial() { + io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic result = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.pipelineName_ = pipelineName_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.topicName_ = topicName_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { + return mergeFrom((io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic other) { + if (other == io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.getDefaultInstance()) return this; + if (!other.getPipelineName().isEmpty()) { + pipelineName_ = other.pipelineName_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (!other.getTopicName().isEmpty()) { + topicName_ = other.topicName_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + @java.lang.Override - public java.lang.String getTensorMapOrThrow( - java.lang.String key) { - if (key == null) { throw new NullPointerException("map key"); } - java.util.Map map = - internalGetTensorMap().getMap(); - if (!map.containsKey(key)) { - throw new java.lang.IllegalArgumentException(); + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); } - return map.get(key); - } - public Builder clearTensorMap() { - bitField0_ = (bitField0_ & ~0x00000080); - internalGetMutableTensorMap().getMutableMap() - .clear(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + pipelineName_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: { + topicName_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally return this; } + private int bitField0_; + + private java.lang.Object pipelineName_ = ""; /** - *
-       * optional map of tensor name mappings
-       * 
- * - * map<string, string> tensorMap = 8; + * string pipelineName = 1; + * @return The pipelineName. */ - public Builder removeTensorMap( - java.lang.String key) { - if (key == null) { throw new NullPointerException("map key"); } - internalGetMutableTensorMap().getMutableMap() - .remove(key); - return this; + public java.lang.String getPipelineName() { + java.lang.Object ref = pipelineName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pipelineName_ = s; + return s; + } else { + return (java.lang.String) ref; + } } /** - * Use alternate mutation accessors instead. + * string pipelineName = 1; + * @return The bytes for pipelineName. */ - @java.lang.Deprecated - public java.util.Map - getMutableTensorMap() { - bitField0_ |= 0x00000080; - return internalGetMutableTensorMap().getMutableMap(); + public com.google.protobuf.ByteString + getPipelineNameBytes() { + java.lang.Object ref = pipelineName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + pipelineName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } } /** - *
-       * optional map of tensor name mappings
-       * 
- * - * map<string, string> tensorMap = 8; + * string pipelineName = 1; + * @param value The pipelineName to set. + * @return This builder for chaining. */ - public Builder putTensorMap( - java.lang.String key, + public Builder setPipelineName( java.lang.String value) { - if (key == null) { throw new NullPointerException("map key"); } - if (value == null) { throw new NullPointerException("map value"); } - internalGetMutableTensorMap().getMutableMap() - .put(key, value); - bitField0_ |= 0x00000080; + if (value == null) { throw new NullPointerException(); } + pipelineName_ = value; + bitField0_ |= 0x00000001; + onChanged(); return this; } /** - *
-       * optional map of tensor name mappings
-       * 
- * - * map<string, string> tensorMap = 8; + * string pipelineName = 1; + * @return This builder for chaining. */ - public Builder putAllTensorMap( - java.util.Map values) { - internalGetMutableTensorMap().getMutableMap() - .putAll(values); - bitField0_ |= 0x00000080; + public Builder clearPipelineName() { + pipelineName_ = getDefaultInstance().getPipelineName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); return this; } - - private io.seldon.mlops.chainer.ChainerOuterClass.Batch batch_; - private com.google.protobuf.SingleFieldBuilderV3< - io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder> batchBuilder_; /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; - * @return Whether the batch field is set. + * string pipelineName = 1; + * @param value The bytes for pipelineName to set. + * @return This builder for chaining. */ - public boolean hasBatch() { - return ((bitField0_ & 0x00000100) != 0); + public Builder setPipelineNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + pipelineName_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; } + + private java.lang.Object topicName_ = ""; /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; - * @return The batch. + * string topicName = 2; + * @return The topicName. */ - public io.seldon.mlops.chainer.ChainerOuterClass.Batch getBatch() { - if (batchBuilder_ == null) { - return batch_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; + public java.lang.String getTopicName() { + java.lang.Object ref = topicName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + topicName_ = s; + return s; } else { - return batchBuilder_.getMessage(); + return (java.lang.String) ref; } } /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; + * string topicName = 2; + * @return The bytes for topicName. */ - public Builder setBatch(io.seldon.mlops.chainer.ChainerOuterClass.Batch value) { - if (batchBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - batch_ = value; + public com.google.protobuf.ByteString + getTopicNameBytes() { + java.lang.Object ref = topicName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + topicName_ = b; + return b; } else { - batchBuilder_.setMessage(value); + return (com.google.protobuf.ByteString) ref; } - bitField0_ |= 0x00000100; - onChanged(); - return this; } /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; + * string topicName = 2; + * @param value The topicName to set. + * @return This builder for chaining. */ - public Builder setBatch( - io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder builderForValue) { - if (batchBuilder_ == null) { - batch_ = builderForValue.build(); - } else { - batchBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000100; + public Builder setTopicName( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + topicName_ = value; + bitField0_ |= 0x00000002; onChanged(); return this; } /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; + * string topicName = 2; + * @return This builder for chaining. */ - public Builder mergeBatch(io.seldon.mlops.chainer.ChainerOuterClass.Batch value) { - if (batchBuilder_ == null) { - if (((bitField0_ & 0x00000100) != 0) && - batch_ != null && - batch_ != io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance()) { - getBatchBuilder().mergeFrom(value); - } else { - batch_ = value; - } - } else { - batchBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000100; + public Builder clearTopicName() { + topicName_ = getDefaultInstance().getTopicName(); + bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; + * string topicName = 2; + * @param value The bytes for topicName to set. + * @return This builder for chaining. */ - public Builder clearBatch() { - bitField0_ = (bitField0_ & ~0x00000100); - batch_ = null; - if (batchBuilder_ != null) { - batchBuilder_.dispose(); - batchBuilder_ = null; - } + public Builder setTopicNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + topicName_ = value; + bitField0_ |= 0x00000002; onChanged(); return this; } - /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; - */ - public io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder getBatchBuilder() { - bitField0_ |= 0x00000100; - onChanged(); - return getBatchFieldBuilder().getBuilder(); - } - /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; - */ - public io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder getBatchOrBuilder() { - if (batchBuilder_ != null) { - return batchBuilder_.getMessageOrBuilder(); - } else { - return batch_ == null ? - io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; - } - } - /** - *
-       * Batch settings
-       * 
- * - * .seldon.mlops.chainer.Batch batch = 9; - */ - private com.google.protobuf.SingleFieldBuilderV3< - io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder> - getBatchFieldBuilder() { - if (batchBuilder_ == null) { - batchBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< - io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder>( - getBatch(), - getParentForChildren(), - isClean()); - batch_ = null; - } - return batchBuilder_; - } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { @@ -4162,23 +6275,23 @@ public final Builder mergeUnknownFields( } - // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.PipelineStepUpdate) + // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.PipelineTopic) } - // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.PipelineStepUpdate) - private static final io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate DEFAULT_INSTANCE; + // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.PipelineTopic) + private static final io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate(); + DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic(); } - public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstance() { + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getDefaultInstance() { return DEFAULT_INSTANCE; } - private static final com.google.protobuf.Parser - PARSER = new com.google.protobuf.AbstractParser() { + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { @java.lang.Override - public PipelineStepUpdate parsePartialFrom( + public PipelineTopic parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { @@ -4197,17 +6310,17 @@ public PipelineStepUpdate parsePartialFrom( } }; - public static com.google.protobuf.Parser parser() { + public static com.google.protobuf.Parser parser() { return PARSER; } @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + public com.google.protobuf.Parser getParserForType() { return PARSER; } @java.lang.Override - public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstanceForType() { + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -6194,10 +8307,15 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineUpdateStatusResponse ge com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_seldon_mlops_chainer_PipelineStepUpdate_fieldAccessorTable; private static final com.google.protobuf.Descriptors.Descriptor - internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_descriptor; + internal_static_seldon_mlops_chainer_PipelineTensorMapping_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_seldon_mlops_chainer_PipelineTensorMapping_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_seldon_mlops_chainer_PipelineTopic_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable - internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_fieldAccessorTable; + internal_static_seldon_mlops_chainer_PipelineTopic_fieldAccessorTable; private static final com.google.protobuf.Descriptors.Descriptor internal_static_seldon_mlops_chainer_Batch_descriptor; private static final @@ -6230,36 +8348,41 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineUpdateStatusResponse ge "\t\022\017\n\007version\030\003 \001(\r\022\013\n\003uid\030\004 \001(\t\0229\n\007updat" + "es\030\005 \003(\0132(.seldon.mlops.chainer.Pipeline" + "StepUpdate\"8\n\021PipelineOperation\022\013\n\007Unkno" + - "wn\020\000\022\n\n\006Create\020\001\022\n\n\006Delete\020\002\"\232\004\n\022Pipelin" + - "eStepUpdate\022\017\n\007sources\030\001 \003(\t\022\020\n\010triggers" + - "\030\002 \003(\t\022\014\n\004sink\030\003 \001(\t\022N\n\013inputJoinTy\030\004 \001(" + - "\01629.seldon.mlops.chainer.PipelineStepUpd" + - "ate.PipelineJoinType\022Q\n\016triggersJoinTy\030\005" + - " \001(\01629.seldon.mlops.chainer.PipelineStep" + - "Update.PipelineJoinType\022\032\n\022passEmptyResp" + - "onses\030\006 \001(\010\022\031\n\014joinWindowMs\030\007 \001(\rH\000\210\001\001\022J" + - "\n\ttensorMap\030\010 \003(\01327.seldon.mlops.chainer" + - ".PipelineStepUpdate.TensorMapEntry\022*\n\005ba" + - "tch\030\t \001(\0132\033.seldon.mlops.chainer.Batch\0320" + - "\n\016TensorMapEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002" + - " \001(\t:\0028\001\">\n\020PipelineJoinType\022\013\n\007Unknown\020" + - "\000\022\t\n\005Inner\020\001\022\t\n\005Outer\020\002\022\007\n\003Any\020\003B\017\n\r_joi" + - "nWindowMs\"X\n\005Batch\022\021\n\004size\030\001 \001(\rH\000\210\001\001\022\025\n" + - "\010windowMs\030\002 \001(\rH\001\210\001\001\022\017\n\007rolling\030\003 \001(\010B\007\n" + - "\005_sizeB\013\n\t_windowMs\"{\n\033PipelineUpdateSta" + - "tusMessage\022;\n\006update\030\001 \001(\0132+.seldon.mlop" + - "s.chainer.PipelineUpdateMessage\022\017\n\007succe" + - "ss\030\002 \001(\010\022\016\n\006reason\030\003 \001(\t\"\036\n\034PipelineUpda" + - "teStatusResponse2\211\002\n\007Chainer\022~\n\030Subscrib" + - "ePipelineUpdates\0221.seldon.mlops.chainer." + - "PipelineSubscriptionRequest\032+.seldon.mlo" + - "ps.chainer.PipelineUpdateMessage\"\0000\001\022~\n\023" + - "PipelineUpdateEvent\0221.seldon.mlops.chain" + - "er.PipelineUpdateStatusMessage\0322.seldon." + - "mlops.chainer.PipelineUpdateStatusRespon" + - "se\"\000BS\n\027io.seldon.mlops.chainerZ8github." + - "com/seldonio/seldon-core/apis/go/v2/mlop" + - "s/chainerb\006proto3" + "wn\020\000\022\n\n\006Create\020\001\022\n\n\006Delete\020\002\"\313\004\n\022Pipelin" + + "eStepUpdate\0224\n\007sources\030\001 \003(\0132#.seldon.ml" + + "ops.chainer.PipelineTopic\0225\n\010triggers\030\002 " + + "\003(\0132#.seldon.mlops.chainer.PipelineTopic" + + "\0221\n\004sink\030\003 \001(\0132#.seldon.mlops.chainer.Pi" + + "pelineTopic\022N\n\013inputJoinTy\030\004 \001(\01629.seldo" + + "n.mlops.chainer.PipelineStepUpdate.Pipel" + + "ineJoinType\022Q\n\016triggersJoinTy\030\005 \001(\01629.se" + + "ldon.mlops.chainer.PipelineStepUpdate.Pi" + + "pelineJoinType\022\032\n\022passEmptyResponses\030\006 \001" + + "(\010\022\031\n\014joinWindowMs\030\007 \001(\rH\000\210\001\001\022>\n\ttensorM" + + "ap\030\010 \003(\0132+.seldon.mlops.chainer.Pipeline" + + "TensorMapping\022*\n\005batch\030\t \001(\0132\033.seldon.ml" + + "ops.chainer.Batch\">\n\020PipelineJoinType\022\013\n" + + "\007Unknown\020\000\022\t\n\005Inner\020\001\022\t\n\005Outer\020\002\022\007\n\003Any\020" + + "\003B\017\n\r_joinWindowMs\"Y\n\025PipelineTensorMapp" + + "ing\022\024\n\014pipelineName\030\001 \001(\t\022\026\n\016topicAndTen" + + "sor\030\002 \001(\t\022\022\n\ntensorName\030\003 \001(\t\"8\n\rPipelin" + + "eTopic\022\024\n\014pipelineName\030\001 \001(\t\022\021\n\ttopicNam" + + "e\030\002 \001(\t\"X\n\005Batch\022\021\n\004size\030\001 \001(\rH\000\210\001\001\022\025\n\010w" + + "indowMs\030\002 \001(\rH\001\210\001\001\022\017\n\007rolling\030\003 \001(\010B\007\n\005_" + + "sizeB\013\n\t_windowMs\"{\n\033PipelineUpdateStatu" + + "sMessage\022;\n\006update\030\001 \001(\0132+.seldon.mlops." + + "chainer.PipelineUpdateMessage\022\017\n\007success" + + "\030\002 \001(\010\022\016\n\006reason\030\003 \001(\t\"\036\n\034PipelineUpdate" + + "StatusResponse2\211\002\n\007Chainer\022~\n\030SubscribeP" + + "ipelineUpdates\0221.seldon.mlops.chainer.Pi" + + "pelineSubscriptionRequest\032+.seldon.mlops" + + ".chainer.PipelineUpdateMessage\"\0000\001\022~\n\023Pi" + + "pelineUpdateEvent\0221.seldon.mlops.chainer" + + ".PipelineUpdateStatusMessage\0322.seldon.ml" + + "ops.chainer.PipelineUpdateStatusResponse" + + "\"\000BS\n\027io.seldon.mlops.chainerZ8github.co" + + "m/seldonio/seldon-core/apis/go/v2/mlops/" + + "chainerb\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -6283,26 +8406,32 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineUpdateStatusResponse ge com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_seldon_mlops_chainer_PipelineStepUpdate_descriptor, new java.lang.String[] { "Sources", "Triggers", "Sink", "InputJoinTy", "TriggersJoinTy", "PassEmptyResponses", "JoinWindowMs", "TensorMap", "Batch", "JoinWindowMs", }); - internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_descriptor = - internal_static_seldon_mlops_chainer_PipelineStepUpdate_descriptor.getNestedTypes().get(0); - internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_fieldAccessorTable = new + internal_static_seldon_mlops_chainer_PipelineTensorMapping_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_seldon_mlops_chainer_PipelineTensorMapping_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_seldon_mlops_chainer_PipelineTensorMapping_descriptor, + new java.lang.String[] { "PipelineName", "TopicAndTensor", "TensorName", }); + internal_static_seldon_mlops_chainer_PipelineTopic_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_seldon_mlops_chainer_PipelineTopic_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( - internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_descriptor, - new java.lang.String[] { "Key", "Value", }); + internal_static_seldon_mlops_chainer_PipelineTopic_descriptor, + new java.lang.String[] { "PipelineName", "TopicName", }); internal_static_seldon_mlops_chainer_Batch_descriptor = - getDescriptor().getMessageTypes().get(3); + getDescriptor().getMessageTypes().get(5); internal_static_seldon_mlops_chainer_Batch_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_seldon_mlops_chainer_Batch_descriptor, new java.lang.String[] { "Size", "WindowMs", "Rolling", "Size", "WindowMs", }); internal_static_seldon_mlops_chainer_PipelineUpdateStatusMessage_descriptor = - getDescriptor().getMessageTypes().get(4); + getDescriptor().getMessageTypes().get(6); internal_static_seldon_mlops_chainer_PipelineUpdateStatusMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_seldon_mlops_chainer_PipelineUpdateStatusMessage_descriptor, new java.lang.String[] { "Update", "Success", "Reason", }); internal_static_seldon_mlops_chainer_PipelineUpdateStatusResponse_descriptor = - getDescriptor().getMessageTypes().get(5); + getDescriptor().getMessageTypes().get(7); internal_static_seldon_mlops_chainer_PipelineUpdateStatusResponse_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_seldon_mlops_chainer_PipelineUpdateStatusResponse_descriptor, diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassGrpcKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassGrpcKt.kt index c837e55f3d..fc624c176e 100644 --- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassGrpcKt.kt +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassGrpcKt.kt @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - package io.seldon.mlops.chainer import io.grpc.CallOptions diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassKt.kt index 54a4840430..e69de29bb2 100644 --- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassKt.kt +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClassKt.kt @@ -1,16 +0,0 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineStepUpdateKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineStepUpdateKt.kt index e57358f2c3..c6c0131a44 100644 --- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineStepUpdateKt.kt +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineStepUpdateKt.kt @@ -1,19 +1,3 @@ -/* -Copyright 2022 Seldon Technologies Ltd. - -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. -*/ - //Generated by the protocol buffer compiler. DO NOT EDIT! // source: chainer.proto @@ -51,10 +35,9 @@ public object PipelineStepUpdateKt { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; - * @return A list containing the sources. + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ - public val sources: com.google.protobuf.kotlin.DslList + public val sources: com.google.protobuf.kotlin.DslList @kotlin.jvm.JvmSynthetic get() = com.google.protobuf.kotlin.DslList( _builder.getSourcesList() @@ -66,12 +49,12 @@ public object PipelineStepUpdateKt { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; * @param value The sources to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("addSources") - public fun com.google.protobuf.kotlin.DslList.add(value: kotlin.String) { + public fun com.google.protobuf.kotlin.DslList.add(value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { _builder.addSources(value) } /** @@ -81,13 +64,13 @@ public object PipelineStepUpdateKt { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; * @param value The sources to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("plusAssignSources") @Suppress("NOTHING_TO_INLINE") - public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(value: kotlin.String) { + public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { add(value) } /** @@ -97,12 +80,12 @@ public object PipelineStepUpdateKt { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; * @param values The sources to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("addAllSources") - public fun com.google.protobuf.kotlin.DslList.addAll(values: kotlin.collections.Iterable) { + public fun com.google.protobuf.kotlin.DslList.addAll(values: kotlin.collections.Iterable) { _builder.addAllSources(values) } /** @@ -112,13 +95,13 @@ public object PipelineStepUpdateKt { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; * @param values The sources to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("plusAssignAllSources") @Suppress("NOTHING_TO_INLINE") - public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(values: kotlin.collections.Iterable) { + public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(values: kotlin.collections.Iterable) { addAll(values) } /** @@ -128,28 +111,31 @@ public object PipelineStepUpdateKt { * seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name> * * - * repeated string sources = 1; + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; * @param index The index to set the value at. * @param value The sources to set. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("setSources") - public operator fun com.google.protobuf.kotlin.DslList.set(index: kotlin.Int, value: kotlin.String) { + public operator fun com.google.protobuf.kotlin.DslList.set(index: kotlin.Int, value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { _builder.setSources(index, value) - }/** + } + /** *
      * https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit
      * Pipeline Resource example, e.g. transform.outputs.traffic
      *    seldon.<namespace>.<model name>.<inputs|outputs>.<tensor name>
      * 
* - * repeated string sources = 1; + * repeated .seldon.mlops.chainer.PipelineTopic sources = 1; */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("clearSources") - public fun com.google.protobuf.kotlin.DslList.clear() { + public fun com.google.protobuf.kotlin.DslList.clear() { _builder.clearSources() } + + /** * An uninstantiable, behaviorless type to represent the field in * generics. @@ -157,73 +143,75 @@ public object PipelineStepUpdateKt { @kotlin.OptIn(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class) public class TriggersProxy private constructor() : com.google.protobuf.kotlin.DslProxy() /** - * repeated string triggers = 2; - * @return A list containing the triggers. + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ - public val triggers: com.google.protobuf.kotlin.DslList + public val triggers: com.google.protobuf.kotlin.DslList @kotlin.jvm.JvmSynthetic get() = com.google.protobuf.kotlin.DslList( _builder.getTriggersList() ) /** - * repeated string triggers = 2; + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; * @param value The triggers to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("addTriggers") - public fun com.google.protobuf.kotlin.DslList.add(value: kotlin.String) { + public fun com.google.protobuf.kotlin.DslList.add(value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { _builder.addTriggers(value) } /** - * repeated string triggers = 2; + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; * @param value The triggers to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("plusAssignTriggers") @Suppress("NOTHING_TO_INLINE") - public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(value: kotlin.String) { + public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { add(value) } /** - * repeated string triggers = 2; + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; * @param values The triggers to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("addAllTriggers") - public fun com.google.protobuf.kotlin.DslList.addAll(values: kotlin.collections.Iterable) { + public fun com.google.protobuf.kotlin.DslList.addAll(values: kotlin.collections.Iterable) { _builder.addAllTriggers(values) } /** - * repeated string triggers = 2; + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; * @param values The triggers to add. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("plusAssignAllTriggers") @Suppress("NOTHING_TO_INLINE") - public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(values: kotlin.collections.Iterable) { + public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(values: kotlin.collections.Iterable) { addAll(values) } /** - * repeated string triggers = 2; + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; * @param index The index to set the value at. * @param value The triggers to set. */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("setTriggers") - public operator fun com.google.protobuf.kotlin.DslList.set(index: kotlin.Int, value: kotlin.String) { + public operator fun com.google.protobuf.kotlin.DslList.set(index: kotlin.Int, value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic) { _builder.setTriggers(index, value) - }/** - * repeated string triggers = 2; + } + /** + * repeated .seldon.mlops.chainer.PipelineTopic triggers = 2; */ @kotlin.jvm.JvmSynthetic @kotlin.jvm.JvmName("clearTriggers") - public fun com.google.protobuf.kotlin.DslList.clear() { + public fun com.google.protobuf.kotlin.DslList.clear() { _builder.clearTriggers() } + + /** - * string sink = 3; + * .seldon.mlops.chainer.PipelineTopic sink = 3; */ - public var sink: kotlin.String + public var sink: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic @JvmName("getSink") get() = _builder.getSink() @JvmName("setSink") @@ -231,11 +219,18 @@ public object PipelineStepUpdateKt { _builder.setSink(value) } /** - * string sink = 3; + * .seldon.mlops.chainer.PipelineTopic sink = 3; */ public fun clearSink() { _builder.clearSink() } + /** + * .seldon.mlops.chainer.PipelineTopic sink = 3; + * @return Whether the sink field is set. + */ + public fun hasSink(): kotlin.Boolean { + return _builder.hasSink() + } /** * .seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType inputJoinTy = 4; @@ -340,82 +335,97 @@ public object PipelineStepUpdateKt { public class TensorMapProxy private constructor() : com.google.protobuf.kotlin.DslProxy() /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; */ - public val tensorMap: com.google.protobuf.kotlin.DslMap + public val tensorMap: com.google.protobuf.kotlin.DslList @kotlin.jvm.JvmSynthetic - @JvmName("getTensorMapMap") - get() = com.google.protobuf.kotlin.DslMap( - _builder.getTensorMapMap() + get() = com.google.protobuf.kotlin.DslList( + _builder.getTensorMapList() ) /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + * @param value The tensorMap to add. */ - @JvmName("putTensorMap") - public fun com.google.protobuf.kotlin.DslMap - .put(key: kotlin.String, value: kotlin.String) { - _builder.putTensorMap(key, value) - } + @kotlin.jvm.JvmSynthetic + @kotlin.jvm.JvmName("addTensorMap") + public fun com.google.protobuf.kotlin.DslList.add(value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping) { + _builder.addTensorMap(value) + } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + * @param value The tensorMap to add. */ @kotlin.jvm.JvmSynthetic - @JvmName("setTensorMap") + @kotlin.jvm.JvmName("plusAssignTensorMap") @Suppress("NOTHING_TO_INLINE") - public inline operator fun com.google.protobuf.kotlin.DslMap - .set(key: kotlin.String, value: kotlin.String) { - put(key, value) - } + public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping) { + add(value) + } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + * @param values The tensorMap to add. */ @kotlin.jvm.JvmSynthetic - @JvmName("removeTensorMap") - public fun com.google.protobuf.kotlin.DslMap - .remove(key: kotlin.String) { - _builder.removeTensorMap(key) - } + @kotlin.jvm.JvmName("addAllTensorMap") + public fun com.google.protobuf.kotlin.DslList.addAll(values: kotlin.collections.Iterable) { + _builder.addAllTensorMap(values) + } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + * @param values The tensorMap to add. */ @kotlin.jvm.JvmSynthetic - @JvmName("putAllTensorMap") - public fun com.google.protobuf.kotlin.DslMap - .putAll(map: kotlin.collections.Map) { - _builder.putAllTensorMap(map) - } + @kotlin.jvm.JvmName("plusAssignAllTensorMap") + @Suppress("NOTHING_TO_INLINE") + public inline operator fun com.google.protobuf.kotlin.DslList.plusAssign(values: kotlin.collections.Iterable) { + addAll(values) + } /** *
-     * optional map of tensor name mappings
+     * optional list of tensor name mappings
      * 
* - * map<string, string> tensorMap = 8; + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + * @param index The index to set the value at. + * @param value The tensorMap to set. */ @kotlin.jvm.JvmSynthetic - @JvmName("clearTensorMap") - fun com.google.protobuf.kotlin.DslMap - .clear() { - _builder.clearTensorMap() - } + @kotlin.jvm.JvmName("setTensorMap") + public operator fun com.google.protobuf.kotlin.DslList.set(index: kotlin.Int, value: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping) { + _builder.setTensorMap(index, value) + } + /** + *
+     * optional list of tensor name mappings
+     * 
+ * + * repeated .seldon.mlops.chainer.PipelineTensorMapping tensorMap = 8; + */ + @kotlin.jvm.JvmSynthetic + @kotlin.jvm.JvmName("clearTensorMap") + public fun com.google.protobuf.kotlin.DslList.clear() { + _builder.clearTensorMap() + } + /** *
@@ -458,6 +468,9 @@ public object PipelineStepUpdateKt {
 public inline fun io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.copy(block: io.seldon.mlops.chainer.PipelineStepUpdateKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate =
   io.seldon.mlops.chainer.PipelineStepUpdateKt.Dsl._create(this.toBuilder()).apply { block() }._build()
 
+public val io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdateOrBuilder.sinkOrNull: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic?
+  get() = if (hasSink()) getSink() else null
+
 public val io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdateOrBuilder.batchOrNull: io.seldon.mlops.chainer.ChainerOuterClass.Batch?
   get() = if (hasBatch()) getBatch() else null
 
diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineSubscriptionRequestKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineSubscriptionRequestKt.kt
index eab28a5cfe..63ade8cb35 100644
--- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineSubscriptionRequestKt.kt
+++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineSubscriptionRequestKt.kt
@@ -1,19 +1,3 @@
-/*
-Copyright 2022 Seldon Technologies Ltd.
-
-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.
-*/
-
 //Generated by the protocol buffer compiler. DO NOT EDIT!
 // source: chainer.proto
 
diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineTensorMappingKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineTensorMappingKt.kt
new file mode 100644
index 0000000000..728ed6e31a
--- /dev/null
+++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineTensorMappingKt.kt
@@ -0,0 +1,80 @@
+//Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: chainer.proto
+
+package io.seldon.mlops.chainer;
+
+@kotlin.jvm.JvmName("-initializepipelineTensorMapping")
+public inline fun pipelineTensorMapping(block: io.seldon.mlops.chainer.PipelineTensorMappingKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping =
+  io.seldon.mlops.chainer.PipelineTensorMappingKt.Dsl._create(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.newBuilder()).apply { block() }._build()
+public object PipelineTensorMappingKt {
+  @kotlin.OptIn(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)
+  @com.google.protobuf.kotlin.ProtoDslMarker
+  public class Dsl private constructor(
+    private val _builder: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder
+  ) {
+    public companion object {
+      @kotlin.jvm.JvmSynthetic
+      @kotlin.PublishedApi
+      internal fun _create(builder: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.Builder): Dsl = Dsl(builder)
+    }
+
+    @kotlin.jvm.JvmSynthetic
+    @kotlin.PublishedApi
+    internal fun _build(): io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping = _builder.build()
+
+    /**
+     * string pipelineName = 1;
+     */
+    public var pipelineName: kotlin.String
+      @JvmName("getPipelineName")
+      get() = _builder.getPipelineName()
+      @JvmName("setPipelineName")
+      set(value) {
+        _builder.setPipelineName(value)
+      }
+    /**
+     * string pipelineName = 1;
+     */
+    public fun clearPipelineName() {
+      _builder.clearPipelineName()
+    }
+
+    /**
+     * string topicAndTensor = 2;
+     */
+    public var topicAndTensor: kotlin.String
+      @JvmName("getTopicAndTensor")
+      get() = _builder.getTopicAndTensor()
+      @JvmName("setTopicAndTensor")
+      set(value) {
+        _builder.setTopicAndTensor(value)
+      }
+    /**
+     * string topicAndTensor = 2;
+     */
+    public fun clearTopicAndTensor() {
+      _builder.clearTopicAndTensor()
+    }
+
+    /**
+     * string tensorName = 3;
+     */
+    public var tensorName: kotlin.String
+      @JvmName("getTensorName")
+      get() = _builder.getTensorName()
+      @JvmName("setTensorName")
+      set(value) {
+        _builder.setTensorName(value)
+      }
+    /**
+     * string tensorName = 3;
+     */
+    public fun clearTensorName() {
+      _builder.clearTensorName()
+    }
+  }
+}
+@kotlin.jvm.JvmSynthetic
+public inline fun io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping.copy(block: io.seldon.mlops.chainer.PipelineTensorMappingKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping =
+  io.seldon.mlops.chainer.PipelineTensorMappingKt.Dsl._create(this.toBuilder()).apply { block() }._build()
+
diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineTopicKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineTopicKt.kt
new file mode 100644
index 0000000000..a483f5a2f2
--- /dev/null
+++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineTopicKt.kt
@@ -0,0 +1,63 @@
+//Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: chainer.proto
+
+package io.seldon.mlops.chainer;
+
+@kotlin.jvm.JvmName("-initializepipelineTopic")
+public inline fun pipelineTopic(block: io.seldon.mlops.chainer.PipelineTopicKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic =
+  io.seldon.mlops.chainer.PipelineTopicKt.Dsl._create(io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.newBuilder()).apply { block() }._build()
+public object PipelineTopicKt {
+  @kotlin.OptIn(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)
+  @com.google.protobuf.kotlin.ProtoDslMarker
+  public class Dsl private constructor(
+    private val _builder: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder
+  ) {
+    public companion object {
+      @kotlin.jvm.JvmSynthetic
+      @kotlin.PublishedApi
+      internal fun _create(builder: io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.Builder): Dsl = Dsl(builder)
+    }
+
+    @kotlin.jvm.JvmSynthetic
+    @kotlin.PublishedApi
+    internal fun _build(): io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic = _builder.build()
+
+    /**
+     * string pipelineName = 1;
+     */
+    public var pipelineName: kotlin.String
+      @JvmName("getPipelineName")
+      get() = _builder.getPipelineName()
+      @JvmName("setPipelineName")
+      set(value) {
+        _builder.setPipelineName(value)
+      }
+    /**
+     * string pipelineName = 1;
+     */
+    public fun clearPipelineName() {
+      _builder.clearPipelineName()
+    }
+
+    /**
+     * string topicName = 2;
+     */
+    public var topicName: kotlin.String
+      @JvmName("getTopicName")
+      get() = _builder.getTopicName()
+      @JvmName("setTopicName")
+      set(value) {
+        _builder.setTopicName(value)
+      }
+    /**
+     * string topicName = 2;
+     */
+    public fun clearTopicName() {
+      _builder.clearTopicName()
+    }
+  }
+}
+@kotlin.jvm.JvmSynthetic
+public inline fun io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic.copy(block: io.seldon.mlops.chainer.PipelineTopicKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic =
+  io.seldon.mlops.chainer.PipelineTopicKt.Dsl._create(this.toBuilder()).apply { block() }._build()
+
diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateMessageKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateMessageKt.kt
index 364823cefd..661d89ef4e 100644
--- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateMessageKt.kt
+++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateMessageKt.kt
@@ -1,19 +1,3 @@
-/*
-Copyright 2022 Seldon Technologies Ltd.
-
-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.
-*/
-
 //Generated by the protocol buffer compiler. DO NOT EDIT!
 // source: chainer.proto
 
diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusMessageKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusMessageKt.kt
index 00390cd293..3e2fc47f60 100644
--- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusMessageKt.kt
+++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusMessageKt.kt
@@ -1,19 +1,3 @@
-/*
-Copyright 2022 Seldon Technologies Ltd.
-
-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.
-*/
-
 //Generated by the protocol buffer compiler. DO NOT EDIT!
 // source: chainer.proto
 
diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusResponseKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusResponseKt.kt
index 86d19d7242..9da131e4c9 100644
--- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusResponseKt.kt
+++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/PipelineUpdateStatusResponseKt.kt
@@ -1,19 +1,3 @@
-/*
-Copyright 2022 Seldon Technologies Ltd.
-
-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.
-*/
-
 //Generated by the protocol buffer compiler. DO NOT EDIT!
 // source: chainer.proto
 
diff --git a/apis/mlops/scheduler/scheduler.proto b/apis/mlops/scheduler/scheduler.proto
index 8cc5e58cc8..5a71137f8b 100644
--- a/apis/mlops/scheduler/scheduler.proto
+++ b/apis/mlops/scheduler/scheduler.proto
@@ -273,6 +273,7 @@ message Pipeline {
   repeated PipelineStep steps = 4;
   optional PipelineOutput output = 5;
   optional KubernetesMeta kubernetesMeta = 6;
+  optional PipelineInput input = 7;
 }
 
 message PipelineStep {
@@ -296,6 +297,20 @@ message Batch {
   optional uint32 windowMs = 2;
 }
 
+message PipelineInput {
+  enum JoinOp {
+    INNER = 0;
+    OUTER = 1;
+    ANY = 2;
+  }
+  repeated string externalInputs = 1;
+  repeated string externalTriggers = 2;
+  optional uint32 joinWindowMs = 3; // Join window millisecs for output, default 0
+  JoinOp joinType = 4;
+  JoinOp triggersJoin = 5;
+  map tensorMap = 6; // optional map of tensor name mappings
+}
+
 message PipelineOutput {
   enum JoinOp {
     INNER = 0;
diff --git a/docs/source/contents/examples/index.md b/docs/source/contents/examples/index.md
index 4bfb1dc7b6..28a9e34f68 100644
--- a/docs/source/contents/examples/index.md
+++ b/docs/source/contents/examples/index.md
@@ -14,6 +14,7 @@ This section will provide some examples to allow operations with Seldon to be te
 ## Pipelines
 
 * [Pipeline examples](pipeline-examples.md)
+* [Pipeline to pipeline examples](pipeline-to-pipeline.md)
 
 ## Explainers
 
@@ -50,6 +51,7 @@ local-examples.md
 k8s-examples.md
 huggingface.md
 pipeline-examples.md
+pipeline-to-pipeline.md
 explainer-examples.md
 local-experiments.md
 experiment-versions.md
diff --git a/docs/source/contents/examples/pipeline-to-pipeline.md b/docs/source/contents/examples/pipeline-to-pipeline.md
new file mode 100644
index 0000000000..ebace88f81
--- /dev/null
+++ b/docs/source/contents/examples/pipeline-to-pipeline.md
@@ -0,0 +1,8 @@
+# Pipeline to Pipeline Examples
+
+Run these examples from the `samples` folder.
+
+
+```{include} ../../../../samples/pipeline-to-pipeline.md
+:relative-images:
+```
diff --git a/docs/source/contents/pipelines/index.md b/docs/source/contents/pipelines/index.md
index 89dd65ba12..ae61b56893 100644
--- a/docs/source/contents/pipelines/index.md
+++ b/docs/source/contents/pipelines/index.md
@@ -130,6 +130,35 @@ Here the `mul10` step is run if data is seen on the pipeline inputs in the `ok1`
 
 If we changed the `triggersJoinType` for `mul10` to `inner` then both `ok1` and `ok2` would need to appear before `mul10` is run.
 
+### Pipeline Inputs
+
+Pipelines by default can be accessed synchronously via http/grpc or asynchronously via the Kafka topic created for them. However, it's also possible to create a pipeline to take input from one or more other pipelines by specifying an `input` section. If for example we already have the `tfsimple` pipeline shown below:
+
+```{literalinclude} ../../../../samples/pipelines/tfsimple.yaml
+:language: yaml
+```
+
+We can create another pipeline which takes its input from this pipeline, as shown below:
+
+```{literalinclude} ../../../../samples/pipelines/tfsimple-extended.yaml
+:language: yaml
+```
+
+In this way pipelines can be built to extend existing running pipelines to allow extensibility and sharing of data flows.
+
+The spec follows the same spec for a step except that references to other pipelines are contained in the `externalInputs` section which takes the form of pipeline or pipeline.step references:
+  * `.(inputs|outputs).`
+  * `.(step)..`
+
+Tensor names are optional and only needed if you want to take just one tensor from an input or output.
+
+There is also an `externalTriggers` section which allows triggers from other pipelines.
+
+Further examples can be found in the [pipeline-to-pipeline examples](../examples/pipeline-to-pipeline.md).
+
+Present caveats:
+ * Circular dependencies are not presently detected.
+ * Pipeline status is local to each pipeline.
 
 ## Data Centric Implementation
 
diff --git a/operator/apis/mlops/v1alpha1/pipeline_types.go b/operator/apis/mlops/v1alpha1/pipeline_types.go
index 46bfed034f..b9e5a2a954 100644
--- a/operator/apis/mlops/v1alpha1/pipeline_types.go
+++ b/operator/apis/mlops/v1alpha1/pipeline_types.go
@@ -26,8 +26,11 @@ import (
 
 // PipelineSpec defines the desired state of Pipeline
 type PipelineSpec struct {
+	// External inputs to this pipeline, optional
+	Input *PipelineInput `json:"input,omitempty"`
 	// The steps of this inference graph pipeline
-	Steps  []PipelineStep  `json:"steps"`
+	Steps []PipelineStep `json:"steps"`
+	// Synchronous output from this pipeline, optional
 	Output *PipelineOutput `json:"output,omitempty"`
 }
 
@@ -67,6 +70,21 @@ type PipelineBatch struct {
 	Rolling  bool    `json:"rolling,omitempty"`
 }
 
+type PipelineInput struct {
+	// Previous external pipeline steps to receive data from
+	ExternalInputs []string `json:"externalInputs,omitempty"`
+	// Triggers required to activate inputs
+	ExternalTriggers []string `json:"externalTriggers,omitempty"`
+	// msecs to wait for messages from multiple inputs to arrive before joining the inputs
+	JoinWindowMs *uint32 `json:"joinWindowMs,omitempty"`
+	// One of inner (default), outer, or any (see above for details)
+	JoinType *JoinType `json:"joinType,omitempty"`
+	// One of inner (default), outer, or any (see above for details)
+	TriggersJoinType *JoinType `json:"triggersJoinType,omitempty"`
+	// Map of tensor name conversions to use e.g. output1 -> input1
+	TensorMap map[string]string `json:"tensorMap,omitempty"`
+}
+
 type PipelineOutput struct {
 	// Previous step to receive data from
 	Steps []string `json:"steps,omitempty"`
@@ -112,6 +130,39 @@ func init() {
 func (p Pipeline) AsSchedulerPipeline() *scheduler.Pipeline {
 	var steps []*scheduler.PipelineStep
 	var output *scheduler.PipelineOutput
+	var input *scheduler.PipelineInput
+	if p.Spec.Input != nil {
+		input = &scheduler.PipelineInput{
+			ExternalInputs:   p.Spec.Input.ExternalInputs,
+			ExternalTriggers: p.Spec.Input.ExternalTriggers,
+			JoinWindowMs:     p.Spec.Input.JoinWindowMs,
+			TensorMap:        p.Spec.Input.TensorMap,
+		}
+		if p.Spec.Input.JoinType != nil {
+			switch *p.Spec.Input.JoinType {
+			case JoinTypeInner:
+				input.JoinType = scheduler.PipelineInput_INNER
+			case JoinTypeOuter:
+				input.JoinType = scheduler.PipelineInput_OUTER
+			case JoinTypeAny:
+				input.JoinType = scheduler.PipelineInput_ANY
+			default:
+				input.JoinType = scheduler.PipelineInput_INNER
+			}
+		}
+		if p.Spec.Input.TriggersJoinType != nil {
+			switch *p.Spec.Input.TriggersJoinType {
+			case JoinTypeInner:
+				input.TriggersJoin = scheduler.PipelineInput_INNER
+			case JoinTypeOuter:
+				input.TriggersJoin = scheduler.PipelineInput_OUTER
+			case JoinTypeAny:
+				input.TriggersJoin = scheduler.PipelineInput_ANY
+			default:
+				input.TriggersJoin = scheduler.PipelineInput_INNER
+			}
+		}
+	}
 	for _, step := range p.Spec.Steps {
 		pipelineStep := &scheduler.PipelineStep{
 			Name:         step.Name,
@@ -174,6 +225,7 @@ func (p Pipeline) AsSchedulerPipeline() *scheduler.Pipeline {
 	return &scheduler.Pipeline{
 		Name:           p.GetName(),
 		Uid:            "", // ID Will be set on scheduler side. IDs don't change on k8s when updates are made so can't use it for each version
+		Input:          input,
 		Steps:          steps,
 		Output:         output,
 		KubernetesMeta: &scheduler.KubernetesMeta{Namespace: p.Namespace, Generation: p.Generation},
diff --git a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go
index 6a7aca189d..92c0a5f927 100644
--- a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go
+++ b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go
@@ -486,6 +486,53 @@ func (in *PipelineBatch) DeepCopy() *PipelineBatch {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PipelineInput) DeepCopyInto(out *PipelineInput) {
+	*out = *in
+	if in.ExternalInputs != nil {
+		in, out := &in.ExternalInputs, &out.ExternalInputs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ExternalTriggers != nil {
+		in, out := &in.ExternalTriggers, &out.ExternalTriggers
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.JoinWindowMs != nil {
+		in, out := &in.JoinWindowMs, &out.JoinWindowMs
+		*out = new(uint32)
+		**out = **in
+	}
+	if in.JoinType != nil {
+		in, out := &in.JoinType, &out.JoinType
+		*out = new(JoinType)
+		**out = **in
+	}
+	if in.TriggersJoinType != nil {
+		in, out := &in.TriggersJoinType, &out.TriggersJoinType
+		*out = new(JoinType)
+		**out = **in
+	}
+	if in.TensorMap != nil {
+		in, out := &in.TensorMap, &out.TensorMap
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineInput.
+func (in *PipelineInput) DeepCopy() *PipelineInput {
+	if in == nil {
+		return nil
+	}
+	out := new(PipelineInput)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *PipelineList) DeepCopyInto(out *PipelineList) {
 	*out = *in
@@ -553,6 +600,11 @@ func (in *PipelineOutput) DeepCopy() *PipelineOutput {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *PipelineSpec) DeepCopyInto(out *PipelineSpec) {
 	*out = *in
+	if in.Input != nil {
+		in, out := &in.Input, &out.Input
+		*out = new(PipelineInput)
+		(*in).DeepCopyInto(*out)
+	}
 	if in.Steps != nil {
 		in, out := &in.Steps, &out.Steps
 		*out = make([]PipelineStep, len(*in))
diff --git a/operator/pkg/cli/kafka.go b/operator/pkg/cli/kafka.go
index 8b89899b33..0e51d63d86 100644
--- a/operator/pkg/cli/kafka.go
+++ b/operator/pkg/cli/kafka.go
@@ -62,9 +62,9 @@ type KafkaInspectTopic struct {
 }
 
 type KafkaInspectTopicMessage struct {
-	Headers map[string]string `json:"headers"`
-	Key     string            `json:"key"`
-	Value   json.RawMessage   `json:"value"`
+	Headers map[string][]string `json:"headers"`
+	Key     string              `json:"key"`
+	Value   json.RawMessage     `json:"value"`
 }
 
 func NewKafkaClient(kafkaBroker string, kafkaBrokerIsSet bool, schedulerHost string, schedulerHostIsSet bool) (*KafkaClient, error) {
@@ -323,9 +323,9 @@ func (kc *KafkaClient) createInspectTopic(topic string, tensor string, offset in
 }
 
 func addInspectHeaders(e *kafka.Message, kitm *KafkaInspectTopicMessage) {
-	kitm.Headers = make(map[string]string)
+	kitm.Headers = make(map[string][]string)
 	for _, header := range e.Headers {
-		kitm.Headers[header.Key] = string(header.Value)
+		kitm.Headers[header.Key] = append(kitm.Headers[header.Key], string(header.Value))
 	}
 }
 
diff --git a/samples/img_pipeline1.jpg b/samples/img_pipeline1.jpg
new file mode 100644
index 0000000000..1f10b79c0d
Binary files /dev/null and b/samples/img_pipeline1.jpg differ
diff --git a/samples/img_pipeline2.jpg b/samples/img_pipeline2.jpg
new file mode 100644
index 0000000000..64e8129683
Binary files /dev/null and b/samples/img_pipeline2.jpg differ
diff --git a/samples/img_pipeline3.jpg b/samples/img_pipeline3.jpg
new file mode 100644
index 0000000000..c92882e5c7
Binary files /dev/null and b/samples/img_pipeline3.jpg differ
diff --git a/samples/img_pipeline4.jpg b/samples/img_pipeline4.jpg
new file mode 100644
index 0000000000..e61c78a4d9
Binary files /dev/null and b/samples/img_pipeline4.jpg differ
diff --git a/samples/img_pipeline5.jpg b/samples/img_pipeline5.jpg
new file mode 100644
index 0000000000..7e471c7dfc
Binary files /dev/null and b/samples/img_pipeline5.jpg differ
diff --git a/samples/pipeline-examples.ipynb b/samples/pipeline-examples.ipynb
index cda698f761..62b8c7f149 100644
--- a/samples/pipeline-examples.ipynb
+++ b/samples/pipeline-examples.ipynb
@@ -178,7 +178,7 @@
       "    {\r\n",
       "      \"pipeline\": {\r\n",
       "        \"name\": \"tfsimples\",\r\n",
-      "        \"uid\": \"cdqjijpqa12c739ab3p0\",\r\n",
+      "        \"uid\": \"ceb1joj3gshc73fmvpu0\",\r\n",
       "        \"version\": 1,\r\n",
       "        \"steps\": [\r\n",
       "          {\r\n",
@@ -206,7 +206,8 @@
       "        \"pipelineVersion\": 1,\r\n",
       "        \"status\": \"PipelineReady\",\r\n",
       "        \"reason\": \"created pipeline\",\r\n",
-      "        \"lastChangeTimestamp\": \"2022-11-16T19:26:08.037067065Z\"\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-11T17:56:51.471467841Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
       "      }\r\n",
       "    }\r\n",
       "  ]\r\n",
@@ -412,7 +413,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 9,
    "id": "10b5bca0",
    "metadata": {},
    "outputs": [
@@ -489,7 +490,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 10,
    "id": "dimensional-hours",
    "metadata": {},
    "outputs": [
@@ -507,7 +508,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 11,
    "id": "outside-inspiration",
    "metadata": {},
    "outputs": [
@@ -537,7 +538,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 12,
    "id": "5e41768d",
    "metadata": {},
    "outputs": [
@@ -587,7 +588,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 13,
    "id": "fcbc23cc",
    "metadata": {},
    "outputs": [
@@ -609,7 +610,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 14,
    "id": "f8bb2efb",
    "metadata": {},
    "outputs": [
@@ -639,7 +640,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 15,
    "id": "cd58ecba",
    "metadata": {},
    "outputs": [
@@ -674,7 +675,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 16,
    "id": "ce9e163b",
    "metadata": {},
    "outputs": [
@@ -692,7 +693,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 17,
    "id": "7593c77f",
    "metadata": {},
    "outputs": [
@@ -706,7 +707,7 @@
       "    {\r\n",
       "      \"pipeline\": {\r\n",
       "        \"name\": \"join\",\r\n",
-      "        \"uid\": \"cdqjit1qa12c739ab3pg\",\r\n",
+      "        \"uid\": \"ceb1k1r3gshc73fmvpug\",\r\n",
       "        \"version\": 1,\r\n",
       "        \"steps\": [\r\n",
       "          {\r\n",
@@ -738,7 +739,8 @@
       "        \"pipelineVersion\": 1,\r\n",
       "        \"status\": \"PipelineReady\",\r\n",
       "        \"reason\": \"created pipeline\",\r\n",
-      "        \"lastChangeTimestamp\": \"2022-11-16T19:26:44.706282241Z\"\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-11T17:57:27.599682702Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
       "      }\r\n",
       "    }\r\n",
       "  ]\r\n",
@@ -760,7 +762,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 18,
    "id": "2151ee4c",
    "metadata": {
     "scrolled": true
@@ -840,7 +842,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 19,
    "id": "06575cca",
    "metadata": {},
    "outputs": [
@@ -858,7 +860,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 20,
    "id": "8bd56a9c",
    "metadata": {},
    "outputs": [
@@ -890,7 +892,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 21,
    "id": "e3a2c7f3",
    "metadata": {},
    "outputs": [
@@ -940,7 +942,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 22,
    "id": "2104f9bf",
    "metadata": {},
    "outputs": [
@@ -962,7 +964,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 23,
    "id": "7af88e3a",
    "metadata": {},
    "outputs": [
@@ -992,7 +994,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 24,
    "id": "f5bbe84d",
    "metadata": {},
    "outputs": [
@@ -1031,7 +1033,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 25,
    "id": "829f9b18",
    "metadata": {},
    "outputs": [
@@ -1049,7 +1051,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 26,
    "id": "ae202d26",
    "metadata": {},
    "outputs": [
@@ -1063,7 +1065,7 @@
       "    {\r\n",
       "      \"pipeline\": {\r\n",
       "        \"name\": \"tfsimple-conditional\",\r\n",
-      "        \"uid\": \"cdqjj21qa12c739ab3q0\",\r\n",
+      "        \"uid\": \"ceb1k7j3gshc73fmvpv0\",\r\n",
       "        \"version\": 1,\r\n",
       "        \"steps\": [\r\n",
       "          {\r\n",
@@ -1101,7 +1103,8 @@
       "        \"pipelineVersion\": 1,\r\n",
       "        \"status\": \"PipelineReady\",\r\n",
       "        \"reason\": \"created pipeline\",\r\n",
-      "        \"lastChangeTimestamp\": \"2022-11-16T19:27:04.928498607Z\"\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-11T17:57:50.612064319Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
       "      }\r\n",
       "    }\r\n",
       "  ]\r\n",
@@ -1123,7 +1126,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 27,
    "id": "0d03d5fe",
    "metadata": {},
    "outputs": [
@@ -1168,7 +1171,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 28,
    "id": "def4e8e1",
    "metadata": {},
    "outputs": [
@@ -1205,7 +1208,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 29,
    "id": "3042fe42",
    "metadata": {},
    "outputs": [
@@ -1223,7 +1226,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 30,
    "id": "3bda8710",
    "metadata": {},
    "outputs": [
@@ -1254,7 +1257,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 31,
    "id": "baa2cb5f",
    "metadata": {
     "scrolled": true
@@ -1294,7 +1297,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 32,
    "id": "33692146",
    "metadata": {},
    "outputs": [
@@ -1314,7 +1317,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 33,
    "id": "e0493925",
    "metadata": {},
    "outputs": [
@@ -1342,7 +1345,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
+   "execution_count": 34,
    "id": "c8d27ff3",
    "metadata": {},
    "outputs": [
@@ -1380,7 +1383,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 36,
+   "execution_count": 35,
    "id": "74768602",
    "metadata": {},
    "outputs": [
@@ -1398,7 +1401,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 37,
+   "execution_count": 36,
    "id": "922b975e",
    "metadata": {},
    "outputs": [
@@ -1412,7 +1415,7 @@
       "    {\r\n",
       "      \"pipeline\": {\r\n",
       "        \"name\": \"pipeline-inputs\",\r\n",
-      "        \"uid\": \"cdqjj89qa12c739ab3qg\",\r\n",
+      "        \"uid\": \"ceb1kcj3gshc73fmvpvg\",\r\n",
       "        \"version\": 1,\r\n",
       "        \"steps\": [\r\n",
       "          {\r\n",
@@ -1446,7 +1449,8 @@
       "        \"pipelineVersion\": 1,\r\n",
       "        \"status\": \"PipelineReady\",\r\n",
       "        \"reason\": \"created pipeline\",\r\n",
-      "        \"lastChangeTimestamp\": \"2022-11-16T19:27:30.024128982Z\"\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-11T17:58:11.137492043Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
       "      }\r\n",
       "    }\r\n",
       "  ]\r\n",
@@ -1460,7 +1464,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 38,
+   "execution_count": 37,
    "id": "792680b5",
    "metadata": {},
    "outputs": [
@@ -1512,7 +1516,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 38,
    "id": "d6fd0d45",
    "metadata": {},
    "outputs": [
@@ -1530,7 +1534,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 39,
    "id": "3d5bb23c",
    "metadata": {},
    "outputs": [
@@ -1560,7 +1564,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
+   "execution_count": 40,
    "id": "1a09de5c",
    "metadata": {
     "scrolled": true
@@ -1598,7 +1602,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 41,
    "id": "85eb4ef2",
    "metadata": {},
    "outputs": [
@@ -1618,7 +1622,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 42,
    "id": "d11e29c6",
    "metadata": {},
    "outputs": [
@@ -1646,7 +1650,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 44,
+   "execution_count": 43,
    "id": "227e06e4",
    "metadata": {},
    "outputs": [
@@ -1686,7 +1690,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 45,
+   "execution_count": 44,
    "id": "2bce48e8",
    "metadata": {},
    "outputs": [
@@ -1704,7 +1708,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 46,
+   "execution_count": 45,
    "id": "66c60286",
    "metadata": {},
    "outputs": [
@@ -1718,7 +1722,7 @@
       "    {\r\n",
       "      \"pipeline\": {\r\n",
       "        \"name\": \"trigger-joins\",\r\n",
-      "        \"uid\": \"cdqjjdpqa12c739ab3r0\",\r\n",
+      "        \"uid\": \"ceb1khb3gshc73fmvq00\",\r\n",
       "        \"version\": 1,\r\n",
       "        \"steps\": [\r\n",
       "          {\r\n",
@@ -1755,7 +1759,8 @@
       "        \"pipelineVersion\": 1,\r\n",
       "        \"status\": \"PipelineReady\",\r\n",
       "        \"reason\": \"created pipeline\",\r\n",
-      "        \"lastChangeTimestamp\": \"2022-11-16T19:27:51.550445363Z\"\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-11T17:58:30.105358917Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
       "      }\r\n",
       "    }\r\n",
       "  ]\r\n",
@@ -1769,7 +1774,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 47,
+   "execution_count": 46,
    "id": "403fcbd5",
    "metadata": {},
    "outputs": [
@@ -1806,7 +1811,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 48,
+   "execution_count": 47,
    "id": "fdba4c3c",
    "metadata": {},
    "outputs": [
@@ -1843,7 +1848,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 48,
    "id": "52a2bfd0",
    "metadata": {},
    "outputs": [
@@ -1861,7 +1866,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 50,
+   "execution_count": 49,
    "id": "914d23f5",
    "metadata": {},
    "outputs": [
diff --git a/samples/pipeline-to-pipeline.ipynb b/samples/pipeline-to-pipeline.ipynb
new file mode 100644
index 0000000000..b2de7179e7
--- /dev/null
+++ b/samples/pipeline-to-pipeline.ipynb
@@ -0,0 +1,2799 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "lesbian-springer",
+   "metadata": {},
+   "source": [
+    "## Seldon V2 Pipeline to Pipeline Examples\n",
+    "\n",
+    "This notebook illustrates a series of Pipelines that are joined together.\n",
+    "\n",
+    "### Models Used\n",
+    "\n",
+    " * `gs://seldon-models/triton/simple` an example Triton tensorflow model that takes 2 inputs INPUT0 and INPUT1 and adds them to produce OUTPUT0 and also subtracts INPUT1 from INPUT0 to produce OUTPUT1. See [here](https://github.com/triton-inference-server/server/tree/main/docs/examples/model_repository/simple) for the original source code and license.\n",
+    " * Other models can be found at https://github.com/SeldonIO/triton-python-examples"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "running-antarctica",
+   "metadata": {},
+   "source": [
+    "### Pipeline pulling from one other Pipeline\n",
+    "\n",
+    "![pipeline-to-pipeline](img_pipeline1.jpg)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 83,
+   "id": "0f2ab2a3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple1\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple2\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./models/tfsimple1.yaml\n",
+    "!cat ./models/tfsimple2.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 84,
+   "id": "f9e073d7",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model load -f ./models/tfsimple1.yaml \n",
+    "!seldon model load -f ./models/tfsimple2.yaml "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 85,
+   "id": "997b4028",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model status tfsimple1 -w ModelAvailable | jq -M .\n",
+    "!seldon model status tfsimple2 -w ModelAvailable | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 86,
+   "id": "3d017ede",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple\r\n",
+      "spec:\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple1\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple1\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 87,
+   "id": "following-winning",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 88,
+   "id": "artistic-kentucky",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple\",\r\n",
+      "        \"uid\": \"ceevilesc0ns73er67kg\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple1\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple1.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {}\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:16:05.915396256Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 89,
+   "id": "87f10a5c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"model_name\": \"\",\r\n",
+      "  \"outputs\": [\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        2,\r\n",
+      "        4,\r\n",
+      "        6,\r\n",
+      "        8,\r\n",
+      "        10,\r\n",
+      "        12,\r\n",
+      "        14,\r\n",
+      "        16,\r\n",
+      "        18,\r\n",
+      "        20,\r\n",
+      "        22,\r\n",
+      "        24,\r\n",
+      "        26,\r\n",
+      "        28,\r\n",
+      "        30,\r\n",
+      "        32\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT0\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    },\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT1\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 90,
+   "id": "00575d89",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple-extended\r\n",
+      "spec:\r\n",
+      "  input:\r\n",
+      "    externalInputs:\r\n",
+      "      - tfsimple.outputs\r\n",
+      "    tensorMap:\r\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\r\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple2\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple2\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple-extended.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 91,
+   "id": "8fcd8947",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 92,
+   "id": "5a69008c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple-extended\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple-extended\",\r\n",
+      "        \"uid\": \"ceevin6sc0ns73er67l0\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple2\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple2.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {},\r\n",
+      "        \"input\": {\r\n",
+      "          \"externalInputs\": [\r\n",
+      "            \"tfsimple.outputs\"\r\n",
+      "          ],\r\n",
+      "          \"tensorMap\": {\r\n",
+      "            \"tfsimple.outputs.OUTPUT0\": \"INPUT0\",\r\n",
+      "            \"tfsimple.outputs.OUTPUT1\": \"INPUT1\"\r\n",
+      "          }\r\n",
+      "        }\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:16:12.837674035Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple-extended -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 93,
+   "id": "e7e19259",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "\t\"model_name\": \"\",\r\n",
+      "\t\"outputs\": [\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t2,\r\n",
+      "\t\t\t\t4,\r\n",
+      "\t\t\t\t6,\r\n",
+      "\t\t\t\t8,\r\n",
+      "\t\t\t\t10,\r\n",
+      "\t\t\t\t12,\r\n",
+      "\t\t\t\t14,\r\n",
+      "\t\t\t\t16,\r\n",
+      "\t\t\t\t18,\r\n",
+      "\t\t\t\t20,\r\n",
+      "\t\t\t\t22,\r\n",
+      "\t\t\t\t24,\r\n",
+      "\t\t\t\t26,\r\n",
+      "\t\t\t\t28,\r\n",
+      "\t\t\t\t30,\r\n",
+      "\t\t\t\t32\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT0\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t},\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT1\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t}\r\n",
+      "\t]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 96,
+   "id": "7e943b73",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple1.inputs\tceevins7aa7c73d9cfo0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.model.tfsimple1.outputs\tceevins7aa7c73d9cfo0\t{\"modelName\":\"tfsimple1_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.inputs\tceevins7aa7c73d9cfo0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.outputs\tceevins7aa7c73d9cfo0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 97,
+   "id": "46db0594",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceevins7aa7c73d9cfo0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceevins7aa7c73d9cfo0\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.inputs\tceevins7aa7c73d9cfo0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.outputs\tceevins7aa7c73d9cfo0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 98,
+   "id": "dimensional-hours",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline unload tfsimple-extended\n",
+    "!seldon pipeline unload tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 99,
+   "id": "outside-inspiration",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model unload tfsimple1\n",
+    "!seldon model unload tfsimple2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ca596799",
+   "metadata": {},
+   "source": [
+    "### Pipeline pulling from two other Pipelines\n",
+    "\n",
+    "![pipeline-to-pipeline](img_pipeline2.jpg)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 100,
+   "id": "2080d433",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple1\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple2\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./models/tfsimple1.yaml\n",
+    "!cat ./models/tfsimple2.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 101,
+   "id": "bd345e86",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model load -f ./models/tfsimple1.yaml \n",
+    "!seldon model load -f ./models/tfsimple2.yaml "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 102,
+   "id": "5cf517d3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model status tfsimple1 -w ModelAvailable | jq -M .\n",
+    "!seldon model status tfsimple2 -w ModelAvailable | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 103,
+   "id": "61230cb9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple\r\n",
+      "spec:\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple1\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple1\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 104,
+   "id": "3ddcd6c1",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 105,
+   "id": "761c6bbd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple\",\r\n",
+      "        \"uid\": \"ceevj2msc0ns73er67lg\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple1\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple1.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {}\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:16:59.017037835Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 106,
+   "id": "7ac2e813",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"model_name\": \"\",\r\n",
+      "  \"outputs\": [\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        2,\r\n",
+      "        4,\r\n",
+      "        6,\r\n",
+      "        8,\r\n",
+      "        10,\r\n",
+      "        12,\r\n",
+      "        14,\r\n",
+      "        16,\r\n",
+      "        18,\r\n",
+      "        20,\r\n",
+      "        22,\r\n",
+      "        24,\r\n",
+      "        26,\r\n",
+      "        28,\r\n",
+      "        30,\r\n",
+      "        32\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT0\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    },\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT1\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 107,
+   "id": "ae92d1db",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-extended\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n",
+      "---\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-extended2\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n",
+      "---\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-combined\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple-extended.outputs.OUTPUT0\n",
+      "      - tfsimple-extended2.outputs.OUTPUT1\n",
+      "    tensorMap:\n",
+      "      tfsimple-extended.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple-extended2.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple-extended.yaml\n",
+    "!echo \"---\"\n",
+    "!cat ./pipelines/tfsimple-extended2.yaml\n",
+    "!echo \"---\"\n",
+    "!cat ./pipelines/tfsimple-combined.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 108,
+   "id": "0aca3e43",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml\n",
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended2.yaml\n",
+    "!seldon pipeline load -f ./pipelines/tfsimple-combined.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 109,
+   "id": "5a3cfc5d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\"pipelineName\":\"tfsimple-extended\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-extended\", \"uid\":\"ceevj3usc0ns73er67m0\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple.outputs\"], \"tensorMap\":{\"tfsimple.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:17:04.079245812Z\", \"modelsReady\":true}}]}\n",
+      "{\"pipelineName\":\"tfsimple-extended2\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-extended2\", \"uid\":\"ceevj46sc0ns73er67mg\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple.outputs\"], \"tensorMap\":{\"tfsimple.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:17:04.226769422Z\", \"modelsReady\":true}}]}\n",
+      "{\"pipelineName\":\"tfsimple-combined\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-combined\", \"uid\":\"ceevj46sc0ns73er67n0\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple-extended.outputs.OUTPUT0\", \"tfsimple-extended2.outputs.OUTPUT1\"], \"tensorMap\":{\"tfsimple-extended.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple-extended2.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:17:04.466100483Z\", \"modelsReady\":true}}]}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple-extended -w PipelineReady\n",
+    "!seldon pipeline status tfsimple-extended2 -w PipelineReady\n",
+    "!seldon pipeline status tfsimple-combined -w PipelineReady"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 110,
+   "id": "6d48a725",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "\t\"model_name\": \"\",\r\n",
+      "\t\"outputs\": [\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t2,\r\n",
+      "\t\t\t\t4,\r\n",
+      "\t\t\t\t6,\r\n",
+      "\t\t\t\t8,\r\n",
+      "\t\t\t\t10,\r\n",
+      "\t\t\t\t12,\r\n",
+      "\t\t\t\t14,\r\n",
+      "\t\t\t\t16,\r\n",
+      "\t\t\t\t18,\r\n",
+      "\t\t\t\t20,\r\n",
+      "\t\t\t\t22,\r\n",
+      "\t\t\t\t24,\r\n",
+      "\t\t\t\t26,\r\n",
+      "\t\t\t\t28,\r\n",
+      "\t\t\t\t30,\r\n",
+      "\t\t\t\t32\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT0\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t},\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT1\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t}\r\n",
+      "\t]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 111,
+   "id": "2232df0c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple1.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.model.tfsimple1.outputs\tceevj4k7aa7c73d9cfp0\t{\"modelName\":\"tfsimple1_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.outputs\tceevj4k7aa7c73d9cfp0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 112,
+   "id": "b583fc48",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceevj347aa7c73d9cfog\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceepua47aa7c73d9cfj0\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.outputs\tceevj4k7aa7c73d9cfp0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 113,
+   "id": "4da09374",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceeq4ls7aa7c73d9cfk0\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended2.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended2.outputs\tceevj4k7aa7c73d9cfp0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 114,
+   "id": "95fe7d91",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceespfk7aa7c73d9cfmg\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-combined.inputs\tceevj4k7aa7c73d9cfp0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-combined.outputs\tceespfk7aa7c73d9cfmg\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-combined"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 115,
+   "id": "7baed85b",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n",
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline unload tfsimple-extended\n",
+    "!seldon pipeline unload tfsimple-extended2\n",
+    "!seldon pipeline unload tfsimple-combined\n",
+    "!seldon pipeline unload tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 116,
+   "id": "e4e9c31c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model unload tfsimple1\n",
+    "!seldon model unload tfsimple2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6e0ece15",
+   "metadata": {},
+   "source": [
+    "### Pipeline pullin from one pipeline with a trigger to another\n",
+    "\n",
+    "![pipeline-to-pipeline](img_pipeline3.jpg)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 117,
+   "id": "2edfe335",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple1\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple2\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./models/tfsimple1.yaml\n",
+    "!cat ./models/tfsimple2.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 118,
+   "id": "2cb492ce",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model load -f ./models/tfsimple1.yaml \n",
+    "!seldon model load -f ./models/tfsimple2.yaml "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 119,
+   "id": "61177684",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model status tfsimple1 -w ModelAvailable | jq -M .\n",
+    "!seldon model status tfsimple2 -w ModelAvailable | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 120,
+   "id": "2f05e948",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple\r\n",
+      "spec:\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple1\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple1\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 121,
+   "id": "d51beb10",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 122,
+   "id": "754b5288",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple\",\r\n",
+      "        \"uid\": \"ceevja6sc0ns73er67ng\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple1\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple1.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {}\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:17:29.011892538Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 123,
+   "id": "cf723042",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"model_name\": \"\",\r\n",
+      "  \"outputs\": [\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        2,\r\n",
+      "        4,\r\n",
+      "        6,\r\n",
+      "        8,\r\n",
+      "        10,\r\n",
+      "        12,\r\n",
+      "        14,\r\n",
+      "        16,\r\n",
+      "        18,\r\n",
+      "        20,\r\n",
+      "        22,\r\n",
+      "        24,\r\n",
+      "        26,\r\n",
+      "        28,\r\n",
+      "        30,\r\n",
+      "        32\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT0\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    },\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT1\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 124,
+   "id": "54d4d628",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-extended\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n",
+      "---\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-extended2\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n",
+      "---\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-combined-trigger\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple-extended.outputs\n",
+      "    externalTriggers:\n",
+      "      - tfsimple-extended2.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple-extended.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple-extended.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple-extended.yaml\n",
+    "!echo \"---\"\n",
+    "!cat ./pipelines/tfsimple-extended2.yaml\n",
+    "!echo \"---\"\n",
+    "!cat ./pipelines/tfsimple-combined-trigger.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 125,
+   "id": "3d8db4fd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml\n",
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended2.yaml\n",
+    "!seldon pipeline load -f ./pipelines/tfsimple-combined-trigger.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 126,
+   "id": "1bb001e4",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\"pipelineName\":\"tfsimple-extended\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-extended\", \"uid\":\"ceevjbmsc0ns73er67o0\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple.outputs\"], \"tensorMap\":{\"tfsimple.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:17:34.180121811Z\", \"modelsReady\":true}}]}\n",
+      "{\"pipelineName\":\"tfsimple-extended2\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-extended2\", \"uid\":\"ceevjbmsc0ns73er67og\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple.outputs\"], \"tensorMap\":{\"tfsimple.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:17:34.307458250Z\", \"modelsReady\":true}}]}\n",
+      "{\"pipelineName\":\"tfsimple-combined-trigger\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-combined-trigger\", \"uid\":\"ceevjbmsc0ns73er67p0\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple-extended.outputs\"], \"externalTriggers\":[\"tfsimple-extended2.outputs\"], \"tensorMap\":{\"tfsimple-extended.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple-extended.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:17:34.550045739Z\", \"modelsReady\":true}}]}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple-extended -w PipelineReady\n",
+    "!seldon pipeline status tfsimple-extended2 -w PipelineReady\n",
+    "!seldon pipeline status tfsimple-combined-trigger -w PipelineReady"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 127,
+   "id": "dac6c62c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "\t\"model_name\": \"\",\r\n",
+      "\t\"outputs\": [\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t2,\r\n",
+      "\t\t\t\t4,\r\n",
+      "\t\t\t\t6,\r\n",
+      "\t\t\t\t8,\r\n",
+      "\t\t\t\t10,\r\n",
+      "\t\t\t\t12,\r\n",
+      "\t\t\t\t14,\r\n",
+      "\t\t\t\t16,\r\n",
+      "\t\t\t\t18,\r\n",
+      "\t\t\t\t20,\r\n",
+      "\t\t\t\t22,\r\n",
+      "\t\t\t\t24,\r\n",
+      "\t\t\t\t26,\r\n",
+      "\t\t\t\t28,\r\n",
+      "\t\t\t\t30,\r\n",
+      "\t\t\t\t32\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT0\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t},\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT1\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t}\r\n",
+      "\t]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple --header x-request-id=test-id3 \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 128,
+   "id": "965e5f92",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple1.inputs\ttest-id3\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.model.tfsimple1.outputs\ttest-id3\t{\"modelName\":\"tfsimple1_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.inputs\ttest-id3\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.outputs\ttest-id3\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 129,
+   "id": "079b4e27",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceeq4ok7aa7c73d9cfkg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceepua47aa7c73d9cfj0\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.inputs\ttest-id3\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.outputs\ttest-id3\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 130,
+   "id": "233f42f3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceeq4ok7aa7c73d9cfkg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceeq4ok7aa7c73d9cfkg\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended2.inputs\ttest-id3\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended2.outputs\ttest-id3\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 131,
+   "id": "e674c8d5",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceepua47aa7c73d9cfj0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceeq4ls7aa7c73d9cfk0\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-combined-trigger.inputs\ttest-id3\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-combined-trigger.outputs\tceespfk7aa7c73d9cfmg\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-combined-trigger"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 132,
+   "id": "37e1399e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n",
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline unload tfsimple-extended\n",
+    "!seldon pipeline unload tfsimple-extended2\n",
+    "!seldon pipeline unload tfsimple-combined-trigger\n",
+    "!seldon pipeline unload tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 133,
+   "id": "81480753",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model unload tfsimple1\n",
+    "!seldon model unload tfsimple2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c2614d43",
+   "metadata": {},
+   "source": [
+    "### Pipeline pulling from one other Pipeline Step\n",
+    "\n",
+    "![pipeline-to-pipeline](img_pipeline4.jpg)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 134,
+   "id": "d006d9b2",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple1\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple2\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./models/tfsimple1.yaml\n",
+    "!cat ./models/tfsimple2.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 135,
+   "id": "30f4ad48",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model load -f ./models/tfsimple1.yaml \n",
+    "!seldon model load -f ./models/tfsimple2.yaml "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 136,
+   "id": "ae024817",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model status tfsimple1 -w ModelAvailable | jq -M .\n",
+    "!seldon model status tfsimple2 -w ModelAvailable | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 137,
+   "id": "e180a273",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple\r\n",
+      "spec:\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple1\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple1\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 138,
+   "id": "48dde798",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 142,
+   "id": "77ee161a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple\",\r\n",
+      "        \"uid\": \"ceevjh6sc0ns73er67pg\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple1\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple1.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {}\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:17:56.809691365Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 144,
+   "id": "86280675",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"model_name\": \"\",\r\n",
+      "  \"outputs\": [\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        2,\r\n",
+      "        4,\r\n",
+      "        6,\r\n",
+      "        8,\r\n",
+      "        10,\r\n",
+      "        12,\r\n",
+      "        14,\r\n",
+      "        16,\r\n",
+      "        18,\r\n",
+      "        20,\r\n",
+      "        22,\r\n",
+      "        24,\r\n",
+      "        26,\r\n",
+      "        28,\r\n",
+      "        30,\r\n",
+      "        32\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT0\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    },\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT1\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 145,
+   "id": "b06ff6ab",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple-extended-step\r\n",
+      "spec:\r\n",
+      "  input:\r\n",
+      "    externalInputs:\r\n",
+      "      - tfsimple.step.tfsimple1.outputs\r\n",
+      "    tensorMap:\r\n",
+      "      tfsimple.step.tfsimple1.outputs.OUTPUT0: INPUT0\r\n",
+      "      tfsimple.step.tfsimple1.outputs.OUTPUT1: INPUT1\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple2\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple2\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple-extended-step.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 146,
+   "id": "008a1465",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended-step.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 147,
+   "id": "7c5c2065",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple-extended-step\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple-extended-step\",\r\n",
+      "        \"uid\": \"ceevkf6sc0ns73er67q0\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple2\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple2.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {},\r\n",
+      "        \"input\": {\r\n",
+      "          \"externalInputs\": [\r\n",
+      "            \"tfsimple.step.tfsimple1.outputs\"\r\n",
+      "          ],\r\n",
+      "          \"tensorMap\": {\r\n",
+      "            \"tfsimple.step.tfsimple1.outputs.OUTPUT0\": \"INPUT0\",\r\n",
+      "            \"tfsimple.step.tfsimple1.outputs.OUTPUT1\": \"INPUT1\"\r\n",
+      "          }\r\n",
+      "        }\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:19:56.669740116Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple-extended-step -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 148,
+   "id": "0706c855",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "\t\"model_name\": \"\",\r\n",
+      "\t\"outputs\": [\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t2,\r\n",
+      "\t\t\t\t4,\r\n",
+      "\t\t\t\t6,\r\n",
+      "\t\t\t\t8,\r\n",
+      "\t\t\t\t10,\r\n",
+      "\t\t\t\t12,\r\n",
+      "\t\t\t\t14,\r\n",
+      "\t\t\t\t16,\r\n",
+      "\t\t\t\t18,\r\n",
+      "\t\t\t\t20,\r\n",
+      "\t\t\t\t22,\r\n",
+      "\t\t\t\t24,\r\n",
+      "\t\t\t\t26,\r\n",
+      "\t\t\t\t28,\r\n",
+      "\t\t\t\t30,\r\n",
+      "\t\t\t\t32\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT0\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t},\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT1\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t}\r\n",
+      "\t]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 149,
+   "id": "7d03514f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple1.inputs\tceevkfs7aa7c73d9cfs0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\t\tpipeline=[tfsimple]\ttraceparent=[00-01d19de78cff2a815a8f20ba38f7a009-c18e60cf70b2c9fa-01]\tx-forwarded-proto=[http]\tx-envoy-expected-rq-timeout-ms=[60000]\r\n",
+      "seldon.default.model.tfsimple1.outputs\tceevkfs7aa7c73d9cfs0\t{\"modelName\":\"tfsimple1_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\t\tpipeline=[tfsimple]\tx-envoy-upstream-service-time=[0]\tx-seldon-route=[:tfsimple1_1:]\tx-request-id=[ceevkfr9me5c73c9i7jg]\ttraceparent=[00-01d19de78cff2a815a8f20ba38f7a009-cafaccc7a3930447-01]\tx-forwarded-proto=[http]\tx-envoy-expected-rq-timeout-ms=[60000]\r\n",
+      "seldon.default.pipeline.tfsimple.inputs\tceevkfs7aa7c73d9cfs0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\t\tx-forwarded-proto=[http]\tx-envoy-expected-rq-timeout-ms=[60000]\tpipeline=[tfsimple]\ttraceparent=[00-01d19de78cff2a815a8f20ba38f7a009-03db08cfee014b2c-01]\r\n",
+      "seldon.default.pipeline.tfsimple.outputs\tceevkfs7aa7c73d9cfs0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\t\tx-envoy-upstream-service-time=[0]\tx-seldon-route=[:tfsimple1_1:]\tx-request-id=[ceevkfr9me5c73c9i7jg]\tpipeline=[tfsimple]\ttraceparent=[00-01d19de78cff2a815a8f20ba38f7a009-b4a87cbb29038c9c-01]\tx-forwarded-proto=[http]\tx-envoy-expected-rq-timeout-ms=[60000]\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple --verbose"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 150,
+   "id": "36b2133e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceevkfs7aa7c73d9cfs0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceepucc7aa7c73d9cfjg\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended-step.inputs\tceevkfs7aa7c73d9cfs0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended-step.outputs\tceeq5ss7aa7c73d9cfm0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended-step"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 151,
+   "id": "09e5293f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline unload tfsimple-extended-step\n",
+    "!seldon pipeline unload tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 152,
+   "id": "dad54862",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model unload tfsimple1\n",
+    "!seldon model unload tfsimple2"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ec3fbaeb",
+   "metadata": {},
+   "source": [
+    "### Pipeline pulling from two other Pipeline steps from same model\n",
+    "\n",
+    "![pipeline-to-pipeline](img_pipeline5.jpg)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 153,
+   "id": "c5ff042a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple1\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Model\n",
+      "metadata:\n",
+      "  name: tfsimple2\n",
+      "spec:\n",
+      "  storageUri: \"gs://seldon-models/triton/simple\"\n",
+      "  requirements:\n",
+      "  - tensorflow\n",
+      "  memory: 100Ki\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./models/tfsimple1.yaml\n",
+    "!cat ./models/tfsimple2.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 154,
+   "id": "1218d50c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model load -f ./models/tfsimple1.yaml \n",
+    "!seldon model load -f ./models/tfsimple2.yaml "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 155,
+   "id": "c853259a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model status tfsimple1 -w ModelAvailable | jq -M .\n",
+    "!seldon model status tfsimple2 -w ModelAvailable | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 156,
+   "id": "e141244a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\r\n",
+      "kind: Pipeline\r\n",
+      "metadata:\r\n",
+      "  name: tfsimple\r\n",
+      "spec:\r\n",
+      "  steps:\r\n",
+      "    - name: tfsimple1\r\n",
+      "  output:\r\n",
+      "    steps:\r\n",
+      "    - tfsimple1\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 157,
+   "id": "2d4e1f37",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 158,
+   "id": "6adb818a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"pipelineName\": \"tfsimple\",\r\n",
+      "  \"versions\": [\r\n",
+      "    {\r\n",
+      "      \"pipeline\": {\r\n",
+      "        \"name\": \"tfsimple\",\r\n",
+      "        \"uid\": \"ceevkk6sc0ns73er67qg\",\r\n",
+      "        \"version\": 1,\r\n",
+      "        \"steps\": [\r\n",
+      "          {\r\n",
+      "            \"name\": \"tfsimple1\"\r\n",
+      "          }\r\n",
+      "        ],\r\n",
+      "        \"output\": {\r\n",
+      "          \"steps\": [\r\n",
+      "            \"tfsimple1.outputs\"\r\n",
+      "          ]\r\n",
+      "        },\r\n",
+      "        \"kubernetesMeta\": {}\r\n",
+      "      },\r\n",
+      "      \"state\": {\r\n",
+      "        \"pipelineVersion\": 1,\r\n",
+      "        \"status\": \"PipelineReady\",\r\n",
+      "        \"reason\": \"created pipeline\",\r\n",
+      "        \"lastChangeTimestamp\": \"2022-12-17T17:20:16.765278466Z\",\r\n",
+      "        \"modelsReady\": true\r\n",
+      "      }\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple -w PipelineReady| jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 160,
+   "id": "d922d330",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "  \"model_name\": \"\",\r\n",
+      "  \"outputs\": [\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        2,\r\n",
+      "        4,\r\n",
+      "        6,\r\n",
+      "        8,\r\n",
+      "        10,\r\n",
+      "        12,\r\n",
+      "        14,\r\n",
+      "        16,\r\n",
+      "        18,\r\n",
+      "        20,\r\n",
+      "        22,\r\n",
+      "        24,\r\n",
+      "        26,\r\n",
+      "        28,\r\n",
+      "        30,\r\n",
+      "        32\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT0\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    },\r\n",
+      "    {\r\n",
+      "      \"data\": [\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0,\r\n",
+      "        0\r\n",
+      "      ],\r\n",
+      "      \"name\": \"OUTPUT1\",\r\n",
+      "      \"shape\": [\r\n",
+      "        1,\r\n",
+      "        16\r\n",
+      "      ],\r\n",
+      "      \"datatype\": \"INT32\"\r\n",
+      "    }\r\n",
+      "  ]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' | jq -M ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 161,
+   "id": "00f60705",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-extended\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n",
+      "---\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-extended2\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple.outputs\n",
+      "    tensorMap:\n",
+      "      tfsimple.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple.outputs.OUTPUT1: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n",
+      "---\n",
+      "apiVersion: mlops.seldon.io/v1alpha1\n",
+      "kind: Pipeline\n",
+      "metadata:\n",
+      "  name: tfsimple-combined-step\n",
+      "spec:\n",
+      "  input:\n",
+      "    externalInputs:\n",
+      "      - tfsimple-extended.step.tfsimple2.outputs.OUTPUT0\n",
+      "      - tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0\n",
+      "    tensorMap:\n",
+      "      tfsimple-extended.step.tfsimple2.outputs.OUTPUT0: INPUT0\n",
+      "      tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0: INPUT1\n",
+      "  steps:\n",
+      "    - name: tfsimple2\n",
+      "  output:\n",
+      "    steps:\n",
+      "    - tfsimple2\n"
+     ]
+    }
+   ],
+   "source": [
+    "!cat ./pipelines/tfsimple-extended.yaml\n",
+    "!echo \"---\"\n",
+    "!cat ./pipelines/tfsimple-extended2.yaml\n",
+    "!echo \"---\"\n",
+    "!cat ./pipelines/tfsimple-combined-step.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 162,
+   "id": "ff620079",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml\n",
+    "!seldon pipeline load -f ./pipelines/tfsimple-extended2.yaml\n",
+    "!seldon pipeline load -f ./pipelines/tfsimple-combined-step.yaml"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 163,
+   "id": "a9a381a1",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\"pipelineName\":\"tfsimple-extended\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-extended\", \"uid\":\"ceevl7esc0ns73er67r0\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple.outputs\"], \"tensorMap\":{\"tfsimple.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:21:33.538468063Z\", \"modelsReady\":true}}]}\n",
+      "{\"pipelineName\":\"tfsimple-extended2\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-extended2\", \"uid\":\"ceevl7esc0ns73er67rg\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple.outputs\"], \"tensorMap\":{\"tfsimple.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple.outputs.OUTPUT1\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:21:33.681257781Z\", \"modelsReady\":true}}]}\n",
+      "{\"pipelineName\":\"tfsimple-combined-step\", \"versions\":[{\"pipeline\":{\"name\":\"tfsimple-combined-step\", \"uid\":\"ceevl7esc0ns73er67s0\", \"version\":1, \"steps\":[{\"name\":\"tfsimple2\"}], \"output\":{\"steps\":[\"tfsimple2.outputs\"]}, \"kubernetesMeta\":{}, \"input\":{\"externalInputs\":[\"tfsimple-extended.step.tfsimple2.outputs.OUTPUT0\", \"tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0\"], \"tensorMap\":{\"tfsimple-extended.step.tfsimple2.outputs.OUTPUT0\":\"INPUT0\", \"tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0\":\"INPUT1\"}}}, \"state\":{\"pipelineVersion\":1, \"status\":\"PipelineReady\", \"reason\":\"created pipeline\", \"lastChangeTimestamp\":\"2022-12-17T17:21:33.911798115Z\", \"modelsReady\":true}}]}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline status tfsimple-extended -w PipelineReady\n",
+    "!seldon pipeline status tfsimple-extended2 -w PipelineReady\n",
+    "!seldon pipeline status tfsimple-combined-step -w PipelineReady"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 164,
+   "id": "b65a28de",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\r\n",
+      "\t\"model_name\": \"\",\r\n",
+      "\t\"outputs\": [\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t2,\r\n",
+      "\t\t\t\t4,\r\n",
+      "\t\t\t\t6,\r\n",
+      "\t\t\t\t8,\r\n",
+      "\t\t\t\t10,\r\n",
+      "\t\t\t\t12,\r\n",
+      "\t\t\t\t14,\r\n",
+      "\t\t\t\t16,\r\n",
+      "\t\t\t\t18,\r\n",
+      "\t\t\t\t20,\r\n",
+      "\t\t\t\t22,\r\n",
+      "\t\t\t\t24,\r\n",
+      "\t\t\t\t26,\r\n",
+      "\t\t\t\t28,\r\n",
+      "\t\t\t\t30,\r\n",
+      "\t\t\t\t32\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT0\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t},\r\n",
+      "\t\t{\r\n",
+      "\t\t\t\"data\": [\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0,\r\n",
+      "\t\t\t\t0\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"name\": \"OUTPUT1\",\r\n",
+      "\t\t\t\"shape\": [\r\n",
+      "\t\t\t\t1,\r\n",
+      "\t\t\t\t16\r\n",
+      "\t\t\t],\r\n",
+      "\t\t\t\"datatype\": \"INT32\"\r\n",
+      "\t\t}\r\n",
+      "\t]\r\n",
+      "}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline infer tfsimple \\\n",
+    "    '{\"inputs\":[{\"name\":\"INPUT0\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 165,
+   "id": "bc1ad2dd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple1.inputs\tceevl847aa7c73d9cftg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.model.tfsimple1.outputs\tceevl847aa7c73d9cftg\t{\"modelName\":\"tfsimple1_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.inputs\tceevl847aa7c73d9cftg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple.outputs\tceevl847aa7c73d9cftg\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 166,
+   "id": "2eb548ac",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\ttest-id3\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceepucc7aa7c73d9cfjg\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.inputs\tceevl847aa7c73d9cftg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended.outputs\tceevl847aa7c73d9cftg\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 167,
+   "id": "108e2c24",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceepua47aa7c73d9cfj0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceepucc7aa7c73d9cfjg\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended2.inputs\tceevl847aa7c73d9cftg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-extended2.outputs\tceevl847aa7c73d9cftg\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-extended2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 168,
+   "id": "239a6b9d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "seldon.default.model.tfsimple2.inputs\tceeq4ls7aa7c73d9cfk0\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.model.tfsimple2.outputs\tceepucc7aa7c73d9cfjg\t{\"modelName\":\"tfsimple2_1\", \"modelVersion\":\"1\", \"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n",
+      "seldon.default.pipeline.tfsimple-combined-step.inputs\tceevl847aa7c73d9cftg\t{\"inputs\":[{\"name\":\"INPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {\"name\":\"INPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], \"rawInputContents\":[\"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\", \"AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==\"]}\r\n",
+      "seldon.default.pipeline.tfsimple-combined-step.outputs\tceepua47aa7c73d9cfj0\t{\"outputs\":[{\"name\":\"OUTPUT0\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {\"name\":\"OUTPUT1\", \"datatype\":\"INT32\", \"shape\":[\"1\", \"16\"], \"contents\":{\"intContents\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline inspect tfsimple-combined-step"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 169,
+   "id": "840af9e6",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n",
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon pipeline unload tfsimple-extended\n",
+    "!seldon pipeline unload tfsimple-extended2\n",
+    "!seldon pipeline unload tfsimple-combined-step\n",
+    "!seldon pipeline unload tfsimple"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 170,
+   "id": "3f2584b3",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{}\n",
+      "{}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!seldon model unload tfsimple1\n",
+    "!seldon model unload tfsimple2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "503c0778",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.13"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/samples/pipeline-to-pipeline.md b/samples/pipeline-to-pipeline.md
new file mode 100644
index 0000000000..c9f34ae6a4
--- /dev/null
+++ b/samples/pipeline-to-pipeline.md
@@ -0,0 +1,1929 @@
+## Seldon V2 Pipeline to Pipeline Examples
+
+This notebook illustrates a series of Pipelines that are joined together.
+
+### Models Used
+
+ * `gs://seldon-models/triton/simple` an example Triton tensorflow model that takes 2 inputs INPUT0 and INPUT1 and adds them to produce OUTPUT0 and also subtracts INPUT1 from INPUT0 to produce OUTPUT1. See [here](https://github.com/triton-inference-server/server/tree/main/docs/examples/model_repository/simple) for the original source code and license.
+ * Other models can be found at https://github.com/SeldonIO/triton-python-examples
+
+### Pipeline pulling from one other Pipeline
+
+![pipeline-to-pipeline](img_pipeline1.jpg)
+
+
+
+```python
+!cat ./models/tfsimple1.yaml
+!cat ./models/tfsimple2.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple1
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple2
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+
+
+
+```python
+!seldon model load -f ./models/tfsimple1.yaml 
+!seldon model load -f ./models/tfsimple2.yaml 
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model status tfsimple1 -w ModelAvailable | jq -M .
+!seldon model status tfsimple2 -w ModelAvailable | jq -M .
+```
+
+    {}
+    {}
+
+
+
+```python
+!cat ./pipelines/tfsimple.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple
+    spec:
+      steps:
+        - name: tfsimple1
+      output:
+        steps:
+        - tfsimple1
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple",
+            "uid": "ceevilesc0ns73er67kg",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple1"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple1.outputs"
+              ]
+            },
+            "kubernetesMeta": {}
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:16:05.915396256Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' | jq -M .
+```
+
+    {
+      "model_name": "",
+      "outputs": [
+        {
+          "data": [
+            2,
+            4,
+            6,
+            8,
+            10,
+            12,
+            14,
+            16,
+            18,
+            20,
+            22,
+            24,
+            26,
+            28,
+            30,
+            32
+          ],
+          "name": "OUTPUT0",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        },
+        {
+          "data": [
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0
+          ],
+          "name": "OUTPUT1",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        }
+      ]
+    }
+
+
+
+```python
+!cat ./pipelines/tfsimple-extended.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple-extended -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple-extended",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple-extended",
+            "uid": "ceevin6sc0ns73er67l0",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple2"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple2.outputs"
+              ]
+            },
+            "kubernetesMeta": {},
+            "input": {
+              "externalInputs": [
+                "tfsimple.outputs"
+              ],
+              "tensorMap": {
+                "tfsimple.outputs.OUTPUT0": "INPUT0",
+                "tfsimple.outputs.OUTPUT1": "INPUT1"
+              }
+            }
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:16:12.837674035Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' 
+```
+
+    {
+    	"model_name": "",
+    	"outputs": [
+    		{
+    			"data": [
+    				2,
+    				4,
+    				6,
+    				8,
+    				10,
+    				12,
+    				14,
+    				16,
+    				18,
+    				20,
+    				22,
+    				24,
+    				26,
+    				28,
+    				30,
+    				32
+    			],
+    			"name": "OUTPUT0",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		},
+    		{
+    			"data": [
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0
+    			],
+    			"name": "OUTPUT1",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		}
+    	]
+    }
+
+
+
+```python
+!seldon pipeline inspect tfsimple
+```
+
+    seldon.default.model.tfsimple1.inputs	ceevins7aa7c73d9cfo0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.model.tfsimple1.outputs	ceevins7aa7c73d9cfo0	{"modelName":"tfsimple1_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple.inputs	ceevins7aa7c73d9cfo0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.pipeline.tfsimple.outputs	ceevins7aa7c73d9cfo0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended
+```
+
+    seldon.default.model.tfsimple2.inputs	ceevins7aa7c73d9cfo0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceevins7aa7c73d9cfo0	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+    seldon.default.pipeline.tfsimple-extended.inputs	ceevins7aa7c73d9cfo0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended.outputs	ceevins7aa7c73d9cfo0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline unload tfsimple-extended
+!seldon pipeline unload tfsimple
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model unload tfsimple1
+!seldon model unload tfsimple2
+```
+
+    {}
+    {}
+
+
+### Pipeline pulling from two other Pipelines
+
+![pipeline-to-pipeline](img_pipeline2.jpg)
+
+
+
+```python
+!cat ./models/tfsimple1.yaml
+!cat ./models/tfsimple2.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple1
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple2
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+
+
+
+```python
+!seldon model load -f ./models/tfsimple1.yaml 
+!seldon model load -f ./models/tfsimple2.yaml 
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model status tfsimple1 -w ModelAvailable | jq -M .
+!seldon model status tfsimple2 -w ModelAvailable | jq -M .
+```
+
+    {}
+    {}
+
+
+
+```python
+!cat ./pipelines/tfsimple.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple
+    spec:
+      steps:
+        - name: tfsimple1
+      output:
+        steps:
+        - tfsimple1
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple",
+            "uid": "ceevj2msc0ns73er67lg",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple1"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple1.outputs"
+              ]
+            },
+            "kubernetesMeta": {}
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:16:59.017037835Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' | jq -M .
+```
+
+    {
+      "model_name": "",
+      "outputs": [
+        {
+          "data": [
+            2,
+            4,
+            6,
+            8,
+            10,
+            12,
+            14,
+            16,
+            18,
+            20,
+            22,
+            24,
+            26,
+            28,
+            30,
+            32
+          ],
+          "name": "OUTPUT0",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        },
+        {
+          "data": [
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0
+          ],
+          "name": "OUTPUT1",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        }
+      ]
+    }
+
+
+
+```python
+!cat ./pipelines/tfsimple-extended.yaml
+!echo "---"
+!cat ./pipelines/tfsimple-extended2.yaml
+!echo "---"
+!cat ./pipelines/tfsimple-combined.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+    ---
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended2
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+    ---
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-combined
+    spec:
+      input:
+        externalInputs:
+          - tfsimple-extended.outputs.OUTPUT0
+          - tfsimple-extended2.outputs.OUTPUT1
+        tensorMap:
+          tfsimple-extended.outputs.OUTPUT0: INPUT0
+          tfsimple-extended2.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml
+!seldon pipeline load -f ./pipelines/tfsimple-extended2.yaml
+!seldon pipeline load -f ./pipelines/tfsimple-combined.yaml
+```
+
+    {}
+    {}
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple-extended -w PipelineReady
+!seldon pipeline status tfsimple-extended2 -w PipelineReady
+!seldon pipeline status tfsimple-combined -w PipelineReady
+```
+
+    {"pipelineName":"tfsimple-extended", "versions":[{"pipeline":{"name":"tfsimple-extended", "uid":"ceevj3usc0ns73er67m0", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple.outputs"], "tensorMap":{"tfsimple.outputs.OUTPUT0":"INPUT0", "tfsimple.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:17:04.079245812Z", "modelsReady":true}}]}
+    {"pipelineName":"tfsimple-extended2", "versions":[{"pipeline":{"name":"tfsimple-extended2", "uid":"ceevj46sc0ns73er67mg", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple.outputs"], "tensorMap":{"tfsimple.outputs.OUTPUT0":"INPUT0", "tfsimple.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:17:04.226769422Z", "modelsReady":true}}]}
+    {"pipelineName":"tfsimple-combined", "versions":[{"pipeline":{"name":"tfsimple-combined", "uid":"ceevj46sc0ns73er67n0", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple-extended.outputs.OUTPUT0", "tfsimple-extended2.outputs.OUTPUT1"], "tensorMap":{"tfsimple-extended.outputs.OUTPUT0":"INPUT0", "tfsimple-extended2.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:17:04.466100483Z", "modelsReady":true}}]}
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' 
+```
+
+    {
+    	"model_name": "",
+    	"outputs": [
+    		{
+    			"data": [
+    				2,
+    				4,
+    				6,
+    				8,
+    				10,
+    				12,
+    				14,
+    				16,
+    				18,
+    				20,
+    				22,
+    				24,
+    				26,
+    				28,
+    				30,
+    				32
+    			],
+    			"name": "OUTPUT0",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		},
+    		{
+    			"data": [
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0
+    			],
+    			"name": "OUTPUT1",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		}
+    	]
+    }
+
+
+
+```python
+!seldon pipeline inspect tfsimple
+```
+
+    seldon.default.model.tfsimple1.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.model.tfsimple1.outputs	ceevj4k7aa7c73d9cfp0	{"modelName":"tfsimple1_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.pipeline.tfsimple.outputs	ceevj4k7aa7c73d9cfp0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended
+```
+
+    seldon.default.model.tfsimple2.inputs	ceevj347aa7c73d9cfog	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceepua47aa7c73d9cfj0	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended.outputs	ceevj4k7aa7c73d9cfp0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended2
+```
+
+    seldon.default.model.tfsimple2.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceeq4ls7aa7c73d9cfk0	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended2.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended2.outputs	ceevj4k7aa7c73d9cfp0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-combined
+```
+
+    seldon.default.model.tfsimple2.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceespfk7aa7c73d9cfmg	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-combined.inputs	ceevj4k7aa7c73d9cfp0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.pipeline.tfsimple-combined.outputs	ceespfk7aa7c73d9cfmg	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline unload tfsimple-extended
+!seldon pipeline unload tfsimple-extended2
+!seldon pipeline unload tfsimple-combined
+!seldon pipeline unload tfsimple
+```
+
+    {}
+    {}
+    {}
+    {}
+
+
+
+```python
+!seldon model unload tfsimple1
+!seldon model unload tfsimple2
+```
+
+    {}
+    {}
+
+
+### Pipeline pullin from one pipeline with a trigger to another
+
+![pipeline-to-pipeline](img_pipeline3.jpg)
+
+
+
+```python
+!cat ./models/tfsimple1.yaml
+!cat ./models/tfsimple2.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple1
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple2
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+
+
+
+```python
+!seldon model load -f ./models/tfsimple1.yaml 
+!seldon model load -f ./models/tfsimple2.yaml 
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model status tfsimple1 -w ModelAvailable | jq -M .
+!seldon model status tfsimple2 -w ModelAvailable | jq -M .
+```
+
+    {}
+    {}
+
+
+
+```python
+!cat ./pipelines/tfsimple.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple
+    spec:
+      steps:
+        - name: tfsimple1
+      output:
+        steps:
+        - tfsimple1
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple",
+            "uid": "ceevja6sc0ns73er67ng",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple1"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple1.outputs"
+              ]
+            },
+            "kubernetesMeta": {}
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:17:29.011892538Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' | jq -M .
+```
+
+    {
+      "model_name": "",
+      "outputs": [
+        {
+          "data": [
+            2,
+            4,
+            6,
+            8,
+            10,
+            12,
+            14,
+            16,
+            18,
+            20,
+            22,
+            24,
+            26,
+            28,
+            30,
+            32
+          ],
+          "name": "OUTPUT0",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        },
+        {
+          "data": [
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0
+          ],
+          "name": "OUTPUT1",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        }
+      ]
+    }
+
+
+
+```python
+!cat ./pipelines/tfsimple-extended.yaml
+!echo "---"
+!cat ./pipelines/tfsimple-extended2.yaml
+!echo "---"
+!cat ./pipelines/tfsimple-combined-trigger.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+    ---
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended2
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+    ---
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-combined-trigger
+    spec:
+      input:
+        externalInputs:
+          - tfsimple-extended.outputs
+        externalTriggers:
+          - tfsimple-extended2.outputs
+        tensorMap:
+          tfsimple-extended.outputs.OUTPUT0: INPUT0
+          tfsimple-extended.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml
+!seldon pipeline load -f ./pipelines/tfsimple-extended2.yaml
+!seldon pipeline load -f ./pipelines/tfsimple-combined-trigger.yaml
+```
+
+    {}
+    {}
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple-extended -w PipelineReady
+!seldon pipeline status tfsimple-extended2 -w PipelineReady
+!seldon pipeline status tfsimple-combined-trigger -w PipelineReady
+```
+
+    {"pipelineName":"tfsimple-extended", "versions":[{"pipeline":{"name":"tfsimple-extended", "uid":"ceevjbmsc0ns73er67o0", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple.outputs"], "tensorMap":{"tfsimple.outputs.OUTPUT0":"INPUT0", "tfsimple.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:17:34.180121811Z", "modelsReady":true}}]}
+    {"pipelineName":"tfsimple-extended2", "versions":[{"pipeline":{"name":"tfsimple-extended2", "uid":"ceevjbmsc0ns73er67og", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple.outputs"], "tensorMap":{"tfsimple.outputs.OUTPUT0":"INPUT0", "tfsimple.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:17:34.307458250Z", "modelsReady":true}}]}
+    {"pipelineName":"tfsimple-combined-trigger", "versions":[{"pipeline":{"name":"tfsimple-combined-trigger", "uid":"ceevjbmsc0ns73er67p0", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple-extended.outputs"], "externalTriggers":["tfsimple-extended2.outputs"], "tensorMap":{"tfsimple-extended.outputs.OUTPUT0":"INPUT0", "tfsimple-extended.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:17:34.550045739Z", "modelsReady":true}}]}
+
+
+
+```python
+!seldon pipeline infer tfsimple --header x-request-id=test-id3 \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' 
+```
+
+    {
+    	"model_name": "",
+    	"outputs": [
+    		{
+    			"data": [
+    				2,
+    				4,
+    				6,
+    				8,
+    				10,
+    				12,
+    				14,
+    				16,
+    				18,
+    				20,
+    				22,
+    				24,
+    				26,
+    				28,
+    				30,
+    				32
+    			],
+    			"name": "OUTPUT0",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		},
+    		{
+    			"data": [
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0
+    			],
+    			"name": "OUTPUT1",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		}
+    	]
+    }
+
+
+
+```python
+!seldon pipeline inspect tfsimple
+```
+
+    seldon.default.model.tfsimple1.inputs	test-id3	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.model.tfsimple1.outputs	test-id3	{"modelName":"tfsimple1_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple.inputs	test-id3	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.pipeline.tfsimple.outputs	test-id3	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended
+```
+
+    seldon.default.model.tfsimple2.inputs	ceeq4ok7aa7c73d9cfkg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceepua47aa7c73d9cfj0	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended.inputs	test-id3	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended.outputs	test-id3	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended2
+```
+
+    seldon.default.model.tfsimple2.inputs	ceeq4ok7aa7c73d9cfkg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceeq4ok7aa7c73d9cfkg	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended2.inputs	test-id3	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended2.outputs	test-id3	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-combined-trigger
+```
+
+    seldon.default.model.tfsimple2.inputs	ceepua47aa7c73d9cfj0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceeq4ls7aa7c73d9cfk0	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-combined-trigger.inputs	test-id3	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.pipeline.tfsimple-combined-trigger.outputs	ceespfk7aa7c73d9cfmg	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline unload tfsimple-extended
+!seldon pipeline unload tfsimple-extended2
+!seldon pipeline unload tfsimple-combined-trigger
+!seldon pipeline unload tfsimple
+```
+
+    {}
+    {}
+    {}
+    {}
+
+
+
+```python
+!seldon model unload tfsimple1
+!seldon model unload tfsimple2
+```
+
+    {}
+    {}
+
+
+### Pipeline pulling from one other Pipeline Step
+
+![pipeline-to-pipeline](img_pipeline4.jpg)
+
+
+
+```python
+!cat ./models/tfsimple1.yaml
+!cat ./models/tfsimple2.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple1
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple2
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+
+
+
+```python
+!seldon model load -f ./models/tfsimple1.yaml 
+!seldon model load -f ./models/tfsimple2.yaml 
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model status tfsimple1 -w ModelAvailable | jq -M .
+!seldon model status tfsimple2 -w ModelAvailable | jq -M .
+```
+
+    {}
+    {}
+
+
+
+```python
+!cat ./pipelines/tfsimple.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple
+    spec:
+      steps:
+        - name: tfsimple1
+      output:
+        steps:
+        - tfsimple1
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple",
+            "uid": "ceevjh6sc0ns73er67pg",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple1"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple1.outputs"
+              ]
+            },
+            "kubernetesMeta": {}
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:17:56.809691365Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' | jq -M .
+```
+
+    {
+      "model_name": "",
+      "outputs": [
+        {
+          "data": [
+            2,
+            4,
+            6,
+            8,
+            10,
+            12,
+            14,
+            16,
+            18,
+            20,
+            22,
+            24,
+            26,
+            28,
+            30,
+            32
+          ],
+          "name": "OUTPUT0",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        },
+        {
+          "data": [
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0
+          ],
+          "name": "OUTPUT1",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        }
+      ]
+    }
+
+
+
+```python
+!cat ./pipelines/tfsimple-extended-step.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended-step
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.step.tfsimple1.outputs
+        tensorMap:
+          tfsimple.step.tfsimple1.outputs.OUTPUT0: INPUT0
+          tfsimple.step.tfsimple1.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple-extended-step.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple-extended-step -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple-extended-step",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple-extended-step",
+            "uid": "ceevkf6sc0ns73er67q0",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple2"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple2.outputs"
+              ]
+            },
+            "kubernetesMeta": {},
+            "input": {
+              "externalInputs": [
+                "tfsimple.step.tfsimple1.outputs"
+              ],
+              "tensorMap": {
+                "tfsimple.step.tfsimple1.outputs.OUTPUT0": "INPUT0",
+                "tfsimple.step.tfsimple1.outputs.OUTPUT1": "INPUT1"
+              }
+            }
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:19:56.669740116Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' 
+```
+
+    {
+    	"model_name": "",
+    	"outputs": [
+    		{
+    			"data": [
+    				2,
+    				4,
+    				6,
+    				8,
+    				10,
+    				12,
+    				14,
+    				16,
+    				18,
+    				20,
+    				22,
+    				24,
+    				26,
+    				28,
+    				30,
+    				32
+    			],
+    			"name": "OUTPUT0",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		},
+    		{
+    			"data": [
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0
+    			],
+    			"name": "OUTPUT1",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		}
+    	]
+    }
+
+
+
+```python
+!seldon pipeline inspect tfsimple --verbose
+```
+
+    seldon.default.model.tfsimple1.inputs	ceevkfs7aa7c73d9cfs0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}		pipeline=[tfsimple]	traceparent=[00-01d19de78cff2a815a8f20ba38f7a009-c18e60cf70b2c9fa-01]	x-forwarded-proto=[http]	x-envoy-expected-rq-timeout-ms=[60000]
+    seldon.default.model.tfsimple1.outputs	ceevkfs7aa7c73d9cfs0	{"modelName":"tfsimple1_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}		pipeline=[tfsimple]	x-envoy-upstream-service-time=[0]	x-seldon-route=[:tfsimple1_1:]	x-request-id=[ceevkfr9me5c73c9i7jg]	traceparent=[00-01d19de78cff2a815a8f20ba38f7a009-cafaccc7a3930447-01]	x-forwarded-proto=[http]	x-envoy-expected-rq-timeout-ms=[60000]
+    seldon.default.pipeline.tfsimple.inputs	ceevkfs7aa7c73d9cfs0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}		x-forwarded-proto=[http]	x-envoy-expected-rq-timeout-ms=[60000]	pipeline=[tfsimple]	traceparent=[00-01d19de78cff2a815a8f20ba38f7a009-03db08cfee014b2c-01]
+    seldon.default.pipeline.tfsimple.outputs	ceevkfs7aa7c73d9cfs0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}		x-envoy-upstream-service-time=[0]	x-seldon-route=[:tfsimple1_1:]	x-request-id=[ceevkfr9me5c73c9i7jg]	pipeline=[tfsimple]	traceparent=[00-01d19de78cff2a815a8f20ba38f7a009-b4a87cbb29038c9c-01]	x-forwarded-proto=[http]	x-envoy-expected-rq-timeout-ms=[60000]
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended-step
+```
+
+    seldon.default.model.tfsimple2.inputs	ceevkfs7aa7c73d9cfs0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceepucc7aa7c73d9cfjg	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended-step.inputs	ceevkfs7aa7c73d9cfs0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended-step.outputs	ceeq5ss7aa7c73d9cfm0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline unload tfsimple-extended-step
+!seldon pipeline unload tfsimple
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model unload tfsimple1
+!seldon model unload tfsimple2
+```
+
+    {}
+    {}
+
+
+### Pipeline pulling from two other Pipeline steps from same model
+
+![pipeline-to-pipeline](img_pipeline5.jpg)
+
+
+
+```python
+!cat ./models/tfsimple1.yaml
+!cat ./models/tfsimple2.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple1
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Model
+    metadata:
+      name: tfsimple2
+    spec:
+      storageUri: "gs://seldon-models/triton/simple"
+      requirements:
+      - tensorflow
+      memory: 100Ki
+
+
+
+```python
+!seldon model load -f ./models/tfsimple1.yaml 
+!seldon model load -f ./models/tfsimple2.yaml 
+```
+
+    {}
+    {}
+
+
+
+```python
+!seldon model status tfsimple1 -w ModelAvailable | jq -M .
+!seldon model status tfsimple2 -w ModelAvailable | jq -M .
+```
+
+    {}
+    {}
+
+
+
+```python
+!cat ./pipelines/tfsimple.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple
+    spec:
+      steps:
+        - name: tfsimple1
+      output:
+        steps:
+        - tfsimple1
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple.yaml
+```
+
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple -w PipelineReady| jq -M .
+```
+
+    {
+      "pipelineName": "tfsimple",
+      "versions": [
+        {
+          "pipeline": {
+            "name": "tfsimple",
+            "uid": "ceevkk6sc0ns73er67qg",
+            "version": 1,
+            "steps": [
+              {
+                "name": "tfsimple1"
+              }
+            ],
+            "output": {
+              "steps": [
+                "tfsimple1.outputs"
+              ]
+            },
+            "kubernetesMeta": {}
+          },
+          "state": {
+            "pipelineVersion": 1,
+            "status": "PipelineReady",
+            "reason": "created pipeline",
+            "lastChangeTimestamp": "2022-12-17T17:20:16.765278466Z",
+            "modelsReady": true
+          }
+        }
+      ]
+    }
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' | jq -M .
+```
+
+    {
+      "model_name": "",
+      "outputs": [
+        {
+          "data": [
+            2,
+            4,
+            6,
+            8,
+            10,
+            12,
+            14,
+            16,
+            18,
+            20,
+            22,
+            24,
+            26,
+            28,
+            30,
+            32
+          ],
+          "name": "OUTPUT0",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        },
+        {
+          "data": [
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0,
+            0
+          ],
+          "name": "OUTPUT1",
+          "shape": [
+            1,
+            16
+          ],
+          "datatype": "INT32"
+        }
+      ]
+    }
+
+
+
+```python
+!cat ./pipelines/tfsimple-extended.yaml
+!echo "---"
+!cat ./pipelines/tfsimple-extended2.yaml
+!echo "---"
+!cat ./pipelines/tfsimple-combined-step.yaml
+```
+
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+    ---
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-extended2
+    spec:
+      input:
+        externalInputs:
+          - tfsimple.outputs
+        tensorMap:
+          tfsimple.outputs.OUTPUT0: INPUT0
+          tfsimple.outputs.OUTPUT1: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+    ---
+    apiVersion: mlops.seldon.io/v1alpha1
+    kind: Pipeline
+    metadata:
+      name: tfsimple-combined-step
+    spec:
+      input:
+        externalInputs:
+          - tfsimple-extended.step.tfsimple2.outputs.OUTPUT0
+          - tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0
+        tensorMap:
+          tfsimple-extended.step.tfsimple2.outputs.OUTPUT0: INPUT0
+          tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0: INPUT1
+      steps:
+        - name: tfsimple2
+      output:
+        steps:
+        - tfsimple2
+
+
+
+```python
+!seldon pipeline load -f ./pipelines/tfsimple-extended.yaml
+!seldon pipeline load -f ./pipelines/tfsimple-extended2.yaml
+!seldon pipeline load -f ./pipelines/tfsimple-combined-step.yaml
+```
+
+    {}
+    {}
+    {}
+
+
+
+```python
+!seldon pipeline status tfsimple-extended -w PipelineReady
+!seldon pipeline status tfsimple-extended2 -w PipelineReady
+!seldon pipeline status tfsimple-combined-step -w PipelineReady
+```
+
+    {"pipelineName":"tfsimple-extended", "versions":[{"pipeline":{"name":"tfsimple-extended", "uid":"ceevl7esc0ns73er67r0", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple.outputs"], "tensorMap":{"tfsimple.outputs.OUTPUT0":"INPUT0", "tfsimple.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:21:33.538468063Z", "modelsReady":true}}]}
+    {"pipelineName":"tfsimple-extended2", "versions":[{"pipeline":{"name":"tfsimple-extended2", "uid":"ceevl7esc0ns73er67rg", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple.outputs"], "tensorMap":{"tfsimple.outputs.OUTPUT0":"INPUT0", "tfsimple.outputs.OUTPUT1":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:21:33.681257781Z", "modelsReady":true}}]}
+    {"pipelineName":"tfsimple-combined-step", "versions":[{"pipeline":{"name":"tfsimple-combined-step", "uid":"ceevl7esc0ns73er67s0", "version":1, "steps":[{"name":"tfsimple2"}], "output":{"steps":["tfsimple2.outputs"]}, "kubernetesMeta":{}, "input":{"externalInputs":["tfsimple-extended.step.tfsimple2.outputs.OUTPUT0", "tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0"], "tensorMap":{"tfsimple-extended.step.tfsimple2.outputs.OUTPUT0":"INPUT0", "tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0":"INPUT1"}}}, "state":{"pipelineVersion":1, "status":"PipelineReady", "reason":"created pipeline", "lastChangeTimestamp":"2022-12-17T17:21:33.911798115Z", "modelsReady":true}}]}
+
+
+
+```python
+!seldon pipeline infer tfsimple \
+    '{"inputs":[{"name":"INPUT0","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]},{"name":"INPUT1","data":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"datatype":"INT32","shape":[1,16]}]}' 
+```
+
+    {
+    	"model_name": "",
+    	"outputs": [
+    		{
+    			"data": [
+    				2,
+    				4,
+    				6,
+    				8,
+    				10,
+    				12,
+    				14,
+    				16,
+    				18,
+    				20,
+    				22,
+    				24,
+    				26,
+    				28,
+    				30,
+    				32
+    			],
+    			"name": "OUTPUT0",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		},
+    		{
+    			"data": [
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0,
+    				0
+    			],
+    			"name": "OUTPUT1",
+    			"shape": [
+    				1,
+    				16
+    			],
+    			"datatype": "INT32"
+    		}
+    	]
+    }
+
+
+
+```python
+!seldon pipeline inspect tfsimple
+```
+
+    seldon.default.model.tfsimple1.inputs	ceevl847aa7c73d9cftg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.model.tfsimple1.outputs	ceevl847aa7c73d9cftg	{"modelName":"tfsimple1_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple.inputs	ceevl847aa7c73d9cftg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}}]}
+    seldon.default.pipeline.tfsimple.outputs	ceevl847aa7c73d9cftg	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended
+```
+
+    seldon.default.model.tfsimple2.inputs	test-id3	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceepucc7aa7c73d9cfjg	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended.inputs	ceevl847aa7c73d9cftg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended.outputs	ceevl847aa7c73d9cftg	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-extended2
+```
+
+    seldon.default.model.tfsimple2.inputs	ceepua47aa7c73d9cfj0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceepucc7aa7c73d9cfjg	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-extended2.inputs	ceevl847aa7c73d9cftg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="]}
+    seldon.default.pipeline.tfsimple-extended2.outputs	ceevl847aa7c73d9cftg	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}]}
+
+
+
+```python
+!seldon pipeline inspect tfsimple-combined-step
+```
+
+    seldon.default.model.tfsimple2.inputs	ceeq4ls7aa7c73d9cfk0	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.model.tfsimple2.outputs	ceepucc7aa7c73d9cfjg	{"modelName":"tfsimple2_1", "modelVersion":"1", "outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+    seldon.default.pipeline.tfsimple-combined-step.inputs	ceevl847aa7c73d9cftg	{"inputs":[{"name":"INPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}, {"name":"INPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32]}}], "rawInputContents":["AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA==", "AgAAAAQAAAAGAAAACAAAAAoAAAAMAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAAA=="]}
+    seldon.default.pipeline.tfsimple-combined-step.outputs	ceepua47aa7c73d9cfj0	{"outputs":[{"name":"OUTPUT0", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64]}}, {"name":"OUTPUT1", "datatype":"INT32", "shape":["1", "16"], "contents":{"intContents":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}]}
+
+
+
+```python
+!seldon pipeline unload tfsimple-extended
+!seldon pipeline unload tfsimple-extended2
+!seldon pipeline unload tfsimple-combined-step
+!seldon pipeline unload tfsimple
+```
+
+    {}
+    {}
+    {}
+    {}
+
+
+
+```python
+!seldon model unload tfsimple1
+!seldon model unload tfsimple2
+```
+
+    {}
+    {}
+
+
+
+```python
+
+```
diff --git a/samples/pipelines/tfsimple-combined-step.yaml b/samples/pipelines/tfsimple-combined-step.yaml
new file mode 100644
index 0000000000..eed03e39c1
--- /dev/null
+++ b/samples/pipelines/tfsimple-combined-step.yaml
@@ -0,0 +1,17 @@
+apiVersion: mlops.seldon.io/v1alpha1
+kind: Pipeline
+metadata:
+  name: tfsimple-combined-step
+spec:
+  input:
+    externalInputs:
+      - tfsimple-extended.step.tfsimple2.outputs.OUTPUT0
+      - tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0
+    tensorMap:
+      tfsimple-extended.step.tfsimple2.outputs.OUTPUT0: INPUT0
+      tfsimple-extended2.step.tfsimple2.outputs.OUTPUT0: INPUT1
+  steps:
+    - name: tfsimple2
+  output:
+    steps:
+    - tfsimple2
diff --git a/samples/pipelines/tfsimple-combined-trigger.yaml b/samples/pipelines/tfsimple-combined-trigger.yaml
new file mode 100644
index 0000000000..da07ff1940
--- /dev/null
+++ b/samples/pipelines/tfsimple-combined-trigger.yaml
@@ -0,0 +1,18 @@
+apiVersion: mlops.seldon.io/v1alpha1
+kind: Pipeline
+metadata:
+  name: tfsimple-combined-trigger
+spec:
+  input:
+    externalInputs:
+      - tfsimple-extended.outputs
+    externalTriggers:
+      - tfsimple-extended2.outputs
+    tensorMap:
+      tfsimple-extended.outputs.OUTPUT0: INPUT0
+      tfsimple-extended.outputs.OUTPUT1: INPUT1
+  steps:
+    - name: tfsimple2
+  output:
+    steps:
+    - tfsimple2
diff --git a/samples/pipelines/tfsimple-combined.yaml b/samples/pipelines/tfsimple-combined.yaml
new file mode 100644
index 0000000000..1274988835
--- /dev/null
+++ b/samples/pipelines/tfsimple-combined.yaml
@@ -0,0 +1,17 @@
+apiVersion: mlops.seldon.io/v1alpha1
+kind: Pipeline
+metadata:
+  name: tfsimple-combined
+spec:
+  input:
+    externalInputs:
+      - tfsimple-extended.outputs.OUTPUT0
+      - tfsimple-extended2.outputs.OUTPUT1
+    tensorMap:
+      tfsimple-extended.outputs.OUTPUT0: INPUT0
+      tfsimple-extended2.outputs.OUTPUT1: INPUT1
+  steps:
+    - name: tfsimple2
+  output:
+    steps:
+    - tfsimple2
diff --git a/samples/pipelines/tfsimple-extended-step.yaml b/samples/pipelines/tfsimple-extended-step.yaml
new file mode 100644
index 0000000000..5552f34745
--- /dev/null
+++ b/samples/pipelines/tfsimple-extended-step.yaml
@@ -0,0 +1,16 @@
+apiVersion: mlops.seldon.io/v1alpha1
+kind: Pipeline
+metadata:
+  name: tfsimple-extended-step
+spec:
+  input:
+    externalInputs:
+      - tfsimple.step.tfsimple1.outputs
+    tensorMap:
+      tfsimple.step.tfsimple1.outputs.OUTPUT0: INPUT0
+      tfsimple.step.tfsimple1.outputs.OUTPUT1: INPUT1
+  steps:
+    - name: tfsimple2
+  output:
+    steps:
+    - tfsimple2
diff --git a/samples/pipelines/tfsimple-extended.yaml b/samples/pipelines/tfsimple-extended.yaml
new file mode 100644
index 0000000000..2b5fde43d0
--- /dev/null
+++ b/samples/pipelines/tfsimple-extended.yaml
@@ -0,0 +1,16 @@
+apiVersion: mlops.seldon.io/v1alpha1
+kind: Pipeline
+metadata:
+  name: tfsimple-extended
+spec:
+  input:
+    externalInputs:
+      - tfsimple.outputs
+    tensorMap:
+      tfsimple.outputs.OUTPUT0: INPUT0
+      tfsimple.outputs.OUTPUT1: INPUT1
+  steps:
+    - name: tfsimple2
+  output:
+    steps:
+    - tfsimple2
diff --git a/samples/pipelines/tfsimple-extended2.yaml b/samples/pipelines/tfsimple-extended2.yaml
new file mode 100644
index 0000000000..f81847d29a
--- /dev/null
+++ b/samples/pipelines/tfsimple-extended2.yaml
@@ -0,0 +1,16 @@
+apiVersion: mlops.seldon.io/v1alpha1
+kind: Pipeline
+metadata:
+  name: tfsimple-extended2
+spec:
+  input:
+    externalInputs:
+      - tfsimple.outputs
+    tensorMap:
+      tfsimple.outputs.OUTPUT0: INPUT0
+      tfsimple.outputs.OUTPUT1: INPUT1
+  steps:
+    - name: tfsimple2
+  output:
+    steps:
+    - tfsimple2
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt
index 9a4d89e409..4afa208a4c 100644
--- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt
@@ -18,6 +18,7 @@ package io.seldon.dataflow.kafka
 
 import io.klogging.noCoLogger
 import io.seldon.mlops.chainer.ChainerOuterClass
+import io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping
 import org.apache.kafka.streams.StreamsBuilder
 
 /**
@@ -25,16 +26,16 @@ import org.apache.kafka.streams.StreamsBuilder
  */
 class Chainer(
     builder: StreamsBuilder,
-    internal val inputTopic: TopicName,
-    internal val outputTopic: TopicName,
+    internal val inputTopic: TopicForPipeline,
+    internal val outputTopic: TopicForPipeline,
     internal val tensors: Set?,
     internal val pipelineName: String,
-    internal val tensorRenaming: Map,
+    internal val tensorRenaming: List,
     internal val batchProperties: ChainerOuterClass.Batch,
     private val kafkaDomainParams: KafkaDomainParams,
-    internal val inputTriggerTopics: Set,
+    internal val inputTriggerTopics: Set,
     internal val triggerJoinType: ChainerOuterClass.PipelineStepUpdate.PipelineJoinType,
-    internal val triggerTensorsByTopic: Map>?,
+    internal val triggerTensorsByTopic: Map>?,
 ) : PipelineStep {
     init {
         builder.apply {
@@ -43,7 +44,7 @@ class Chainer(
             }
         }
 
-        when (ChainType.create(inputTopic, outputTopic)) {
+        when (ChainType.create(inputTopic.topicName, outputTopic.topicName)) {
             ChainType.OUTPUT_INPUT -> buildOutputInputStream(builder)
             ChainType.INPUT_INPUT -> buildInputInputStream(builder)
             ChainType.OUTPUT_OUTPUT -> buildOutputOutputStream(builder)
@@ -57,10 +58,9 @@ class Chainer(
 
     private fun buildPassThroughStream(builder: StreamsBuilder) {
         val s1 = builder
-            .stream(inputTopic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(inputTopic.topicName, consumerSerde)
+            .filterForPipeline(inputTopic.pipelineName)
         addTriggerTopology(
-            pipelineName,
             kafkaDomainParams,
             builder,
             inputTriggerTopics,
@@ -70,20 +70,20 @@ class Chainer(
             null,
         )
             .headerRemover()
-            .to(outputTopic, producerSerde)
+            .headerSetter(pipelineName)
+            .to(outputTopic.topicName, producerSerde)
     }
 
     private fun buildInputOutputStream(builder: StreamsBuilder) {
         val s1 = builder
-            .stream(inputTopic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(inputTopic.topicName, consumerSerde)
+            .filterForPipeline(inputTopic.pipelineName)
             .unmarshallInferenceV2Request()
-            .convertToResponse(inputTopic, tensors, tensorRenaming)
+            .convertToResponse(inputTopic.pipelineName, inputTopic.topicName, tensors, tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.outputsList.size != 0 }
             .marshallInferenceV2Response()
         addTriggerTopology(
-            pipelineName,
             kafkaDomainParams,
             builder,
             inputTriggerTopics,
@@ -93,20 +93,20 @@ class Chainer(
             null,
         )
             .headerRemover()
-            .to(outputTopic, producerSerde)
+            .headerSetter(pipelineName)
+            .to(outputTopic.topicName, producerSerde)
     }
 
     private fun buildOutputOutputStream(builder: StreamsBuilder) {
         val s1 = builder
-            .stream(inputTopic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(inputTopic.topicName, consumerSerde)
+            .filterForPipeline(inputTopic.pipelineName)
             .unmarshallInferenceV2Response()
-            .filterResponses(inputTopic, tensors, tensorRenaming)
+            .filterResponses(inputTopic.pipelineName, inputTopic.topicName, tensors, tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.outputsList.size != 0 }
             .marshallInferenceV2Response()
         addTriggerTopology(
-            pipelineName,
             kafkaDomainParams,
             builder,
             inputTriggerTopics,
@@ -116,21 +116,21 @@ class Chainer(
             null,
         )
             .headerRemover()
-            .to(outputTopic, producerSerde)
+            .headerSetter(pipelineName)
+            .to(outputTopic.topicName, producerSerde)
     }
 
     private fun buildOutputInputStream(builder: StreamsBuilder) {
         val s1 = builder
-            .stream(inputTopic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(inputTopic.topicName, consumerSerde)
+            .filterForPipeline(inputTopic.pipelineName)
             .unmarshallInferenceV2Response()
-            .convertToRequest(inputTopic, tensors, tensorRenaming)
+            .convertToRequest(inputTopic.pipelineName, inputTopic.topicName, tensors, tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.inputsList.size != 0 }
             .batchMessages(batchProperties)
             .marshallInferenceV2Request()
         addTriggerTopology(
-            pipelineName,
             kafkaDomainParams,
             builder,
             inputTriggerTopics,
@@ -140,21 +140,21 @@ class Chainer(
             null,
         )
             .headerRemover()
-            .to(outputTopic, producerSerde)
+            .headerSetter(pipelineName)
+            .to(outputTopic.topicName, producerSerde)
     }
 
     private fun buildInputInputStream(builder: StreamsBuilder) {
         val s1 = builder
-            .stream(inputTopic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(inputTopic.topicName, consumerSerde)
+            .filterForPipeline(inputTopic.pipelineName)
             .unmarshallInferenceV2Request()
-            .filterRequests(inputTopic, tensors, tensorRenaming)
+            .filterRequests(inputTopic.pipelineName, inputTopic.topicName, tensors, tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.inputsList.size != 0 }
             .batchMessages(batchProperties)
             .marshallInferenceV2Request()
         addTriggerTopology(
-            pipelineName,
             kafkaDomainParams,
             builder,
             inputTriggerTopics,
@@ -164,7 +164,8 @@ class Chainer(
             null,
         )
             .headerRemover()
-            .to(outputTopic, producerSerde)
+            .headerSetter(pipelineName)
+            .to(outputTopic.topicName, producerSerde)
     }
 
     companion object {
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt
index 028905dc4a..52df7029ac 100644
--- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt
@@ -18,6 +18,7 @@ package io.seldon.dataflow.kafka
 
 import io.klogging.noCoLogger
 import io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType
+import io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping
 import io.seldon.mlops.inference.v2.V2Dataplane
 import org.apache.kafka.streams.StreamsBuilder
 import org.apache.kafka.streams.kstream.JoinWindows
@@ -29,21 +30,20 @@ import java.time.Duration
  */
 class Joiner(
     builder: StreamsBuilder,
-    internal val inputTopics: Set,
-    internal val outputTopic: TopicName,
-    internal val tensorsByTopic: Map>?,
+    internal val inputTopics: Set,
+    internal val outputTopic: TopicForPipeline,
+    internal val tensorsByTopic: Map>?,
     internal val pipelineName: String,
-    internal val tensorRenaming: Map,
+    internal val tensorRenaming: List,
     internal val kafkaDomainParams: KafkaDomainParams,
     internal val joinType: PipelineJoinType,
-    internal val inputTriggerTopics: Set,
+    internal val inputTriggerTopics: Set,
     internal val triggerJoinType: PipelineJoinType,
-    internal val triggerTensorsByTopic: Map>?,
+    internal val triggerTensorsByTopic: Map>?,
 ) : PipelineStep {
     init {
         val dataStream = buildTopology(builder, inputTopics)
         addTriggerTopology(
-            pipelineName,
             kafkaDomainParams,
             builder,
             inputTriggerTopics,
@@ -53,12 +53,13 @@ class Joiner(
             null
         )
             .headerRemover()
-            .to(outputTopic, producerSerde)
+            .headerSetter(pipelineName)
+            .to(outputTopic.topicName, producerSerde)
     }
 
     private fun buildTopology(
         builder: StreamsBuilder,
-        inputTopics: Set,
+        inputTopics: Set,
         pending: KStream? = null,
     ): KStream {
         if (inputTopics.isEmpty()) {
@@ -70,7 +71,7 @@ class Joiner(
 
         val topic = inputTopics.first()
 
-        val chainType = ChainType.create(topic, outputTopic)
+        val chainType = ChainType.create(topic.topicName, outputTopic.topicName)
         logger.info("Creating stream ${chainType} for ${topic}->${outputTopic}")
         val nextStream = when (chainType) {
             ChainType.OUTPUT_INPUT -> buildOutputInputStream(topic, builder)
@@ -136,49 +137,49 @@ class Joiner(
         }
     }
 
-    private fun buildPassThroughStream(topic: String, builder: StreamsBuilder): KStream {
+    private fun buildPassThroughStream(topic: TopicForPipeline, builder: StreamsBuilder): KStream {
         return builder
-            .stream(topic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(topic.topicName, consumerSerde)
+            .filterForPipeline(topic.pipelineName)
     }
 
-    private fun buildInputOutputStream(topic: String, builder: StreamsBuilder): KStream {
+    private fun buildInputOutputStream(topic: TopicForPipeline, builder: StreamsBuilder): KStream {
         return builder
-            .stream(topic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(topic.topicName, consumerSerde)
+            .filterForPipeline(topic.pipelineName)
             .unmarshallInferenceV2Request()
-            .convertToResponse(topic, tensorsByTopic?.get(topic), tensorRenaming)
+            .convertToResponse(topic.pipelineName, topic.topicName, tensorsByTopic?.get(topic), tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.outputsList.size != 0 }
             .marshallInferenceV2Response()
     }
 
-    private fun buildOutputOutputStream(topic: String, builder: StreamsBuilder): KStream {
+    private fun buildOutputOutputStream(topic: TopicForPipeline, builder: StreamsBuilder): KStream {
         return builder
-            .stream(topic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(topic.topicName, consumerSerde)
+            .filterForPipeline(topic.pipelineName)
             .unmarshallInferenceV2Response()
-            .filterResponses(topic, tensorsByTopic?.get(topic), tensorRenaming)
+            .filterResponses(topic.pipelineName, topic.topicName, tensorsByTopic?.get(topic), tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.outputsList.size != 0 }
             .marshallInferenceV2Response()
     }
 
-    private fun buildOutputInputStream(topic: String, builder: StreamsBuilder): KStream {
+    private fun buildOutputInputStream(topic: TopicForPipeline, builder: StreamsBuilder): KStream {
         return builder
-            .stream(topic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(topic.topicName, consumerSerde)
+            .filterForPipeline(topic.pipelineName)
             .unmarshallInferenceV2Response()
-            .convertToRequest(topic, tensorsByTopic?.get(topic), tensorRenaming)
+            .convertToRequest(topic.pipelineName, topic.topicName, tensorsByTopic?.get(topic), tensorRenaming)
             .marshallInferenceV2Request()
     }
 
-    private fun buildInputInputStream(topic: String, builder: StreamsBuilder): KStream {
+    private fun buildInputInputStream(topic: TopicForPipeline, builder: StreamsBuilder): KStream {
         return builder
-            .stream(topic, consumerSerde)
-            .filterForPipeline(pipelineName)
+            .stream(topic.topicName, consumerSerde)
+            .filterForPipeline(topic.pipelineName)
             .unmarshallInferenceV2Request()
-            .filterRequests(topic, tensorsByTopic?.get(topic), tensorRenaming)
+            .filterRequests(topic.pipelineName,topic.topicName, tensorsByTopic?.get(topic), tensorRenaming)
             // handle cases where there are no tensors we want
             .filter { _, value -> value.inputsList.size != 0 }
             .marshallInferenceV2Request()
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Pipeline.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Pipeline.kt
index 43b8ced192..dab65ed9b7 100644
--- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Pipeline.kt
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Pipeline.kt
@@ -102,7 +102,7 @@ class Pipeline(
                         metadata.name,
                         it.sourcesList,
                         it.triggersList,
-                        it.tensorMapMap,
+                        it.tensorMapList,
                         it.sink,
                         it.inputJoinTy,
                         it.triggersJoinTy,
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/PipelineStep.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/PipelineStep.kt
index a87067de4a..05eb19eb74 100644
--- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/PipelineStep.kt
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/PipelineStep.kt
@@ -18,22 +18,29 @@ package io.seldon.dataflow.kafka
 
 import io.seldon.mlops.chainer.ChainerOuterClass.Batch
 import io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType
+import io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping
+import io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic
 import org.apache.kafka.streams.StreamsBuilder
 
 interface PipelineStep
 
 data class TopicTensors(
-    val topicName: TopicName,
+    val topicForPipeline: TopicForPipeline,
     val tensors: Set,
 )
 
+data class TopicForPipeline(
+    val topicName: TopicName,
+    val pipelineName: String,
+)
+
 fun stepFor(
     builder: StreamsBuilder,
     pipelineName: String,
-    sources: List,
-    triggerSources: List,
-    tensorMap: Map,
-    sink: TopicName,
+    sources: List,
+    triggerSources: List,
+    tensorMap: List,
+    sink: PipelineTopic,
     joinType: PipelineJoinType,
     triggerJoinType: PipelineJoinType,
     batchProperties: Batch,
@@ -44,8 +51,8 @@ fun stepFor(
         is SourceProjection.Empty -> null
         is SourceProjection.Single -> Chainer(
             builder,
-            result.topicName,
-            sink,
+            result.topicForPipeline,
+            TopicForPipeline(topicName = sink.topicName, pipelineName = sink.pipelineName),
             null,
             pipelineName,
             tensorMap,
@@ -57,8 +64,8 @@ fun stepFor(
         )
         is SourceProjection.SingleSubset -> Chainer(
             builder,
-            result.topicName,
-            sink,
+            result.topicForPipeline,
+            TopicForPipeline(topicName = sink.topicName, pipelineName = sink.pipelineName),
             result.tensors,
             pipelineName,
             tensorMap,
@@ -71,7 +78,7 @@ fun stepFor(
         is SourceProjection.Many -> Joiner(
             builder,
             result.topicNames,
-            sink,
+            TopicForPipeline(topicName = sink.topicName, pipelineName = sink.pipelineName),
             null,
             pipelineName,
             tensorMap,
@@ -84,7 +91,7 @@ fun stepFor(
         is SourceProjection.ManySubsets -> Joiner(
             builder,
             result.tensorsByTopic.keys,
-            sink,
+            TopicForPipeline(topicName = sink.topicName, pipelineName = sink.pipelineName),
             result.tensorsByTopic,
             pipelineName,
             tensorMap,
@@ -97,63 +104,53 @@ fun stepFor(
     }
 }
 
-fun List.areTensorsFromSameTopic(): Pair {
-    val (topics, tensors) = this
-        .map { parseSource(it) }
-        .unzip()
-        .run { first.toSet() to second.filterNotNull().toSet() }
-
-    if (tensors.isEmpty() || topics.size > 1) return false to (topics to emptySet())
-
-    return true to (topics to tensors)
-}
 
 sealed class SourceProjection {
     object Empty : SourceProjection()
-    data class Single(val topicName: TopicName) : SourceProjection()
-    data class SingleSubset(val topicName: TopicName, val tensors: Set) : SourceProjection()
-    data class Many(val topicNames: Set) : SourceProjection()
-    data class ManySubsets(val tensorsByTopic: Map>) : SourceProjection()
+    data class Single(val topicForPipeline: TopicForPipeline) : SourceProjection()
+    data class SingleSubset(val topicForPipeline: TopicForPipeline, val tensors: Set) : SourceProjection()
+    data class Many(val topicNames: Set) : SourceProjection()
+    data class ManySubsets(val tensorsByTopic: Map>) : SourceProjection()
 }
 
-fun parseTriggers(sources: List): Map> {
+fun parseTriggers(sources: List): Map> {
     return sources
         .map { parseSource(it) }
-        .groupBy(keySelector = { it.first }, valueTransform = { it.second })
+        .groupBy(keySelector = { it.first+":"+it.third }, valueTransform = { it.second })
         .mapValues { it.value.filterNotNull().toSet() }
-        .map { TopicTensors(it.key, it.value) }
-        .associate { it.topicName to it.tensors }
+        .map { TopicTensors(TopicForPipeline(topicName = it.key.split(":")[0], pipelineName = it.key.split(":")[1]), it.value) }
+        .associate {it.topicForPipeline to it.tensors }
 }
 
-fun parseSources(sources: List): SourceProjection {
+fun parseSources(sources: List): SourceProjection {
     val topicsAndTensors = sources
         .map { parseSource(it) }
-        .groupBy(keySelector = { it.first }, valueTransform = { it.second })
+        .groupBy(keySelector = { it.first+":"+it.third }, valueTransform = { it.second })
         .mapValues { it.value.filterNotNull().toSet() }
-        .map { TopicTensors(it.key, it.value) }
+        .map { TopicTensors(TopicForPipeline(topicName = it.key.split(":")[0], pipelineName = it.key.split(":")[1]), it.value) }
 
     return when {
         topicsAndTensors.isEmpty() -> SourceProjection.Empty
         topicsAndTensors.size == 1 && topicsAndTensors.first().tensors.isEmpty() ->
-            SourceProjection.Single(topicsAndTensors.first().topicName)
+            SourceProjection.Single(topicsAndTensors.first().topicForPipeline)
         topicsAndTensors.size == 1 ->
             SourceProjection.SingleSubset(
-                topicsAndTensors.first().topicName,
+                topicsAndTensors.first().topicForPipeline,
                 topicsAndTensors.first().tensors,
             )
         topicsAndTensors.all { it.tensors.isEmpty() } ->
-            SourceProjection.Many(topicsAndTensors.map { it.topicName }.toSet())
+            SourceProjection.Many(topicsAndTensors.map { it.topicForPipeline }.toSet())
         else ->
             SourceProjection.ManySubsets(
-                topicsAndTensors.associate { it.topicName to it.tensors },
+                topicsAndTensors.associate { it.topicForPipeline to it.tensors },
             )
     }
 }
 
-fun parseSource(source: TopicName): Pair {
-    return if (source.split(".").size > 5) {
-        source.substringBeforeLast(".") to source.substringAfterLast(".", "")
+fun parseSource(source: PipelineTopic): Triple {
+    return if (source.topicName.split(".").size > 5 ){
+        Triple(source.topicName.substringBeforeLast("."), source.topicName.substringAfterLast(".", ""), source.pipelineName)
     } else {
-        source to null
+        Triple(source.topicName, null, source.pipelineName)
     }
 }
\ No newline at end of file
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/StreamTransforms.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/StreamTransforms.kt
index 764cf39fc0..77402aceba 100644
--- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/StreamTransforms.kt
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/StreamTransforms.kt
@@ -18,9 +18,12 @@ package io.seldon.dataflow.kafka
 
 import io.seldon.dataflow.kafka.headers.PipelineNameFilter
 import io.seldon.dataflow.kafka.headers.AlibiDetectRemover
+import io.seldon.dataflow.kafka.headers.PipelineHeaderSetter
+import io.seldon.mlops.chainer.ChainerOuterClass.PipelineTensorMapping
 import io.seldon.mlops.chainer.ChainerOuterClass.Batch
 import io.seldon.mlops.inference.v2.V2Dataplane.ModelInferRequest
 import io.seldon.mlops.inference.v2.V2Dataplane.ModelInferResponse
+import jdk.incubator.vector.VectorOperators.Test
 import org.apache.kafka.streams.kstream.KStream
 import org.apache.kafka.streams.kstream.ValueTransformerSupplier
 
@@ -35,6 +38,11 @@ fun  KStream.headerRemover(): KStream {
         .transformValues(ValueTransformerSupplier { AlibiDetectRemover() })
 }
 
+fun  KStream.headerSetter(pipelineName: String): KStream {
+    return this
+        .transformValues(ValueTransformerSupplier { PipelineHeaderSetter(pipelineName) })
+}
+
 fun  KStream.unmarshallInferenceV2Response(): KStream {
     return this
         .mapValues { bytes -> ModelInferResponse.parseFrom(bytes) }
@@ -57,10 +65,12 @@ fun  KStream.marshallInferenceV2Response(): KStream KStream.convertToRequest(
+    inputPipeline: String,
     inputTopic: TopicName,
     desiredTensors: Set?,
-    tensorRenaming: Map
+    tensorRenamingList: List
 ): KStream {
+    val tensorRenaming = tensorRenamingList.filter { it.pipelineName.equals(inputPipeline) }.map { it.topicAndTensor to it.tensorName }.toMap()
     return this
         .mapValues { inferResponse ->
             convertToRequest(
@@ -139,10 +149,12 @@ private fun convertOutputToInputTensor(
 }
 
 fun  KStream.filterRequests(
+    inputPipeline: String,
     inputTopic: TopicName,
     desiredTensors: Set?,
-    tensorRenaming: Map
+    tensorRenamingList: List
 ): KStream {
+    val tensorRenaming = tensorRenamingList.filter { it.pipelineName.equals(inputPipeline) }.map { it.topicAndTensor to it.tensorName }.toMap()
     return this
         .mapValues { inferResponse ->
             filterRequest(
@@ -208,10 +220,12 @@ private fun createInputTensor(
 
 
 fun  KStream.filterResponses(
+    inputPipeline: String,
     inputTopic: TopicName,
     desiredTensors: Set?,
-    tensorRenaming: Map
+    tensorRenamingList: List
 ): KStream {
+    val tensorRenaming = tensorRenamingList.filter { it.pipelineName.equals(inputPipeline) }.map { it.topicAndTensor to it.tensorName }.toMap()
     return this
         .mapValues { inferResponse ->
             filterResponse(
@@ -276,10 +290,12 @@ private fun createOutputTensor(
 }
 
 fun  KStream.convertToResponse(
+    inputPipeline: String,
     inputTopic: TopicName,
     desiredTensors: Set?,
-    tensorRenaming: Map
+    tensorRenamingList: List
 ): KStream {
+    val tensorRenaming = tensorRenamingList.filter { it.pipelineName.equals(inputPipeline) }.map { it.topicAndTensor to it.tensorName }.toMap()
     return this
         .mapValues { inferResponse ->
             convertToResponse(
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/TriggerTransforms.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/TriggerTransforms.kt
index 75a6c45a8b..8e31fea0a5 100644
--- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/TriggerTransforms.kt
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/TriggerTransforms.kt
@@ -23,11 +23,10 @@ import org.apache.kafka.streams.kstream.KStream
 import java.time.Duration
 
 fun addTriggerTopology(
-    pipelineName: String,
     kafkaDomainParams: KafkaDomainParams,
     builder: StreamsBuilder,
-    inputTopics: Set,
-    tensorsByTopic: Map>?,
+    inputTopics: Set,
+    tensorsByTopic: Map>?,
     joinType: ChainerOuterClass.PipelineStepUpdate.PipelineJoinType,
     lastStream: KStream,
     pending: KStream? = null,
@@ -49,10 +48,10 @@ fun addTriggerTopology(
 
     val topic = inputTopics.first()
     val nextStream = builder //TODO possible bug - not all streams will be v2 requests? Maybe v2 responses?
-        .stream(topic, consumerSerde)
-        .filterForPipeline(pipelineName)
+        .stream(topic.topicName, consumerSerde)
+        .filterForPipeline(topic.pipelineName)
         .unmarshallInferenceV2Response()
-        .convertToRequest(topic, tensorsByTopic?.get(topic), emptyMap())
+        .convertToRequest(topic.pipelineName, topic.topicName, tensorsByTopic?.get(topic), emptyList())
         // handle cases where there are no tensors we want
         .filter { _, value -> value.inputsList.size != 0}
         .marshallInferenceV2Request()
@@ -73,7 +72,7 @@ fun addTriggerTopology(
                 ) ?: nextStream
 
 
-            return addTriggerTopology(pipelineName, kafkaDomainParams, builder, inputTopics.minus(topic), tensorsByTopic, joinType, lastStream, nextPending)
+            return addTriggerTopology(kafkaDomainParams, builder, inputTopics.minus(topic), tensorsByTopic, joinType, lastStream, nextPending)
         }
 
         ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Outer -> {
@@ -89,7 +88,7 @@ fun addTriggerTopology(
                 ) ?: nextStream
 
 
-            return addTriggerTopology(pipelineName, kafkaDomainParams, builder, inputTopics.minus(topic), tensorsByTopic, joinType, lastStream, nextPending)
+            return addTriggerTopology(kafkaDomainParams, builder, inputTopics.minus(topic), tensorsByTopic, joinType, lastStream, nextPending)
         }
 
         else -> {
@@ -103,7 +102,7 @@ fun addTriggerTopology(
                     joinSerde,
                 ) ?: nextStream
 
-            return addTriggerTopology(pipelineName, kafkaDomainParams, builder, inputTopics.minus(topic), tensorsByTopic, joinType, lastStream, nextPending)
+            return addTriggerTopology(kafkaDomainParams, builder, inputTopics.minus(topic), tensorsByTopic, joinType, lastStream, nextPending)
         }
     }
 }
diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/headers/PipelineHeaderSetter.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/headers/PipelineHeaderSetter.kt
new file mode 100644
index 0000000000..3da7ea05d1
--- /dev/null
+++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/headers/PipelineHeaderSetter.kt
@@ -0,0 +1,21 @@
+package io.seldon.dataflow.kafka.headers
+
+import io.seldon.dataflow.kafka.TRecord
+import org.apache.kafka.streams.kstream.ValueTransformer
+import org.apache.kafka.streams.processor.ProcessorContext
+
+class PipelineHeaderSetter(private val pipelineName: String) : ValueTransformer {
+    var context: ProcessorContext? = null
+
+    override fun init(context: ProcessorContext?) {
+        this.context = context
+    }
+
+    override fun transform(value: TRecord?): TRecord? {
+        this.context?.headers()?.remove(SeldonHeaders.pipelineName)
+        this.context?.headers()?.add(SeldonHeaders.pipelineName, pipelineName.toByteArray())
+        return value
+    }
+
+    override fun close() {}
+}
\ No newline at end of file
diff --git a/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/PipelineStepTest.kt b/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/PipelineStepTest.kt
index aaf8ab855d..5bc96fb15d 100644
--- a/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/PipelineStepTest.kt
+++ b/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/PipelineStepTest.kt
@@ -17,6 +17,7 @@ limitations under the License.
 package io.seldon.dataflow.kafka
 
 import io.seldon.mlops.chainer.ChainerOuterClass
+import io.seldon.mlops.chainer.ChainerOuterClass.PipelineTopic
 import org.apache.kafka.streams.StreamsBuilder
 import org.junit.jupiter.params.ParameterizedTest
 import org.junit.jupiter.params.provider.Arguments
@@ -30,19 +31,12 @@ import java.util.stream.Stream
 
 internal class PipelineStepTest {
 
-    @ParameterizedTest(name = "{0}")
-    @MethodSource
-    fun areTensorsFromSameTopic(testName: String, expected: Boolean, sources: List) {
-        val (actual, _) = sources.areTensorsFromSameTopic()
-        expectThat(expected).isEqualTo(actual)
-    }
-
     @ParameterizedTest(name = "{0}")
     @MethodSource
     fun stepFor(
         testName: String,
         expected: PipelineStep?,
-        sources: List,
+        sources: List,
     ) {
         val result =
             stepFor(
@@ -50,8 +44,8 @@ internal class PipelineStepTest {
                 defaultPipelineName,
                 sources,
                 emptyList(),
-                emptyMap(),
-                defaultSink,
+                emptyList(),
+                defaultPipelineTopic,
                 ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Inner,
                 ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Inner,
                 ChainerOuterClass.Batch.getDefaultInstance(),
@@ -67,114 +61,103 @@ internal class PipelineStepTest {
     }
 
     companion object {
-        private const val defaultSink = "seldon.namespace.sinkModel.inputs"
         private const val defaultPipelineName = "some-pipeline"
+        private val defaultPipelineTopic = PipelineTopic.newBuilder()
+            .setTopicName("seldon.namespace.sinkModel.inputs")
+            .setPipelineName(defaultPipelineName).build()
+        private val defaultSink = TopicForPipeline(topicName = "seldon.namespace.sinkModel.inputs", pipelineName = defaultPipelineName)
         private val kafkaDomainParams = KafkaDomainParams(useCleanState = true, joinWindowMillis = 1_000L)
 
-        @JvmStatic
-        fun areTensorsFromSameTopic(): Stream =
-            Stream.of(
-                arguments("no sources", false, emptyList()),
-                arguments("no tensors", false, listOf("seldon.namespace.model.model1.outputs")),
-                arguments("single tensor", true, listOf("seldon.namespace.model.model1.outputs.tensorA")),
-                arguments(
-                    "tensors from same model",
-                    true,
-                    listOf(
-                        "seldon.namespace.model.model1.outputs.tensorA",
-                        "seldon.namespace.model.model1.outputs.tensorB",
-                    ),
-                ),
-                arguments(
-                    "tensors from different models",
-                    false,
-                    listOf(
-                        "seldon.namespace.model.model1.outputs.tensorA",
-                        "seldon.namespace.model.model2.outputs.tensorA",
-                    ),
-                ),
-            )
 
         @JvmStatic
         fun stepFor(): Stream =
             Stream.of(
-                arguments("no sources", null, emptyList()),
+                arguments("no sources", null, emptyList()),
                 arguments(
                     "single source, no tensors",
                     makeChainerFor(
-                        inputTopic = "seldon.namespace.model.model1.outputs",
+                        inputTopic = TopicForPipeline(topicName = "seldon.namespace.model.model1.outputs", pipelineName = defaultPipelineName),
                         tensors = null,
                     ),
-                    listOf("seldon.namespace.model.model1.outputs"),
+                    listOf(PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.model1.outputs").setPipelineName(defaultPipelineName).build()),
                 ),
                 arguments(
                     "single source, one tensor",
                     makeChainerFor(
-                        inputTopic = "seldon.namespace.model.model1.outputs",
+                        inputTopic = TopicForPipeline(topicName = "seldon.namespace.model.model1.outputs", pipelineName = defaultPipelineName),
                         tensors = setOf("tensorA")
                     ),
-                    listOf("seldon.namespace.model.model1.outputs.tensorA"),
+                    listOf(PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.model1.outputs.tensorA").setPipelineName(defaultPipelineName).build()),
                 ),
                 arguments(
                     "single source, multiple tensors",
                     makeChainerFor(
-                        inputTopic = "seldon.namespace.model.model1.outputs",
+                        inputTopic = TopicForPipeline(topicName = "seldon.namespace.model.model1.outputs", pipelineName = defaultPipelineName),
                         tensors = setOf("tensorA", "tensorB")
                     ),
                     listOf(
-                        "seldon.namespace.model.model1.outputs.tensorA",
-                        "seldon.namespace.model.model1.outputs.tensorB",
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.model1.outputs.tensorA").setPipelineName(
+                            defaultPipelineName).build(),
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.model1.outputs.tensorB").setPipelineName(
+                            defaultPipelineName).build(),
                     ),
                 ),
                 arguments(
                     "multiple sources, no tensors",
                     makeJoinerFor(
-                        inputTopics = setOf("seldon.namespace.model.modelA.outputs", "seldon.namespace.model.modelB.outputs"),
+                        inputTopics = setOf(TopicForPipeline(topicName = "seldon.namespace.model.modelA.outputs", pipelineName = defaultPipelineName),
+                            TopicForPipeline(topicName = "seldon.namespace.model.modelB.outputs", pipelineName = defaultPipelineName)),
                         tensorsByTopic = null,
                     ),
                     listOf(
-                        "seldon.namespace.model.modelA.outputs",
-                        "seldon.namespace.model.modelB.outputs",
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.modelA.outputs").setPipelineName(
+                            defaultPipelineName).build(),
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.modelB.outputs").setPipelineName(
+                            defaultPipelineName).build(),
                     ),
                 ),
                 arguments(
                     "multiple sources, multiple tensors",
                     makeJoinerFor(
                         inputTopics = setOf(
-                            "seldon.namespace.model.modelA.outputs",
-                            "seldon.namespace.model.modelB.outputs",
+                            TopicForPipeline(topicName = "seldon.namespace.model.modelA.outputs", pipelineName = defaultPipelineName),
+                            TopicForPipeline(topicName = "seldon.namespace.model.modelB.outputs", pipelineName = defaultPipelineName),
                         ),
                         tensorsByTopic = mapOf(
-                            "seldon.namespace.model.modelA.outputs" to setOf("tensor1"),
-                            "seldon.namespace.model.modelB.outputs" to setOf("tensor2"),
+                            TopicForPipeline(topicName = "seldon.namespace.model.modelA.outputs", pipelineName = defaultPipelineName) to setOf("tensor1"),
+                            TopicForPipeline(topicName = "seldon.namespace.model.modelB.outputs", pipelineName = defaultPipelineName) to setOf("tensor2"),
                         ),
                     ),
                     listOf(
-                        "seldon.namespace.model.modelA.outputs.tensor1",
-                        "seldon.namespace.model.modelB.outputs.tensor2",
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.modelA.outputs.tensor1").setPipelineName(
+                            defaultPipelineName).build(),
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.modelB.outputs.tensor2").setPipelineName(
+                            defaultPipelineName).build(),
                     ),
                 ),
                 arguments(
                     "tensors override plain topic",
                     makeChainerFor(
-                        inputTopic = "seldon.namespace.model.modelA.outputs",
+                        inputTopic = TopicForPipeline(topicName = "seldon.namespace.model.modelA.outputs", pipelineName = defaultPipelineName),
                         tensors = setOf("tensorA"),
                     ),
                     listOf(
-                        "seldon.namespace.model.modelA.outputs.tensorA",
-                        "seldon.namespace.model.modelA.outputs",
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.modelA.outputs.tensorA").setPipelineName(
+                            defaultPipelineName).build(),
+                        PipelineTopic.newBuilder().setTopicName("seldon.namespace.model.modelA.outputs").setPipelineName(
+                            defaultPipelineName).build(),
                     ),
                 ),
             )
 
-        private fun makeChainerFor(inputTopic: TopicName, tensors: Set?): Chainer =
+        private fun makeChainerFor(inputTopic: TopicForPipeline, tensors: Set?): Chainer =
             Chainer(
                 StreamsBuilder(),
                 inputTopic = inputTopic,
                 tensors = tensors,
-                outputTopic = defaultSink,
                 pipelineName = defaultPipelineName,
-                tensorRenaming = emptyMap(),
+                outputTopic = defaultSink,
+                tensorRenaming = emptyList(),
                 kafkaDomainParams = kafkaDomainParams,
                 inputTriggerTopics = emptySet(),
                 triggerJoinType = ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Inner,
@@ -183,16 +166,16 @@ internal class PipelineStepTest {
             )
 
         private fun makeJoinerFor(
-            inputTopics: Set,
-            tensorsByTopic: Map>?,
+            inputTopics: Set,
+            tensorsByTopic: Map>?,
         ): Joiner =
             Joiner(
                 StreamsBuilder(),
                 inputTopics = inputTopics,
                 tensorsByTopic = tensorsByTopic,
-                outputTopic = defaultSink,
                 pipelineName = defaultPipelineName,
-                tensorRenaming = emptyMap(),
+                outputTopic = defaultSink,
+                tensorRenaming = emptyList(),
                 kafkaDomainParams = kafkaDomainParams,
                 joinType = ChainerOuterClass.PipelineStepUpdate.PipelineJoinType.Inner,
                 inputTriggerTopics = emptySet(),
@@ -215,7 +198,6 @@ fun Assertion.Builder.matches(expected: PipelineStep) =
         when {
             it is Chainer && expected is Chainer -> expect {
                 that(it) {
-                    get { pipelineName }.isEqualTo(expected.pipelineName)
                     get { inputTopic }.isEqualTo(expected.inputTopic)
                     get { outputTopic }.isEqualTo(expected.outputTopic)
                     get { tensors }.isEqualTo(expected.tensors)
@@ -223,7 +205,6 @@ fun Assertion.Builder.matches(expected: PipelineStep) =
             }
             it is Joiner && expected is Joiner -> expect {
                 that(it) {
-                    get { pipelineName }.isEqualTo(expected.pipelineName)
                     get { inputTopics }.isEqualTo(expected.inputTopics)
                     get { outputTopic }.isEqualTo(expected.outputTopic)
                     get { tensorsByTopic }.isEqualTo(expected.tensorsByTopic)
diff --git a/scheduler/pkg/agent/repository/triton/config/model_config.pb.go b/scheduler/pkg/agent/repository/triton/config/model_config.pb.go
index 14209973ab..4c79d20ca0 100644
--- a/scheduler/pkg/agent/repository/triton/config/model_config.pb.go
+++ b/scheduler/pkg/agent/repository/triton/config/model_config.pb.go
@@ -48,11 +48,11 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
-//@@
-//@@.. cpp:enum:: DataType
-//@@
-//@@   Data types supported for input and output tensors.
-//@@
+// @@
+// @@.. cpp:enum:: DataType
+// @@
+// @@   Data types supported for input and output tensors.
+// @@
 type DataType int32
 
 const (
@@ -149,11 +149,11 @@ func (DataType) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{0}
 }
 
-//@@
-//@@  .. cpp:enum:: Kind
-//@@
-//@@     Kind of this instance group.
-//@@
+// @@
+// @@  .. cpp:enum:: Kind
+// @@
+// @@     Kind of this instance group.
+// @@
 type ModelInstanceGroup_Kind int32
 
 const (
@@ -230,11 +230,11 @@ func (ModelInstanceGroup_Kind) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{1, 0}
 }
 
-//@@
-//@@  .. cpp:enum:: SecondaryDeviceKind
-//@@
-//@@     The kind of the secondary device.
-//@@
+// @@
+// @@  .. cpp:enum:: SecondaryDeviceKind
+// @@
+// @@     The kind of the secondary device.
+// @@
 type ModelInstanceGroup_SecondaryDevice_SecondaryDeviceKind int32
 
 const (
@@ -283,11 +283,11 @@ func (ModelInstanceGroup_SecondaryDevice_SecondaryDeviceKind) EnumDescriptor() (
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{1, 0, 0}
 }
 
-//@@
-//@@  .. cpp:enum:: Format
-//@@
-//@@     The format for the input.
-//@@
+// @@
+// @@  .. cpp:enum:: Format
+// @@
+// @@     The format for the input.
+// @@
 type ModelInput_Format int32
 
 const (
@@ -357,11 +357,11 @@ func (ModelInput_Format) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{3, 0}
 }
 
-//@@
-//@@    .. cpp:enum:: Kind
-//@@
-//@@       The kind of the batch input.
-//@@
+// @@
+// @@    .. cpp:enum:: Kind
+// @@
+// @@       The kind of the batch input.
+// @@
 type BatchInput_Kind int32
 
 const (
@@ -443,11 +443,11 @@ func (BatchInput_Kind) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{5, 0}
 }
 
-//@@
-//@@  .. cpp:enum:: Kind
-//@@
-//@@     The kind of the batch output.
-//@@
+// @@
+// @@  .. cpp:enum:: Kind
+// @@
+// @@     The kind of the batch output.
+// @@
 type BatchOutput_Kind int32
 
 const (
@@ -497,13 +497,13 @@ func (BatchOutput_Kind) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{6, 0}
 }
 
-//@@
-//@@  .. cpp:enum:: ModelPriority
-//@@
-//@@     Model priorities. A model will be given scheduling and execution
-//@@     preference over models at lower priorities. Current model
-//@@     priorities only work for TensorRT models.
-//@@
+// @@
+// @@  .. cpp:enum:: ModelPriority
+// @@
+// @@     Model priorities. A model will be given scheduling and execution
+// @@     preference over models at lower priorities. Current model
+// @@     priorities only work for TensorRT models.
+// @@
 type ModelOptimizationPolicy_ModelPriority int32
 
 const (
@@ -565,11 +565,11 @@ func (ModelOptimizationPolicy_ModelPriority) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{8, 0}
 }
 
-//@@
-//@@  .. cpp:enum:: TimeoutAction
-//@@
-//@@     The action applied to timed-out requests.
-//@@
+// @@
+// @@  .. cpp:enum:: TimeoutAction
+// @@
+// @@     The action applied to timed-out requests.
+// @@
 type ModelQueuePolicy_TimeoutAction int32
 
 const (
@@ -627,11 +627,11 @@ func (ModelQueuePolicy_TimeoutAction) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{9, 0}
 }
 
-//@@
-//@@    .. cpp:enum:: Kind
-//@@
-//@@       The kind of the control.
-//@@
+// @@
+// @@    .. cpp:enum:: Kind
+// @@
+// @@       The kind of the control.
+// @@
 type ModelSequenceBatching_Control_Kind int32
 
 const (
@@ -717,13 +717,13 @@ func (ModelSequenceBatching_Control_Kind) EnumDescriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{11, 0, 0}
 }
 
-//@@
-//@@  .. cpp:var:: message ModelRateLimiter
-//@@
-//@@     The specifications required by the rate limiter to properly
-//@@     schedule the inference requests across the different models
-//@@     and their instances.
-//@@
+// @@
+// @@  .. cpp:var:: message ModelRateLimiter
+// @@
+// @@     The specifications required by the rate limiter to properly
+// @@     schedule the inference requests across the different models
+// @@     and their instances.
+// @@
 type ModelRateLimiter struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -794,12 +794,12 @@ func (x *ModelRateLimiter) GetPriority() uint32 {
 	return 0
 }
 
-//@@
-//@@.. cpp:var:: message ModelInstanceGroup
-//@@
-//@@   A group of one or more instances of a model and resources made
-//@@   available for those instances.
-//@@
+// @@
+// @@.. cpp:var:: message ModelInstanceGroup
+// @@
+// @@   A group of one or more instances of a model and resources made
+// @@   available for those instances.
+// @@
 type ModelInstanceGroup struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -972,11 +972,11 @@ func (x *ModelInstanceGroup) GetHostPolicy() string {
 	return ""
 }
 
-//@@
-//@@.. cpp:var:: message ModelTensorReshape
-//@@
-//@@   Reshape specification for input and output tensors.
-//@@
+// @@
+// @@.. cpp:var:: message ModelTensorReshape
+// @@
+// @@   Reshape specification for input and output tensors.
+// @@
 type ModelTensorReshape struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1028,11 +1028,11 @@ func (x *ModelTensorReshape) GetShape() []int64 {
 	return nil
 }
 
-//@@
-//@@.. cpp:var:: message ModelInput
-//@@
-//@@   An input required by the model.
-//@@
+// @@
+// @@.. cpp:var:: message ModelInput
+// @@
+// @@   An input required by the model.
+// @@
 type ModelInput struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1181,11 +1181,11 @@ func (x *ModelInput) GetOptional() bool {
 	return false
 }
 
-//@@
-//@@.. cpp:var:: message ModelOutput
-//@@
-//@@   An output produced by the model.
-//@@
+// @@
+// @@.. cpp:var:: message ModelOutput
+// @@
+// @@   An output produced by the model.
+// @@
 type ModelOutput struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1304,11 +1304,11 @@ func (x *ModelOutput) GetIsShapeTensor() bool {
 	return false
 }
 
-//@@  .. cpp:var:: message BatchInput
-//@@
-//@@     A batch input is an additional input that must be added by
-//@@     the backend based on all the requests in a batch.
-//@@
+// @@  .. cpp:var:: message BatchInput
+// @@
+// @@     A batch input is an additional input that must be added by
+// @@     the backend based on all the requests in a batch.
+// @@
 type BatchInput struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1400,11 +1400,11 @@ func (x *BatchInput) GetSourceInput() []string {
 	return nil
 }
 
-//@@.. cpp:var:: message BatchOutput
-//@@
-//@@   A batch output is an output produced by the model that must be handled
-//@@   differently by the backend based on all the requests in a batch.
-//@@
+// @@.. cpp:var:: message BatchOutput
+// @@
+// @@   A batch output is an output produced by the model that must be handled
+// @@   differently by the backend based on all the requests in a batch.
+// @@
 type BatchOutput struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1482,12 +1482,12 @@ func (x *BatchOutput) GetSourceInput() []string {
 	return nil
 }
 
-//@@
-//@@.. cpp:var:: message ModelVersionPolicy
-//@@
-//@@   Policy indicating which versions of a model should be made
-//@@   available by the inference server.
-//@@
+// @@
+// @@.. cpp:var:: message ModelVersionPolicy
+// @@
+// @@   Policy indicating which versions of a model should be made
+// @@   available by the inference server.
+// @@
 type ModelVersionPolicy struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1600,13 +1600,13 @@ func (*ModelVersionPolicy_All_) isModelVersionPolicy_PolicyChoice() {}
 
 func (*ModelVersionPolicy_Specific_) isModelVersionPolicy_PolicyChoice() {}
 
-//@@
-//@@.. cpp:var:: message ModelOptimizationPolicy
-//@@
-//@@   Optimization settings for a model. These settings control if/how a
-//@@   model is optimized and prioritized by the backend framework when
-//@@   it is loaded.
-//@@
+// @@
+// @@.. cpp:var:: message ModelOptimizationPolicy
+// @@
+// @@   Optimization settings for a model. These settings control if/how a
+// @@   model is optimized and prioritized by the backend framework when
+// @@   it is loaded.
+// @@
 type ModelOptimizationPolicy struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1757,11 +1757,11 @@ func (x *ModelOptimizationPolicy) GetEagerBatching() bool {
 	return false
 }
 
-//@@
-//@@.. cpp:var:: message ModelQueuePolicy
-//@@
-//@@   Queue policy for inference requests.
-//@@
+// @@
+// @@.. cpp:var:: message ModelQueuePolicy
+// @@
+// @@   Queue policy for inference requests.
+// @@
 type ModelQueuePolicy struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1861,12 +1861,12 @@ func (x *ModelQueuePolicy) GetMaxQueueSize() uint32 {
 	return 0
 }
 
-//@@
-//@@.. cpp:var:: message ModelDynamicBatching
-//@@
-//@@   Dynamic batching configuration. These settings control how dynamic
-//@@   batching operates for the model.
-//@@
+// @@
+// @@.. cpp:var:: message ModelDynamicBatching
+// @@
+// @@   Dynamic batching configuration. These settings control how dynamic
+// @@   batching operates for the model.
+// @@
 type ModelDynamicBatching struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2014,12 +2014,12 @@ func (x *ModelDynamicBatching) GetPriorityQueuePolicy() map[uint32]*ModelQueuePo
 	return nil
 }
 
-//@@
-//@@.. cpp:var:: message ModelSequenceBatching
-//@@
-//@@   Sequence batching configuration. These settings control how sequence
-//@@   batching operates for the model.
-//@@
+// @@
+// @@.. cpp:var:: message ModelSequenceBatching
+// @@
+// @@   Sequence batching configuration. These settings control how sequence
+// @@   batching operates for the model.
+// @@
 type ModelSequenceBatching struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2164,12 +2164,12 @@ func (*ModelSequenceBatching_Direct) isModelSequenceBatching_StrategyChoice() {}
 
 func (*ModelSequenceBatching_Oldest) isModelSequenceBatching_StrategyChoice() {}
 
-//@@
-//@@.. cpp:var:: message ModelEnsembling
-//@@
-//@@   Model ensembling configuration. These settings specify the models that
-//@@   compose the ensemble and how data flows between the models.
-//@@
+// @@
+// @@.. cpp:var:: message ModelEnsembling
+// @@
+// @@   Model ensembling configuration. These settings specify the models that
+// @@   compose the ensemble and how data flows between the models.
+// @@
 type ModelEnsembling struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2221,11 +2221,11 @@ func (x *ModelEnsembling) GetStep() []*ModelEnsembling_Step {
 	return nil
 }
 
-//@@
-//@@.. cpp:var:: message ModelParameter
-//@@
-//@@   A model parameter.
-//@@
+// @@
+// @@.. cpp:var:: message ModelParameter
+// @@
+// @@   A model parameter.
+// @@
 type ModelParameter struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2277,11 +2277,11 @@ func (x *ModelParameter) GetStringValue() string {
 	return ""
 }
 
-//@@
-//@@.. cpp:var:: message ModelWarmup
-//@@
-//@@   Settings used to construct the request sample for model warmup.
-//@@
+// @@
+// @@.. cpp:var:: message ModelWarmup
+// @@
+// @@   Settings used to construct the request sample for model warmup.
+// @@
 type ModelWarmup struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2361,11 +2361,11 @@ func (x *ModelWarmup) GetInputs() map[string]*ModelWarmup_Input {
 	return nil
 }
 
-//@@
-//@@ .. cpp:var:: message ModelOperations
-//@@
-//@@    The metadata of libraries providing custom operations for this model.
-//@@
+// @@
+// @@ .. cpp:var:: message ModelOperations
+// @@
+// @@    The metadata of libraries providing custom operations for this model.
+// @@
 type ModelOperations struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2418,12 +2418,12 @@ func (x *ModelOperations) GetOpLibraryFilename() []string {
 	return nil
 }
 
-//@@
-//@@ .. cpp:var:: message ModelTransactionPolicy
-//@@
-//@@    The specification that describes the nature of transactions
-//@@    to be expected from the model.
-//@@
+// @@
+// @@ .. cpp:var:: message ModelTransactionPolicy
+// @@
+// @@    The specification that describes the nature of transactions
+// @@    to be expected from the model.
+// @@
 type ModelTransactionPolicy struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2480,11 +2480,11 @@ func (x *ModelTransactionPolicy) GetDecoupled() bool {
 	return false
 }
 
-//@@
-//@@.. cpp:var:: message ModelRepositoryAgents
-//@@
-//@@   The repository agents for the model.
-//@@
+// @@
+// @@.. cpp:var:: message ModelRepositoryAgents
+// @@
+// @@   The repository agents for the model.
+// @@
 type ModelRepositoryAgents struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2539,11 +2539,11 @@ func (x *ModelRepositoryAgents) GetAgents() []*ModelRepositoryAgents_Agent {
 	return nil
 }
 
-//@@
-//@@.. cpp:var:: message ModelResponseCache
-//@@
-//@@   The response cache setting for the model.
-//@@
+// @@
+// @@.. cpp:var:: message ModelResponseCache
+// @@
+// @@   The response cache setting for the model.
+// @@
 type ModelResponseCache struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2600,11 +2600,11 @@ func (x *ModelResponseCache) GetEnable() bool {
 	return false
 }
 
-//@@
-//@@.. cpp:var:: message ModelConfig
-//@@
-//@@   A model configuration.
-//@@
+// @@
+// @@.. cpp:var:: message ModelConfig
+// @@
+// @@   A model configuration.
+// @@
 type ModelConfig struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3007,10 +3007,10 @@ func (*ModelConfig_SequenceBatching) isModelConfig_SchedulingChoice() {}
 
 func (*ModelConfig_EnsembleScheduling) isModelConfig_SchedulingChoice() {}
 
-//@@  .. cpp:var:: message Resource
-//@@
-//@@     The resource property.
-//@@
+// @@  .. cpp:var:: message Resource
+// @@
+// @@     The resource property.
+// @@
 type ModelRateLimiter_Resource struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3090,11 +3090,11 @@ func (x *ModelRateLimiter_Resource) GetCount() uint32 {
 	return 0
 }
 
-//@@
-//@@  .. cpp:var:: message SecondaryDevice
-//@@
-//@@     A secondary device required for a model instance.
-//@@
+// @@
+// @@  .. cpp:var:: message SecondaryDevice
+// @@
+// @@     A secondary device required for a model instance.
+// @@
 type ModelInstanceGroup_SecondaryDevice struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3158,11 +3158,11 @@ func (x *ModelInstanceGroup_SecondaryDevice) GetDeviceId() int64 {
 	return 0
 }
 
-//@@  .. cpp:var:: message Latest
-//@@
-//@@     Serve only the latest version(s) of a model. This is
-//@@     the default policy.
-//@@
+// @@  .. cpp:var:: message Latest
+// @@
+// @@     Serve only the latest version(s) of a model. This is
+// @@     the default policy.
+// @@
 type ModelVersionPolicy_Latest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3217,10 +3217,10 @@ func (x *ModelVersionPolicy_Latest) GetNumVersions() uint32 {
 	return 0
 }
 
-//@@  .. cpp:var:: message All
-//@@
-//@@     Serve all versions of the model.
-//@@
+// @@  .. cpp:var:: message All
+// @@
+// @@     Serve all versions of the model.
+// @@
 type ModelVersionPolicy_All struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3259,10 +3259,10 @@ func (*ModelVersionPolicy_All) Descriptor() ([]byte, []int) {
 	return file_pkg_agent_repository_triton_config_model_config_proto_rawDescGZIP(), []int{7, 1}
 }
 
-//@@  .. cpp:var:: message Specific
-//@@
-//@@     Serve only specific versions of the model.
-//@@
+// @@  .. cpp:var:: message Specific
+// @@
+// @@     Serve only specific versions of the model.
+// @@
 type ModelVersionPolicy_Specific struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3314,16 +3314,16 @@ func (x *ModelVersionPolicy_Specific) GetVersions() []int64 {
 	return nil
 }
 
-//@@
-//@@  .. cpp:var:: message Graph
-//@@
-//@@     Enable generic graph optimization of the model. If not specified
-//@@     the framework's default level of optimization is used. Supports
-//@@     TensorFlow graphdef and savedmodel and Onnx models. For TensorFlow
-//@@     causes XLA to be enabled/disabled for the model. For Onnx defaults
-//@@     to enabling all optimizations, -1 enables only basic optimizations,
-//@@     +1 enables only basic and extended optimizations.
-//@@
+// @@
+// @@  .. cpp:var:: message Graph
+// @@
+// @@     Enable generic graph optimization of the model. If not specified
+// @@     the framework's default level of optimization is used. Supports
+// @@     TensorFlow graphdef and savedmodel and Onnx models. For TensorFlow
+// @@     causes XLA to be enabled/disabled for the model. For Onnx defaults
+// @@     to enabling all optimizations, -1 enables only basic optimizations,
+// @@     +1 enables only basic and extended optimizations.
+// @@
 type ModelOptimizationPolicy_Graph struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3380,11 +3380,11 @@ func (x *ModelOptimizationPolicy_Graph) GetLevel() int32 {
 	return 0
 }
 
-//@@
-//@@  .. cpp:var:: message Cuda
-//@@
-//@@     CUDA-specific optimization settings.
-//@@
+// @@
+// @@  .. cpp:var:: message Cuda
+// @@
+// @@     CUDA-specific optimization settings.
+// @@
 type ModelOptimizationPolicy_Cuda struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3485,22 +3485,22 @@ func (x *ModelOptimizationPolicy_Cuda) GetOutputCopyStream() bool {
 	return false
 }
 
-//@@
-//@@  .. cpp:var:: message ExecutionAccelerators
-//@@
-//@@     Specify the preferred execution accelerators to be used to execute
-//@@     the model. Currently only recognized by ONNX Runtime backend and
-//@@     TensorFlow backend.
-//@@
-//@@     For ONNX Runtime backend, it will deploy the model with the execution
-//@@     accelerators by priority, the priority is determined based on the
-//@@     order that they are set, i.e. the provider at the front has highest
-//@@     priority. Overall, the priority will be in the following order:
-//@@          (if instance is on GPU)
-//@@         CUDA Execution Provider     (if instance is on GPU)
-//@@         
-//@@         Default CPU Execution Provider
-//@@
+// @@
+// @@  .. cpp:var:: message ExecutionAccelerators
+// @@
+// @@     Specify the preferred execution accelerators to be used to execute
+// @@     the model. Currently only recognized by ONNX Runtime backend and
+// @@     TensorFlow backend.
+// @@
+// @@     For ONNX Runtime backend, it will deploy the model with the execution
+// @@     accelerators by priority, the priority is determined based on the
+// @@     order that they are set, i.e. the provider at the front has highest
+// @@     priority. Overall, the priority will be in the following order:
+// @@          (if instance is on GPU)
+// @@         CUDA Execution Provider     (if instance is on GPU)
+// @@         
+// @@         Default CPU Execution Provider
+// @@
 type ModelOptimizationPolicy_ExecutionAccelerators struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3602,19 +3602,19 @@ func (x *ModelOptimizationPolicy_ExecutionAccelerators) GetCpuExecutionAccelerat
 	return nil
 }
 
-//@@
-//@@  .. cpp:var:: message PinnedMemoryBuffer
-//@@
-//@@     Specify whether to use a pinned memory buffer when transferring data
-//@@     between non-pinned system memory and GPU memory. Using a pinned
-//@@     memory buffer for system from/to GPU transfers will typically provide
-//@@     increased performance. For example, in the common use case where the
-//@@     request provides inputs and delivers outputs via non-pinned system
-//@@     memory, if the model instance accepts GPU IOs, the inputs will be
-//@@     processed by two copies: from non-pinned system memory to pinned
-//@@     memory, and from pinned memory to GPU memory. Similarly, pinned
-//@@     memory will be used for delivering the outputs.
-//@@
+// @@
+// @@  .. cpp:var:: message PinnedMemoryBuffer
+// @@
+// @@     Specify whether to use a pinned memory buffer when transferring data
+// @@     between non-pinned system memory and GPU memory. Using a pinned
+// @@     memory buffer for system from/to GPU transfers will typically provide
+// @@     increased performance. For example, in the common use case where the
+// @@     request provides inputs and delivers outputs via non-pinned system
+// @@     memory, if the model instance accepts GPU IOs, the inputs will be
+// @@     processed by two copies: from non-pinned system memory to pinned
+// @@     memory, and from pinned memory to GPU memory. Similarly, pinned
+// @@     memory will be used for delivering the outputs.
+// @@
 type ModelOptimizationPolicy_PinnedMemoryBuffer struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3666,10 +3666,10 @@ func (x *ModelOptimizationPolicy_PinnedMemoryBuffer) GetEnable() bool {
 	return false
 }
 
-//@@    .. cpp:var:: message GraphSpec
-//@@
-//@@       Specification of the CUDA graph to be captured.
-//@@
+// @@    .. cpp:var:: message GraphSpec
+// @@
+// @@       Specification of the CUDA graph to be captured.
+// @@
 type ModelOptimizationPolicy_Cuda_GraphSpec struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3757,10 +3757,10 @@ func (x *ModelOptimizationPolicy_Cuda_GraphSpec) GetGraphLowerBound() *ModelOpti
 	return nil
 }
 
-//@@      .. cpp:var:: message Dims
-//@@
-//@@         Specification of tensor dimension.
-//@@
+// @@      .. cpp:var:: message Dims
+// @@
+// @@         Specification of tensor dimension.
+// @@
 type ModelOptimizationPolicy_Cuda_GraphSpec_Shape struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3878,13 +3878,13 @@ func (x *ModelOptimizationPolicy_Cuda_GraphSpec_LowerBound) GetInput() map[strin
 	return nil
 }
 
-//@@
-//@@  .. cpp:var:: message Accelerator
-//@@
-//@@     Specify the accelerator to be used to execute the model.
-//@@     Accelerator with the same name may accept different parameters
-//@@     depending on the backends.
-//@@
+// @@
+// @@  .. cpp:var:: message Accelerator
+// @@
+// @@     Specify the accelerator to be used to execute the model.
+// @@     Accelerator with the same name may accept different parameters
+// @@     depending on the backends.
+// @@
 type ModelOptimizationPolicy_ExecutionAccelerators_Accelerator struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3948,11 +3948,11 @@ func (x *ModelOptimizationPolicy_ExecutionAccelerators_Accelerator) GetParameter
 	return nil
 }
 
-//@@  .. cpp:var:: message Control
-//@@
-//@@     A control is a signal that the sequence batcher uses to
-//@@     communicate with a backend.
-//@@
+// @@  .. cpp:var:: message Control
+// @@
+// @@     A control is a signal that the sequence batcher uses to
+// @@     communicate with a backend.
+// @@
 type ModelSequenceBatching_Control struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4064,10 +4064,10 @@ func (x *ModelSequenceBatching_Control) GetDataType() DataType {
 	return DataType_TYPE_INVALID
 }
 
-//@@  .. cpp:var:: message ControlInput
-//@@
-//@@     The sequence control values to communicate by a model input.
-//@@
+// @@  .. cpp:var:: message ControlInput
+// @@
+// @@     The sequence control values to communicate by a model input.
+// @@
 type ModelSequenceBatching_ControlInput struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4132,11 +4132,11 @@ func (x *ModelSequenceBatching_ControlInput) GetControl() []*ModelSequenceBatchi
 	return nil
 }
 
-//@@
-//@@  .. cpp:var:: message InitialState
-//@@
-//@@     Settings used to initialize data for implicit state.
-//@@
+// @@
+// @@  .. cpp:var:: message InitialState
+// @@
+// @@     Settings used to initialize data for implicit state.
+// @@
 type ModelSequenceBatching_InitialState struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4273,10 +4273,10 @@ func (*ModelSequenceBatching_InitialState_ZeroData) isModelSequenceBatching_Init
 func (*ModelSequenceBatching_InitialState_DataFile) isModelSequenceBatching_InitialState_StateData() {
 }
 
-//@@  .. cpp:var:: message State
-//@@
-//@@     An input / output pair of tensors that carry state for the sequence.
-//@@
+// @@  .. cpp:var:: message State
+// @@
+// @@     An input / output pair of tensors that carry state for the sequence.
+// @@
 type ModelSequenceBatching_State struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4376,14 +4376,14 @@ func (x *ModelSequenceBatching_State) GetInitialState() []*ModelSequenceBatching
 	return nil
 }
 
-//@@  .. cpp:var:: message StrategyDirect
-//@@
-//@@     The sequence batcher uses a specific, unique batch
-//@@     slot for each sequence. All inference requests in a
-//@@     sequence are directed to the same batch slot in the same
-//@@     model instance over the lifetime of the sequence. This
-//@@     is the default strategy.
-//@@
+// @@  .. cpp:var:: message StrategyDirect
+// @@
+// @@     The sequence batcher uses a specific, unique batch
+// @@     slot for each sequence. All inference requests in a
+// @@     sequence are directed to the same batch slot in the same
+// @@     model instance over the lifetime of the sequence. This
+// @@     is the default strategy.
+// @@
 type ModelSequenceBatching_StrategyDirect struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4458,17 +4458,17 @@ func (x *ModelSequenceBatching_StrategyDirect) GetMinimumSlotUtilization() float
 	return 0
 }
 
-//@@  .. cpp:var:: message StrategyOldest
-//@@
-//@@     The sequence batcher maintains up to 'max_candidate_sequences'
-//@@     candidate sequences. 'max_candidate_sequences' can be greater
-//@@     than the model's 'max_batch_size'. For inferencing the batcher
-//@@     chooses from the candidate sequences up to 'max_batch_size'
-//@@     inference requests. Requests are chosen in an oldest-first
-//@@     manner across all candidate sequences. A given sequence is
-//@@     not guaranteed to be assigned to the same batch slot for
-//@@     all inference requests of that sequence.
-//@@
+// @@  .. cpp:var:: message StrategyOldest
+// @@
+// @@     The sequence batcher maintains up to 'max_candidate_sequences'
+// @@     candidate sequences. 'max_candidate_sequences' can be greater
+// @@     than the model's 'max_batch_size'. For inferencing the batcher
+// @@     chooses from the candidate sequences up to 'max_batch_size'
+// @@     inference requests. Requests are chosen in an oldest-first
+// @@     manner across all candidate sequences. A given sequence is
+// @@     not guaranteed to be assigned to the same batch slot for
+// @@     all inference requests of that sequence.
+// @@
 type ModelSequenceBatching_StrategyOldest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4553,12 +4553,12 @@ func (x *ModelSequenceBatching_StrategyOldest) GetMaxQueueDelayMicroseconds() ui
 	return 0
 }
 
-//@@  .. cpp:var:: message Step
-//@@
-//@@     Each step specifies a model included in the ensemble,
-//@@     maps ensemble tensor names to the model input tensors,
-//@@     and maps model output tensors to ensemble tensor names
-//@@
+// @@  .. cpp:var:: message Step
+// @@
+// @@     Each step specifies a model included in the ensemble,
+// @@     maps ensemble tensor names to the model input tensors,
+// @@     and maps model output tensors to ensemble tensor names
+// @@
 type ModelEnsembling_Step struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4655,11 +4655,11 @@ func (x *ModelEnsembling_Step) GetOutputMap() map[string]string {
 	return nil
 }
 
-//@@
-//@@  .. cpp:var:: message Input
-//@@
-//@@     Meta data associated with an input.
-//@@
+// @@
+// @@  .. cpp:var:: message Input
+// @@
+// @@     Meta data associated with an input.
+// @@
 type ModelWarmup_Input struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4805,12 +4805,12 @@ func (*ModelWarmup_Input_RandomData) isModelWarmup_Input_InputDataType() {}
 
 func (*ModelWarmup_Input_InputDataFile) isModelWarmup_Input_InputDataType() {}
 
-//@@
-//@@  .. cpp:var:: message Agent
-//@@
-//@@     A repository agent that should be invoked for the specified
-//@@     repository actions for this model.
-//@@
+// @@
+// @@  .. cpp:var:: message Agent
+// @@
+// @@     A repository agent that should be invoked for the specified
+// @@     repository actions for this model.
+// @@
 type ModelRepositoryAgents_Agent struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
diff --git a/scheduler/pkg/kafka/dataflow/server.go b/scheduler/pkg/kafka/dataflow/server.go
index 337fa380a3..c1b835fa2f 100644
--- a/scheduler/pkg/kafka/dataflow/server.go
+++ b/scheduler/pkg/kafka/dataflow/server.go
@@ -168,23 +168,37 @@ func (c *ChainerServer) StopSendPipelineEvents() {
 	}
 }
 
-func (c *ChainerServer) createTopicSources(inputs []string, pipelineName string) []string {
-	var sources []string
+// Create the topics for pipeline inputs
+// This will be pipeline inputs/outputs or model topics
+func (c *ChainerServer) createPipelineTopicSources(inputs []string) []*chainer.PipelineTopic {
+	var pipelineTopics []*chainer.PipelineTopic
+	for _, inp := range inputs {
+		// The pipeline name being referred to by the input specification
+		pipelineName := c.topicNamer.GetPipelineNameFromInput(inp)
+		// The topic being referred to: either pipeline or model
+		source := c.topicNamer.GetModelOrPipelineTopic(pipelineName, c.topicNamer.CreateStepReferenceFromPipelineInput(inp))
+		pipelineTopics = append(pipelineTopics, &chainer.PipelineTopic{PipelineName: pipelineName, TopicName: source})
+	}
+	return pipelineTopics
+}
+
+func (c *ChainerServer) createTopicSources(inputs []string, pipelineName string) []*chainer.PipelineTopic {
+	var pipelineTopics []*chainer.PipelineTopic
 	for _, inp := range inputs {
 		source := c.topicNamer.GetModelOrPipelineTopic(pipelineName, inp)
-		sources = append(sources, source)
+		pipelineTopics = append(pipelineTopics, &chainer.PipelineTopic{PipelineName: pipelineName, TopicName: source})
 	}
-	if len(sources) == 0 {
-		sources = append(sources, c.topicNamer.GetPipelineTopicInputs(pipelineName))
+	if len(pipelineTopics) == 0 {
+		pipelineTopics = append(pipelineTopics, &chainer.PipelineTopic{PipelineName: pipelineName, TopicName: c.topicNamer.GetPipelineTopicInputs(pipelineName)})
 	}
-	return sources
+	return pipelineTopics
 }
 
-func (c *ChainerServer) createTriggerSources(inputs []string, pipelineName string) []string {
-	var sources []string
+func (c *ChainerServer) createTriggerSources(inputs []string, pipelineName string) []*chainer.PipelineTopic {
+	var sources []*chainer.PipelineTopic
 	for _, inp := range inputs {
 		source := c.topicNamer.GetModelOrPipelineTopic(pipelineName, inp)
-		sources = append(sources, source)
+		sources = append(sources, &chainer.PipelineTopic{PipelineName: pipelineName, TopicName: source})
 	}
 	return sources
 }
@@ -195,7 +209,7 @@ func (c *ChainerServer) createPipelineMessage(pv *pipeline.PipelineVersion) *cha
 		stepUpdate := chainer.PipelineStepUpdate{
 			Sources:   c.createTopicSources(step.Inputs, pv.Name),
 			Triggers:  c.createTriggerSources(step.Triggers, pv.Name),
-			Sink:      c.topicNamer.GetModelTopicInputs(step.Name),
+			Sink:      &chainer.PipelineTopic{PipelineName: pv.Name, TopicName: c.topicNamer.GetModelTopicInputs(step.Name)},
 			TensorMap: c.topicNamer.GetFullyQualifiedTensorMap(pv.Name, step.TensorMap),
 		}
 		switch step.InputsJoinType {
@@ -223,10 +237,36 @@ func (c *ChainerServer) createPipelineMessage(pv *pipeline.PipelineVersion) *cha
 		c.logger.Infof("Adding sources %v to %s", stepUpdate.Sources, stepUpdate.Sink)
 		stepUpdates = append(stepUpdates, &stepUpdate)
 	}
+	if pv.Input != nil {
+		stepUpdate := chainer.PipelineStepUpdate{
+			Sources:   c.createPipelineTopicSources(pv.Input.ExternalInputs),
+			Sink:      &chainer.PipelineTopic{PipelineName: pv.Name, TopicName: c.topicNamer.GetPipelineTopicInputs(pv.Name)},
+			Triggers:  c.createPipelineTopicSources(pv.Input.ExternalTriggers),
+			TensorMap: c.topicNamer.GetFullyQualifiedPipelineTensorMap(pv.Input.TensorMap),
+		}
+		switch pv.Input.InputsJoinType {
+		case pipeline.JoinInner:
+			stepUpdate.InputJoinTy = chainer.PipelineStepUpdate_Inner
+		case pipeline.JoinOuter:
+			stepUpdate.InputJoinTy = chainer.PipelineStepUpdate_Outer
+		case pipeline.JoinAny:
+			stepUpdate.InputJoinTy = chainer.PipelineStepUpdate_Any
+		}
+		switch pv.Input.TriggersJoinType {
+		case pipeline.JoinInner:
+			stepUpdate.TriggersJoinTy = chainer.PipelineStepUpdate_Inner
+		case pipeline.JoinOuter:
+			stepUpdate.TriggersJoinTy = chainer.PipelineStepUpdate_Outer
+		case pipeline.JoinAny:
+			stepUpdate.TriggersJoinTy = chainer.PipelineStepUpdate_Any
+		}
+		c.logger.Infof("Adding input sources %v with tensorMap %v to %s", stepUpdate.Sources, stepUpdate.TensorMap, stepUpdate.Sink)
+		stepUpdates = append(stepUpdates, &stepUpdate)
+	}
 	if pv.Output != nil {
 		stepUpdate := chainer.PipelineStepUpdate{
 			Sources:   c.createTopicSources(pv.Output.Steps, pv.Name),
-			Sink:      c.topicNamer.GetPipelineTopicOutputs(pv.Name),
+			Sink:      &chainer.PipelineTopic{PipelineName: pv.Name, TopicName: c.topicNamer.GetPipelineTopicOutputs(pv.Name)},
 			TensorMap: c.topicNamer.GetFullyQualifiedTensorMap(pv.Name, pv.Output.TensorMap),
 		}
 		switch pv.Output.StepsJoinType {
@@ -242,8 +282,8 @@ func (c *ChainerServer) createPipelineMessage(pv *pipeline.PipelineVersion) *cha
 	}
 	//Append an error step to send any errors to pipeline output
 	stepUpdates = append(stepUpdates, &chainer.PipelineStepUpdate{
-		Sources:     []string{c.topicNamer.GetModelErrorTopic()},
-		Sink:        c.topicNamer.GetPipelineTopicOutputs(pv.Name),
+		Sources:     []*chainer.PipelineTopic{{PipelineName: pv.Name, TopicName: c.topicNamer.GetModelErrorTopic()}},
+		Sink:        &chainer.PipelineTopic{PipelineName: pv.Name, TopicName: c.topicNamer.GetPipelineTopicOutputs(pv.Name)},
 		InputJoinTy: chainer.PipelineStepUpdate_Inner,
 	})
 
diff --git a/scheduler/pkg/kafka/dataflow/server_test.go b/scheduler/pkg/kafka/dataflow/server_test.go
index 5d5b6258da..4cf4e78987 100644
--- a/scheduler/pkg/kafka/dataflow/server_test.go
+++ b/scheduler/pkg/kafka/dataflow/server_test.go
@@ -19,6 +19,8 @@ package dataflow
 import (
 	"testing"
 
+	"github.com/seldonio/seldon-core/apis/go/v2/mlops/chainer"
+
 	"github.com/seldonio/seldon-core/scheduler/v2/pkg/kafka"
 
 	. "github.com/onsi/gomega"
@@ -33,7 +35,7 @@ func TestCreateTopicSources(t *testing.T) {
 		server       *ChainerServer
 		pipelineName string
 		inputs       []string
-		sources      []string
+		sources      []*chainer.PipelineTopic
 	}
 
 	tests := []test{
@@ -49,10 +51,10 @@ func TestCreateTopicSources(t *testing.T) {
 				"b.inputs",
 				"c.inputs.t1",
 			},
-			sources: []string{
-				"seldon.default.model.a",
-				"seldon.default.model.b.inputs",
-				"seldon.default.model.c.inputs.t1",
+			sources: []*chainer.PipelineTopic{
+				{PipelineName: "p1", TopicName: "seldon.default.model.a"},
+				{PipelineName: "p1", TopicName: "seldon.default.model.b.inputs"},
+				{PipelineName: "p1", TopicName: "seldon.default.model.c.inputs.t1"},
 			},
 		},
 		{
@@ -63,8 +65,8 @@ func TestCreateTopicSources(t *testing.T) {
 			},
 			pipelineName: "p1",
 			inputs:       []string{},
-			sources: []string{
-				"seldon.ns1.pipeline.p1.inputs",
+			sources: []*chainer.PipelineTopic{
+				{PipelineName: "p1", TopicName: "seldon.ns1.pipeline.p1.inputs"},
 			},
 		},
 	}
@@ -75,3 +77,46 @@ func TestCreateTopicSources(t *testing.T) {
 		})
 	}
 }
+
+func TestCreatePipelineTopicSources(t *testing.T) {
+	g := NewGomegaWithT(t)
+
+	type test struct {
+		name         string
+		server       *ChainerServer
+		pipelineName string
+		inputs       []string
+		sources      []*chainer.PipelineTopic
+	}
+
+	tests := []test{
+		{
+			name: "misc inputs",
+			server: &ChainerServer{
+				logger:     log.New(),
+				topicNamer: kafka.NewTopicNamer("default"),
+			},
+			pipelineName: "p1",
+			inputs: []string{
+				"foo.inputs",
+				"foo.outputs",
+				"foo.step.bar.inputs",
+				"foo.step.bar.outputs",
+				"foo.step.bar.inputs.tensora",
+			},
+			sources: []*chainer.PipelineTopic{
+				{PipelineName: "foo", TopicName: "seldon.default.pipeline.foo.inputs"},
+				{PipelineName: "foo", TopicName: "seldon.default.pipeline.foo.outputs"},
+				{PipelineName: "foo", TopicName: "seldon.default.model.bar.inputs"},
+				{PipelineName: "foo", TopicName: "seldon.default.model.bar.outputs"},
+				{PipelineName: "foo", TopicName: "seldon.default.model.bar.inputs.tensora"},
+			},
+		},
+	}
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			sources := test.server.createPipelineTopicSources(test.inputs)
+			g.Expect(sources).To(Equal(test.sources))
+		})
+	}
+}
diff --git a/scheduler/pkg/kafka/gateway/infer.go b/scheduler/pkg/kafka/gateway/infer.go
index 24de0ccd0f..85bc090380 100644
--- a/scheduler/pkg/kafka/gateway/infer.go
+++ b/scheduler/pkg/kafka/gateway/infer.go
@@ -333,6 +333,7 @@ func (kc *InferKafkaHandler) Serve() {
 				span.SetAttributes(attribute.String(util.RequestIdHeader, string(e.Key)))
 
 				headers := collectHeaders(e.Headers)
+				logger.Debugf("Headers received from kafka for model %s %v", modelName, e.Headers)
 
 				job := InferWork{
 					modelName: modelName,
diff --git a/scheduler/pkg/kafka/gateway/manager.go b/scheduler/pkg/kafka/gateway/manager.go
index 33129ca015..95d8c366f4 100644
--- a/scheduler/pkg/kafka/gateway/manager.go
+++ b/scheduler/pkg/kafka/gateway/manager.go
@@ -99,7 +99,7 @@ func (cm *ConsumerManager) stopEmptyConsumer(ic *InferKafkaHandler) {
 	logger := cm.logger.WithField("func", "stopEmptyConsumer")
 	numModelsInConsumer := ic.GetNumModels()
 	if numModelsInConsumer == 0 {
-		logger.Debugf("Deleting consumer with no models wit bucket id %s", ic.consumerName)
+		logger.Debugf("Deleting consumer with no models with bucket id %s", ic.consumerName)
 		ic.Stop()
 		delete(cm.consumers, ic.consumerName)
 	}
diff --git a/scheduler/pkg/kafka/gateway/worker.go b/scheduler/pkg/kafka/gateway/worker.go
index 8c3bb5a3fa..4b68d9bb0c 100644
--- a/scheduler/pkg/kafka/gateway/worker.go
+++ b/scheduler/pkg/kafka/gateway/worker.go
@@ -229,6 +229,11 @@ func (iw *InferWorker) produce(ctx context.Context, job *InferWork, topic string
 			}
 		}
 	}
+	if logger.Logger.IsLevelEnabled(log.DebugLevel) {
+		for _, h := range kafkaHeaders {
+			logger.Debugf("Adding kafka header for topic %s %s:%s", topic, h.Key, string(h.Value))
+		}
+	}
 	logger.Infof("Produce response to topic %s", topic)
 
 	msg := &kafka.Message{
diff --git a/scheduler/pkg/kafka/topics.go b/scheduler/pkg/kafka/topics.go
index 9e3cf3ddc2..73e73728ad 100644
--- a/scheduler/pkg/kafka/topics.go
+++ b/scheduler/pkg/kafka/topics.go
@@ -20,6 +20,8 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/seldonio/seldon-core/apis/go/v2/mlops/chainer"
+
 	"github.com/seldonio/seldon-core/scheduler/v2/pkg/store/pipeline"
 )
 
@@ -58,7 +60,7 @@ func (tn *TopicNamer) GetKafkaModelTopicRegex() string {
 func (tn *TopicNamer) GetModelNameFromModelInputTopic(topic string) (string, error) {
 	parts := strings.Split(topic, ".")
 	if len(parts) != 5 {
-		return "", fmt.Errorf("Wrong number of sections in topic %s. Whas expecting 5 with separator '.'", topic)
+		return "", fmt.Errorf("Wrong number of sections in topic %s. Was expecting 5 with separator '.'", topic)
 	}
 	if parts[0] != seldonTopicPrefix || parts[1] != tn.namespace || parts[2] != modelTopic || parts[4] != inputsSuffix {
 		return "", fmt.Errorf("Bad topic name %s needs to match %s", topic, tn.GetKafkaModelTopicRegex())
@@ -92,17 +94,60 @@ func (tn *TopicNamer) GetModelOrPipelineTopic(pipelineName string, stepReference
 
 }
 
-func (tn *TopicNamer) GetFullyQualifiedTensorMap(pipelineName string, tin map[string]string) map[string]string {
-	tout := make(map[string]string)
-	for k, v := range tin {
+func (tn *TopicNamer) GetFullyQualifiedTensorMap(pipelineName string, userTensorMap map[string]string) []*chainer.PipelineTensorMapping {
+	var mappings []*chainer.PipelineTensorMapping
+	for k, v := range userTensorMap {
 		stepName := strings.Split(k, pipeline.StepNameSeperator)[0]
-		var kout string
+		var topicAndTensor string
 		if stepName == pipelineName {
-			kout = fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, pipelineTopic, k)
+			topicAndTensor = fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, pipelineTopic, k)
 		} else {
-			kout = fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, modelTopic, k)
+			topicAndTensor = fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, modelTopic, k)
+		}
+		mappings = append(mappings, &chainer.PipelineTensorMapping{
+			PipelineName:   pipelineName,
+			TopicAndTensor: topicAndTensor,
+			TensorName:     v,
+		})
+	}
+	return mappings
+}
+
+func (tn *TopicNamer) GetFullyQualifiedPipelineTensorMap(tin map[string]string) []*chainer.PipelineTensorMapping {
+	var mappings []*chainer.PipelineTensorMapping
+	for k, v := range tin {
+		parts := strings.Split(k, pipeline.StepNameSeperator)
+		var topicAndTensor string
+		switch len(parts) {
+		case 3: // A pipeline reference ..
+			topicAndTensor = fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, pipelineTopic, k)
+		case 5: // A fully qualified pipeline step tensor  .step...
+			// take value after .step
+			topicAndTensor = fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, modelTopic, strings.Join(parts[2:], pipeline.StepNameSeperator))
 		}
-		tout[kout] = v
+		mappings = append(mappings, &chainer.PipelineTensorMapping{
+			PipelineName:   parts[0],
+			TopicAndTensor: topicAndTensor,
+			TensorName:     v,
+		})
+	}
+	return mappings
+}
+
+// Always the initial part for pipeline inputs
+// . etc
+func (tn *TopicNamer) GetPipelineNameFromInput(inputSpecifier string) string {
+	return strings.Split(inputSpecifier, pipeline.StepNameSeperator)[0]
+}
+
+// if pipelineInput return it: .
+// If pipeline step return stepName (which is a model reference) onwards: .step...(tensorName)?
+func (tn *TopicNamer) CreateStepReferenceFromPipelineInput(pipelineInputs string) string {
+	parts := strings.Split(pipelineInputs, pipeline.StepNameSeperator)
+	switch parts[1] {
+	case pipeline.StepInputSpecifier, pipeline.StepOutputSpecifier:
+		return pipelineInputs
+	default:
+		return strings.Join(parts[2:], pipeline.StepNameSeperator)
 	}
-	return tout
 }
diff --git a/scheduler/pkg/kafka/topics_test.go b/scheduler/pkg/kafka/topics_test.go
index 5a09a1b479..0ae116e303 100644
--- a/scheduler/pkg/kafka/topics_test.go
+++ b/scheduler/pkg/kafka/topics_test.go
@@ -19,6 +19,8 @@ package kafka
 import (
 	"testing"
 
+	"github.com/seldonio/seldon-core/apis/go/v2/mlops/chainer"
+
 	. "github.com/onsi/gomega"
 )
 
@@ -79,7 +81,7 @@ func TestGetFullyQualifiedTensorMap(t *testing.T) {
 		pipelineName string
 		topicNamer   *TopicNamer
 		in           map[string]string
-		expected     map[string]string
+		expected     []*chainer.PipelineTensorMapping
 	}
 
 	tests := []test{
@@ -88,23 +90,107 @@ func TestGetFullyQualifiedTensorMap(t *testing.T) {
 			pipelineName: "test",
 			topicNamer:   NewTopicNamer("default"),
 			in:           map[string]string{"step.inputs.t1": "t1in", "step.inputs.t2": "t2in"},
-			expected:     map[string]string{"seldon.default.model.step.inputs.t1": "t1in", "seldon.default.model.step.inputs.t2": "t2in"},
+			expected: []*chainer.PipelineTensorMapping{
+				{
+					PipelineName:   "test",
+					TopicAndTensor: "seldon.default.model.step.inputs.t1",
+					TensorName:     "t1in",
+				},
+				{
+					PipelineName:   "test",
+					TopicAndTensor: "seldon.default.model.step.inputs.t2",
+					TensorName:     "t2in",
+				},
+			},
 		},
 		{
 			name:         "pipeline references",
 			pipelineName: "test",
 			topicNamer:   NewTopicNamer("default"),
 			in:           map[string]string{"test.inputs.t1": "t1"},
-			expected:     map[string]string{"seldon.default.pipeline.test.inputs.t1": "t1"},
+			expected: []*chainer.PipelineTensorMapping{
+				{
+					PipelineName:   "test",
+					TopicAndTensor: "seldon.default.pipeline.test.inputs.t1",
+					TensorName:     "t1",
+				},
+			},
 		},
 	}
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
-			res := test.topicNamer.GetFullyQualifiedTensorMap(test.pipelineName, test.in)
-			for k, v := range res {
-				g.Expect(v).To(Equal(test.expected[k]))
+			results := test.topicNamer.GetFullyQualifiedTensorMap(test.pipelineName, test.in)
+			for _, tm := range results {
+				found := false
+				for _, exp := range test.expected {
+					if tm.PipelineName == exp.PipelineName &&
+						tm.TopicAndTensor == exp.TopicAndTensor &&
+						tm.TensorName == exp.TensorName {
+						found = true
+						break
+					}
+				}
+				g.Expect(found).To(BeTrue())
 			}
+		})
+	}
+}
+
+func TestGetFullyQualifiedPipelineTensorMap(t *testing.T) {
+	g := NewGomegaWithT(t)
 
+	type test struct {
+		name       string
+		topicNamer *TopicNamer
+		in         map[string]string
+		expected   *chainer.PipelineTensorMapping
+	}
+
+	tests := []test{
+		{
+			name:       "pipeline inputs",
+			topicNamer: NewTopicNamer("default"),
+			in: map[string]string{
+				"pipeline1.inputs.input1": "t1in",
+			},
+			expected: &chainer.PipelineTensorMapping{
+				PipelineName:   "pipeline1",
+				TopicAndTensor: "seldon.default.pipeline.pipeline1.inputs.input1",
+				TensorName:     "t1in",
+			},
+		},
+		{
+			name:       "pipeline outputs",
+			topicNamer: NewTopicNamer("default"),
+			in: map[string]string{
+				"pipeline2.outputs.output1": "output2",
+			},
+			expected: &chainer.PipelineTensorMapping{
+				PipelineName:   "pipeline2",
+				TopicAndTensor: "seldon.default.pipeline.pipeline2.outputs.output1",
+				TensorName:     "output2",
+			},
+		},
+		{
+			name:       "basic",
+			topicNamer: NewTopicNamer("default"),
+			in: map[string]string{
+				"pipeline3.steps.model1.outputs.output1": "output2",
+			},
+			expected: &chainer.PipelineTensorMapping{
+				PipelineName:   "pipeline3",
+				TopicAndTensor: "seldon.default.model.model1.outputs.output1",
+				TensorName:     "output2",
+			},
+		},
+	}
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			results := test.topicNamer.GetFullyQualifiedPipelineTensorMap(test.in)
+			result := results[0]
+			g.Expect(result.PipelineName).To(Equal(test.expected.PipelineName))
+			g.Expect(result.TopicAndTensor).To(Equal(test.expected.TopicAndTensor))
+			g.Expect(result.TensorName).To(Equal(test.expected.TensorName))
 		})
 	}
 }
diff --git a/scheduler/pkg/proxy/chainer.go b/scheduler/pkg/proxy/chainer.go
index 47223518a3..0d37874e6d 100644
--- a/scheduler/pkg/proxy/chainer.go
+++ b/scheduler/pkg/proxy/chainer.go
@@ -79,13 +79,13 @@ func (pc *ProxyChainer) SubscribePipelineUpdates(
 				Uid:      "1234",
 				Updates: []*chainer.PipelineStepUpdate{
 					&chainer.PipelineStepUpdate{
-						Sources:     []string{chainerInputTopic1},
-						Sink:        chainerOutputTopic1,
+						Sources:     []*chainer.PipelineTopic{{PipelineName: "some-pipeline", TopicName: chainerInputTopic1}},
+						Sink:        &chainer.PipelineTopic{PipelineName: "some-pipeline", TopicName: chainerOutputTopic1},
 						InputJoinTy: chainer.PipelineStepUpdate_Inner,
 					},
 					&chainer.PipelineStepUpdate{
-						Sources:     []string{chainerInputTopic2},
-						Sink:        chainerOutputTopic2,
+						Sources:     []*chainer.PipelineTopic{{PipelineName: "some-pipeline", TopicName: chainerInputTopic2}},
+						Sink:        &chainer.PipelineTopic{PipelineName: "some-pipeline", TopicName: chainerOutputTopic2},
 						InputJoinTy: chainer.PipelineStepUpdate_Inner,
 					},
 				},
diff --git a/scheduler/pkg/store/pipeline/errors.go b/scheduler/pkg/store/pipeline/errors.go
index bc5c4107ab..562a5b5da0 100644
--- a/scheduler/pkg/store/pipeline/errors.go
+++ b/scheduler/pkg/store/pipeline/errors.go
@@ -192,3 +192,13 @@ type PipelineStepNameEqualsPipelineNameErr struct {
 func (psr *PipelineStepNameEqualsPipelineNameErr) Error() string {
 	return fmt.Sprintf("pipeline %s must not have a step name with the same name as pipeline name", psr.pipeline)
 }
+
+type PipelineInputErr struct {
+	pipeline string
+	input    string
+	reason   string
+}
+
+func (pie *PipelineInputErr) Error() string {
+	return fmt.Sprintf("pipeline %s input %s is invalid. %s", pie.pipeline, pie.input, pie.reason)
+}
diff --git a/scheduler/pkg/store/pipeline/pipeline.go b/scheduler/pkg/store/pipeline/pipeline.go
index f849340039..69f9ea60dd 100644
--- a/scheduler/pkg/store/pipeline/pipeline.go
+++ b/scheduler/pkg/store/pipeline/pipeline.go
@@ -55,6 +55,7 @@ type PipelineVersion struct {
 	Name           string
 	Version        uint32
 	UID            string
+	Input          *PipelineInput
 	Steps          map[string]*PipelineStep
 	State          *PipelineState
 	Output         *PipelineOutput
@@ -131,3 +132,12 @@ type PipelineOutput struct {
 	StepsJoinType JoinType
 	TensorMap     map[string]string
 }
+
+type PipelineInput struct {
+	ExternalInputs   []string
+	ExternalTriggers []string
+	TensorMap        map[string]string
+	JoinWindowMs     *uint32
+	InputsJoinType   JoinType
+	TriggersJoinType JoinType
+}
diff --git a/scheduler/pkg/store/pipeline/utils.go b/scheduler/pkg/store/pipeline/utils.go
index b931aea8d1..f9258cda4c 100644
--- a/scheduler/pkg/store/pipeline/utils.go
+++ b/scheduler/pkg/store/pipeline/utils.go
@@ -29,6 +29,7 @@ import (
 
 func CreateProtoFromPipelineVersion(pv *PipelineVersion) *scheduler.Pipeline {
 	var protoSteps []*scheduler.PipelineStep
+	var protoInput *scheduler.PipelineInput
 	var protoOutput *scheduler.PipelineOutput
 	keys := make([]string, 0)
 	for k := range pv.Steps {
@@ -68,6 +69,30 @@ func CreateProtoFromPipelineVersion(pv *PipelineVersion) *scheduler.Pipeline {
 		}
 		protoSteps = append(protoSteps, protoStep)
 	}
+	if pv.Input != nil {
+		protoInput = &scheduler.PipelineInput{
+			ExternalInputs:   pv.Input.ExternalInputs,
+			ExternalTriggers: pv.Input.ExternalTriggers,
+			JoinWindowMs:     pv.Input.JoinWindowMs,
+			TensorMap:        pv.Input.TensorMap,
+		}
+		switch pv.Input.InputsJoinType {
+		case JoinInner:
+			protoInput.JoinType = scheduler.PipelineInput_INNER
+		case JoinOuter:
+			protoInput.JoinType = scheduler.PipelineInput_OUTER
+		case JoinAny:
+			protoInput.JoinType = scheduler.PipelineInput_ANY
+		}
+		switch pv.Input.TriggersJoinType {
+		case JoinInner:
+			protoInput.TriggersJoin = scheduler.PipelineInput_INNER
+		case JoinOuter:
+			protoInput.TriggersJoin = scheduler.PipelineInput_OUTER
+		case JoinAny:
+			protoInput.TriggersJoin = scheduler.PipelineInput_ANY
+		}
+	}
 	if pv.Output != nil {
 		protoOutput = &scheduler.PipelineOutput{
 			Steps:        pv.Output.Steps,
@@ -94,6 +119,7 @@ func CreateProtoFromPipelineVersion(pv *PipelineVersion) *scheduler.Pipeline {
 		Name:           pv.Name,
 		Uid:            pv.UID,
 		Version:        pv.Version,
+		Input:          protoInput,
 		Steps:          protoSteps,
 		Output:         protoOutput,
 		KubernetesMeta: kubernetesMeta,
@@ -105,10 +131,10 @@ func CreatePipelineVersionFromProto(pipelineProto *scheduler.Pipeline) (*Pipelin
 	for _, stepProto := range pipelineProto.Steps {
 		step := &PipelineStep{
 			Name:         stepProto.GetName(),
-			Inputs:       updateInputSteps(pipelineProto.Name, stepProto.Inputs),
+			Inputs:       updateInternalInputSteps(pipelineProto.Name, stepProto.Inputs),
 			TensorMap:    stepProto.TensorMap,
 			JoinWindowMs: stepProto.JoinWindowMs,
-			Triggers:     updateInputSteps(pipelineProto.Name, stepProto.Triggers),
+			Triggers:     updateInternalInputSteps(pipelineProto.Name, stepProto.Triggers),
 		}
 		switch stepProto.InputsJoin {
 		case scheduler.PipelineStep_INNER:
@@ -137,11 +163,36 @@ func CreatePipelineVersionFromProto(pipelineProto *scheduler.Pipeline) (*Pipelin
 		}
 		steps[stepProto.Name] = step
 	}
+	var input *PipelineInput
+	if pipelineProto.Input != nil {
+		input = &PipelineInput{
+			ExternalInputs:   updateExternalInputSteps(pipelineProto.Input.ExternalInputs),
+			ExternalTriggers: updateExternalInputSteps(pipelineProto.Input.ExternalTriggers),
+			JoinWindowMs:     pipelineProto.Input.JoinWindowMs,
+			TensorMap:        pipelineProto.Input.TensorMap,
+		}
+		switch pipelineProto.Input.JoinType {
+		case scheduler.PipelineInput_INNER:
+			input.InputsJoinType = JoinInner
+		case scheduler.PipelineInput_OUTER:
+			input.InputsJoinType = JoinOuter
+		case scheduler.PipelineInput_ANY:
+			input.InputsJoinType = JoinAny
+		}
+		switch pipelineProto.Input.TriggersJoin {
+		case scheduler.PipelineInput_INNER:
+			input.TriggersJoinType = JoinInner
+		case scheduler.PipelineInput_OUTER:
+			input.TriggersJoinType = JoinOuter
+		case scheduler.PipelineInput_ANY:
+			input.TriggersJoinType = JoinAny
+		}
+	}
 
 	var output *PipelineOutput
 	if pipelineProto.Output != nil {
 		output = &PipelineOutput{
-			Steps:        updateInputSteps(pipelineProto.Name, pipelineProto.Output.Steps),
+			Steps:        updateInternalInputSteps(pipelineProto.Name, pipelineProto.Output.Steps),
 			JoinWindowMs: pipelineProto.Output.JoinWindowMs,
 			TensorMap:    pipelineProto.Output.TensorMap,
 		}
@@ -166,6 +217,7 @@ func CreatePipelineVersionFromProto(pipelineProto *scheduler.Pipeline) (*Pipelin
 		Name:           pipelineProto.Name,
 		UID:            pipelineProto.Uid,
 		Version:        pipelineProto.Version,
+		Input:          input,
 		Steps:          steps,
 		State:          &PipelineState{},
 		Output:         output,
@@ -178,7 +230,7 @@ func CreatePipelineVersionFromProto(pipelineProto *scheduler.Pipeline) (*Pipelin
 	return pv, nil
 }
 
-func updateInputSteps(pipelineName string, inputs []string) []string {
+func updateInternalInputSteps(pipelineName string, inputs []string) []string {
 	if len(inputs) == 0 {
 		return inputs
 	}
@@ -200,6 +252,29 @@ func updateInputSteps(pipelineName string, inputs []string) []string {
 	return updatedInputs
 }
 
+func updateExternalInputSteps(inputs []string) []string {
+	if len(inputs) == 0 {
+		return inputs
+	}
+	var updatedInputs []string
+	for _, inp := range inputs {
+		parts := strings.Split(inp, StepNameSeperator)
+		switch len(parts) {
+		case 1: // Add outputs if just pipeline specified
+			updatedInputs = append(updatedInputs, fmt.Sprintf("%s.%s", inp, StepOutputSpecifier))
+		case 3: // Add outputs if step name only specified
+			if parts[1] == PipelineStepSpecifier {
+				updatedInputs = append(updatedInputs, fmt.Sprintf("%s.%s", inp, StepOutputSpecifier))
+			} else {
+				updatedInputs = append(updatedInputs, inp)
+			}
+		default:
+			updatedInputs = append(updatedInputs, inp)
+		}
+	}
+	return updatedInputs
+}
+
 func CreatePipelineWithState(pv *PipelineVersion) *scheduler.PipelineWithState {
 	pvs := &scheduler.PipelineVersionState{
 		PipelineVersion:     pv.Version,
diff --git a/scheduler/pkg/store/pipeline/utils_test.go b/scheduler/pkg/store/pipeline/utils_test.go
index e45db5ecec..cba0cdd685 100644
--- a/scheduler/pkg/store/pipeline/utils_test.go
+++ b/scheduler/pkg/store/pipeline/utils_test.go
@@ -42,7 +42,7 @@ func TestUpdateInputsSteps(t *testing.T) {
 	}
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
-			updated := updateInputSteps(test.pipelineName, test.inputs)
+			updated := updateInternalInputSteps(test.pipelineName, test.inputs)
 			g.Expect(updated).To(Equal(test.expected))
 		})
 	}
@@ -375,5 +375,29 @@ func TestCreatePipelineFromProto(t *testing.T) {
 			}
 		})
 	}
+}
+
+func TestUpdateExternalInputSteps(t *testing.T) {
+	g := NewGomegaWithT(t)
+	type test struct {
+		name         string
+		pipelineName string
+		inputs       []string
+		expected     []string
+	}
 
+	tests := []test{
+		{
+			name:         "test update external inputs",
+			pipelineName: "pipeline",
+			inputs:       []string{"p1", "p1.outputs", "p1.inputs", "p1.inputs.t1", "p1.step.m1", "p1.step.m1.outputs.t1"},
+			expected:     []string{"p1.outputs", "p1.outputs", "p1.inputs", "p1.inputs.t1", "p1.step.m1.outputs", "p1.step.m1.outputs.t1"},
+		},
+	}
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			updated := updateExternalInputSteps(test.inputs)
+			g.Expect(updated).To(Equal(test.expected))
+		})
+	}
 }
diff --git a/scheduler/pkg/store/pipeline/validate.go b/scheduler/pkg/store/pipeline/validate.go
index 66c3a6b75c..dcc5b50ffb 100644
--- a/scheduler/pkg/store/pipeline/validate.go
+++ b/scheduler/pkg/store/pipeline/validate.go
@@ -27,9 +27,10 @@ import (
 //	step1.outputs.out1 
 //	step1.inputs.in1 
 const (
-	StepInputSpecifier  = "inputs"
-	StepOutputSpecifier = "outputs"
-	StepNameSeperator   = "."
+	StepInputSpecifier    = "inputs"
+	StepOutputSpecifier   = "outputs"
+	PipelineStepSpecifier = "step"
+	StepNameSeperator     = "."
 )
 
 func validate(pv *PipelineVersion) error {
@@ -48,7 +49,7 @@ func validate(pv *PipelineVersion) error {
 	if err := checkStepReferencesExist(pv); err != nil {
 		return err
 	}
-	if err := checkStepOutputs(pv); err != nil {
+	if err := checkPipelineOutputs(pv); err != nil {
 		return err
 	}
 	if err := checkForCycles(pv); err != nil {
@@ -57,6 +58,9 @@ func validate(pv *PipelineVersion) error {
 	if err := checkInputsAndTriggersDiffer(pv); err != nil {
 		return err
 	}
+	if err := checkPipelineInput(pv); err != nil {
+		return err
+	}
 	return nil
 }
 
@@ -221,7 +225,59 @@ func checkStepTriggers(pv *PipelineVersion) error {
 	return nil
 }
 
-func checkStepOutputs(pv *PipelineVersion) error {
+const (
+	pipelineInputEmptyErr               = "At least one pipeline input must be specified"
+	pipelineInputEmptyErrReason         = "Input name must not be empty"
+	pipelineInputOnlyPipelineNameReason = "A Pipeline name must also specify one of inputs, outputs or a step name"
+	pipelineInputInvalidPrefixReason    = "A Pipeline inputs referencing another pipeline must be .(inputs|outputs|step.)"
+	pipelineInputStepBadSuffix          = "A pipeline step must be .step..(inputs|outputs)"
+	pipelineInputTooLongReason          = "The input is too long. It must be .(inputs|outputs).(tensorName)? or .step..."
+)
+
+func checkPipelineInput(pv *PipelineVersion) error {
+	if pv.Input != nil {
+		if len(pv.Input.ExternalInputs) == 0 {
+			return &PipelineInputErr{pv.Name, "", pipelineInputEmptyErr}
+		}
+		for _, v := range pv.Input.ExternalInputs {
+			if strings.TrimSpace(v) == "" {
+				return &PipelineInputErr{pv.Name, v, pipelineInputEmptyErrReason}
+			}
+			parts := strings.Split(v, StepNameSeperator)
+			switch len(parts) {
+			case 1:
+				return &PipelineInputErr{pv.Name, v, pipelineInputOnlyPipelineNameReason}
+			case 2:
+				if !(parts[1] == StepInputSpecifier || parts[1] == StepOutputSpecifier) {
+					return &PipelineInputErr{pv.Name, v, pipelineInputInvalidPrefixReason}
+				}
+			case 3:
+				if !(parts[1] == StepInputSpecifier || parts[1] == StepOutputSpecifier || parts[1] == PipelineStepSpecifier) {
+					return &PipelineInputErr{pv.Name, v, pipelineInputInvalidPrefixReason}
+				}
+				if parts[1] == PipelineStepSpecifier {
+					return &PipelineInputErr{pv.Name, v, pipelineInputStepBadSuffix}
+				}
+			default:
+				if !(parts[1] == StepInputSpecifier || parts[1] == StepOutputSpecifier || parts[1] == PipelineStepSpecifier) {
+					return &PipelineInputErr{pv.Name, v, pipelineInputInvalidPrefixReason}
+				}
+				if !(parts[3] == StepInputSpecifier || parts[3] == StepOutputSpecifier) {
+					return &PipelineInputErr{pv.Name, v, pipelineInputStepBadSuffix}
+				}
+				if parts[1] == StepInputSpecifier || parts[1] == StepOutputSpecifier {
+					return &PipelineInputErr{pv.Name, v, pipelineInputInvalidPrefixReason}
+				}
+				if len(parts) > 5 {
+					return &PipelineInputErr{pv.Name, v, pipelineInputTooLongReason}
+				}
+			}
+		}
+	}
+	return nil
+}
+
+func checkPipelineOutputs(pv *PipelineVersion) error {
 	if pv.Output != nil {
 		for _, v := range pv.Output.Steps {
 			parts := strings.Split(v, StepNameSeperator)
diff --git a/scheduler/pkg/store/pipeline/validate_test.go b/scheduler/pkg/store/pipeline/validate_test.go
index 56f8b1d23d..68298e36c0 100644
--- a/scheduler/pkg/store/pipeline/validate_test.go
+++ b/scheduler/pkg/store/pipeline/validate_test.go
@@ -533,6 +533,217 @@ func TestCheckInputsAndTriggersDiffer(t *testing.T) {
 	}
 }
 
+func TestPipelineInput(t *testing.T) {
+	g := NewGomegaWithT(t)
+	tests := []validateTest{
+		{
+			name: "No input",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+		},
+		{
+			name: "No external inputs",
+			pipelineVersion: &PipelineVersion{
+				Name:  "test",
+				Input: &PipelineInput{},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+			err: &PipelineInputErr{"test", "", pipelineInputEmptyErr},
+		},
+		{
+			name: "Valid pipeline input",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.inputs",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+		},
+		{
+			name: "Valid pipeline outputs",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.outputs",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+		},
+		{
+			name: "Bad input specifier",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.foo",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+			err: &PipelineInputErr{"test", "foo.foo", pipelineInputInvalidPrefixReason},
+		},
+		{
+			name: "Bad input specifier",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+			err: &PipelineInputErr{"test", "foo.step", pipelineInputInvalidPrefixReason},
+		},
+		{
+			name: "Bad input step no suffix",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step.bar",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+			err: &PipelineInputErr{"test", "foo.step.bar", pipelineInputStepBadSuffix},
+		},
+		{
+			name: "Bad input step no suffix",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step.bar.zee",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+			err: &PipelineInputErr{"test", "foo.step.bar.zee", pipelineInputStepBadSuffix},
+		},
+		{
+			name: "Bad input step inputs ok",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step.bar.inputs",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+		},
+		{
+			name: "Bad input step outputs ok",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step.bar.outputs",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+		},
+		{
+			name: "input step inputs tensor ok",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step.bar.inputs.tensor",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+		},
+		{
+			name: "Bad input step inputs too long",
+			pipelineVersion: &PipelineVersion{
+				Name: "test",
+				Input: &PipelineInput{
+					ExternalInputs: []string{
+						"foo.step.bar.inputs.tensor.xyz",
+					},
+				},
+				Steps: map[string]*PipelineStep{
+					"a": {
+						Name: "a",
+					},
+				},
+			},
+			err: &PipelineInputErr{"test", "foo.step.bar.inputs.tensor.xyz", pipelineInputTooLongReason},
+		},
+	}
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			err := checkPipelineInput(test.pipelineVersion)
+			if test.err == nil {
+				g.Expect(err).To(BeNil())
+			} else {
+				g.Expect(err.Error()).To(Equal(test.err.Error()))
+			}
+			err = validate(test.pipelineVersion)
+			if test.err == nil {
+				g.Expect(err).To(BeNil())
+			} else {
+				g.Expect(err.Error()).To(Equal(test.err.Error()))
+			}
+		})
+	}
+}
+
 func TestCheckStepNameNotPipelineName(t *testing.T) {
 	g := NewGomegaWithT(t)
 	tests := []validateTest{
@@ -626,7 +837,7 @@ func TestCheckStepOutputs(t *testing.T) {
 	}
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
-			err := checkStepOutputs(test.pipelineVersion)
+			err := checkPipelineOutputs(test.pipelineVersion)
 			if test.err == nil {
 				g.Expect(err).To(BeNil())
 			} else {