MCPcopy Index your code
hub / github.com/bytebase/bytebase / CreateInstance

Method CreateInstance

backend/api/v1/instance_service.go:156–247  ·  view source on GitHub ↗

CreateInstance creates an instance.

(ctx context.Context, req *connect.Request[v1pb.CreateInstanceRequest])

Source from the content-addressed store, hash-verified

154
155// CreateInstance creates an instance.
156func (s *InstanceService) CreateInstance(ctx context.Context, req *connect.Request[v1pb.CreateInstanceRequest]) (*connect.Response[v1pb.Instance], error) {
157 if req.Msg.Instance == nil {
158 return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("instance must be set"))
159 }
160 if !isValidResourceID(req.Msg.InstanceId) {
161 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid instance ID %v", req.Msg.InstanceId))
162 }
163
164 if err := s.instanceCountGuard(ctx); err != nil {
165 return nil, err
166 }
167
168 if err := validateLabels(req.Msg.Instance.Labels); err != nil {
169 return nil, connect.NewError(connect.CodeInvalidArgument, err)
170 }
171
172 instanceMessage, err := convertToStoreInstance(req.Msg.InstanceId, req.Msg.Instance)
173 if err != nil {
174 return nil, connect.NewError(connect.CodeInvalidArgument, err)
175 }
176 // Set the workspace ID early so that workspace-scoped license checks
177 // (e.g. EXTERNAL_SECRET_MANAGER) work during the ValidateOnly test
178 // connection below, before the instance is persisted.
179 workspaceID := common.GetWorkspaceIDFromContext(ctx)
180 instanceMessage.Workspace = workspaceID
181 for _, ds := range instanceMessage.Metadata.GetDataSources() {
182 if err := validateAndSanitizeDataSourceTLS(ds); err != nil {
183 return nil, connect.NewError(connect.CodeInvalidArgument, err)
184 }
185 }
186 if err := s.checkInstanceDataSources(ctx, instanceMessage, instanceMessage.Metadata.GetDataSources()); err != nil {
187 return nil, err
188 }
189
190 // Test connection.
191 if req.Msg.ValidateOnly {
192 for _, ds := range instanceMessage.Metadata.GetDataSources() {
193 err := func() error {
194 driver, err := s.dbFactory.GetDataSourceDriver(
195 ctx, instanceMessage, ds,
196 db.ConnectionContext{
197 ReadOnly: ds.GetType() == storepb.DataSourceType_READ_ONLY,
198 },
199 )
200 if err != nil {
201 return connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get database driver"))
202 }
203 defer driver.Close(ctx)
204 if err := driver.Ping(ctx); err != nil {
205 return connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "invalid datasource %s", ds.GetType()))
206 }
207 return nil
208 }()
209 if err != nil {
210 return nil, err
211 }
212 }
213

Callers 1

UpdateInstanceMethod · 0.95

Calls 15

instanceCountGuardMethod · 0.95
convertToV1InstanceMethod · 0.95
checkActivationLimitMethod · 0.95
BBErrorFunction · 0.92
isValidResourceIDFunction · 0.85
validateLabelsFunction · 0.85
convertToStoreInstanceFunction · 0.85
ErrorfMethod · 0.80
GetDataSourceDriverMethod · 0.80

Tested by

no test coverage detected