RemoveDataSource removes a data source to an instance.
(ctx context.Context, req *connect.Request[v1pb.RemoveDataSourceRequest])
| 1102 | |
| 1103 | // RemoveDataSource removes a data source to an instance. |
| 1104 | func (s *InstanceService) RemoveDataSource(ctx context.Context, req *connect.Request[v1pb.RemoveDataSourceRequest]) (*connect.Response[v1pb.Instance], error) { |
| 1105 | if req.Msg.DataSource == nil { |
| 1106 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("data sources is required")) |
| 1107 | } |
| 1108 | |
| 1109 | instance, err := getInstanceMessage(ctx, s.store, req.Msg.Name) |
| 1110 | if err != nil { |
| 1111 | return nil, err |
| 1112 | } |
| 1113 | if instance.Deleted { |
| 1114 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("instance %q has been deleted", req.Msg.Name)) |
| 1115 | } |
| 1116 | |
| 1117 | metadata := proto.CloneOf(instance.Metadata) |
| 1118 | var updatedDataSources []*storepb.DataSource |
| 1119 | var dataSource *storepb.DataSource |
| 1120 | for _, ds := range instance.Metadata.GetDataSources() { |
| 1121 | if ds.GetId() == req.Msg.DataSource.Id { |
| 1122 | dataSource = ds |
| 1123 | } else { |
| 1124 | updatedDataSources = append(updatedDataSources, ds) |
| 1125 | } |
| 1126 | } |
| 1127 | if dataSource == nil { |
| 1128 | return nil, connect.NewError(connect.CodeNotFound, errors.New("data source not found")) |
| 1129 | } |
| 1130 | |
| 1131 | // We only support remove RO type datasource to instance now, see more details in instance_service.proto. |
| 1132 | if dataSource.GetType() != storepb.DataSourceType_READ_ONLY { |
| 1133 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("only support remove read-only data source")) |
| 1134 | } |
| 1135 | |
| 1136 | metadata.DataSources = updatedDataSources |
| 1137 | instance, err = s.store.UpdateInstance(ctx, &store.UpdateInstanceMessage{ |
| 1138 | ResourceID: &instance.ResourceID, |
| 1139 | Workspace: instance.Workspace, |
| 1140 | Metadata: metadata, |
| 1141 | }) |
| 1142 | if err != nil { |
| 1143 | return nil, connect.NewError(connect.CodeInternal, err) |
| 1144 | } |
| 1145 | |
| 1146 | result := s.convertToV1Instance(ctx, instance) |
| 1147 | return connect.NewResponse(result), nil |
| 1148 | } |
| 1149 | |
| 1150 | func getInstanceMessage(ctx context.Context, stores *store.Store, name string) (*store.InstanceMessage, error) { |
| 1151 | instanceID, err := common.GetInstanceID(name) |
nothing calls this directly
no test coverage detected