UpdateDataSource updates a data source of an instance.
(ctx context.Context, req *connect.Request[v1pb.UpdateDataSourceRequest])
| 887 | |
| 888 | // UpdateDataSource updates a data source of an instance. |
| 889 | func (s *InstanceService) UpdateDataSource(ctx context.Context, req *connect.Request[v1pb.UpdateDataSourceRequest]) (*connect.Response[v1pb.Instance], error) { |
| 890 | if req.Msg.DataSource == nil { |
| 891 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("datasource is required")) |
| 892 | } |
| 893 | if req.Msg.UpdateMask == nil { |
| 894 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("update_mask must be set")) |
| 895 | } |
| 896 | |
| 897 | instance, err := getInstanceMessage(ctx, s.store, req.Msg.Name) |
| 898 | if err != nil { |
| 899 | return nil, err |
| 900 | } |
| 901 | if instance.Deleted { |
| 902 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("instance %q has been deleted", req.Msg.Name)) |
| 903 | } |
| 904 | metadata := proto.CloneOf(instance.Metadata) |
| 905 | var dataSource *storepb.DataSource |
| 906 | for _, ds := range metadata.GetDataSources() { |
| 907 | if ds.GetId() == req.Msg.DataSource.Id { |
| 908 | dataSource = ds |
| 909 | break |
| 910 | } |
| 911 | } |
| 912 | if dataSource == nil { |
| 913 | if req.Msg.AllowMissing { |
| 914 | return s.AddDataSource(ctx, connect.NewRequest(&v1pb.AddDataSourceRequest{ |
| 915 | Name: req.Msg.Name, |
| 916 | DataSource: req.Msg.DataSource, |
| 917 | ValidateOnly: req.Msg.ValidateOnly, |
| 918 | })) |
| 919 | } |
| 920 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf(`cannot found data source "%s"`, req.Msg.DataSource.Id)) |
| 921 | } |
| 922 | |
| 923 | if dataSource.GetType() == storepb.DataSourceType_READ_ONLY { |
| 924 | if err := s.licenseService.IsFeatureEnabledForInstance(ctx, common.GetWorkspaceIDFromContext(ctx), v1pb.PlanFeature_FEATURE_INSTANCE_READ_ONLY_CONNECTION, instance); err != nil { |
| 925 | return nil, connect.NewError(connect.CodePermissionDenied, err) |
| 926 | } |
| 927 | } |
| 928 | |
| 929 | for _, path := range req.Msg.UpdateMask.Paths { |
| 930 | switch path { |
| 931 | case "username": |
| 932 | dataSource.Username = req.Msg.DataSource.Username |
| 933 | case "password": |
| 934 | dataSource.Password = req.Msg.DataSource.Password |
| 935 | case "ssl_ca": |
| 936 | dataSource.SslCa = req.Msg.DataSource.SslCa |
| 937 | case "ssl_ca_path": |
| 938 | dataSource.SslCaPath = req.Msg.DataSource.SslCaPath |
| 939 | case "ssl_cert": |
| 940 | dataSource.SslCert = req.Msg.DataSource.SslCert |
| 941 | case "ssl_cert_path": |
| 942 | dataSource.SslCertPath = req.Msg.DataSource.SslCertPath |
| 943 | case "ssl_key": |
| 944 | dataSource.SslKey = req.Msg.DataSource.SslKey |
| 945 | case "ssl_key_path": |
| 946 | dataSource.SslKeyPath = req.Msg.DataSource.SslKeyPath |
nothing calls this directly
no test coverage detected