// PutResponse returns an http.Response object for the updated resource func (s *ScalewayAPI) PutResponse(resource string, data interface{}) (*http.Response, error) { uri := fmt.Sprintf("%s/%s", strings.TrimRight(s.APIUrl, "/"), resource) payload := new(bytes.Buffer) encoder := json.NewEncoder(payload) if err := encoder.Encode(data); err != nil { return nil, err } req, err := http.NewRequest("PUT", uri, payload) if err != nil { return nil, err } req.Header.Set("X-Auth-Token", s.Token) req.Header.Set("Content-Type", "application/json") curl, err := http2curl.GetCurlCommand(req) if err != nil { return nil, err } if os.Getenv("SCW_SENSITIVE") != "1" { log.Debug(s.HideAPICredentials(curl.String())) } else { log.Debug(curl.String()) } return s.client.Do(req) }
// DeleteResponse returns an http.Response object for the deleted resource func (s *ScalewayAPI) DeleteResponse(resource string) (*http.Response, error) { uri := fmt.Sprintf("%s/%s", strings.TrimRight(s.APIUrl, "/"), resource) req, err := http.NewRequest("DELETE", uri, nil) if err != nil { return nil, err } req.Header.Set("X-Auth-Token", s.Token) req.Header.Set("Content-Type", "application/json") curl, err := http2curl.GetCurlCommand(req) if os.Getenv("SCW_SENSITIVE") != "1" { log.Debug(s.HideAPICredentials(curl.String())) } else { log.Debug(curl.String()) } return s.client.Do(req) }
// PatchUserdata sets a user data func (s *ScalewayAPI) PatchUserdata(serverID string, key string, value []byte) error { var resource string if s.isMetadata { resource = fmt.Sprintf("/user_data/%s", key) } else { resource = fmt.Sprintf("servers/%s/user_data/%s", serverID, key) } uri := fmt.Sprintf("%s/%s", strings.TrimRight(s.APIUrl, "/"), resource) payload := new(bytes.Buffer) payload.Write(value) req, err := http.NewRequest("PATCH", uri, payload) if err != nil { return err } req.Header.Set("X-Auth-Token", s.Token) req.Header.Set("Content-Type", "text/plain") curl, err := http2curl.GetCurlCommand(req) if os.Getenv("SCW_SENSITIVE") != "1" { log.Debug(s.HideAPICredentials(curl.String())) } else { log.Debug(curl.String()) } resp, err := s.client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode == 204 { return nil } return fmt.Errorf("cannot set user_data (%d)", resp.StatusCode) }
// Run is the handler for 'scw run' func Run(ctx CommandContext, args RunArgs) error { if args.Gateway == "" { args.Gateway = ctx.Getenv("SCW_GATEWAY") } if args.TmpSSHKey { err := AddSSHKeyToTags(ctx, &args.Tags, args.Image) if err != nil { return err } } env := strings.Join(args.Tags, " ") volume := strings.Join(args.Volumes, " ") // create IMAGE logrus.Info("Server creation ...") dynamicIPRequired := args.Gateway == "" serverID, err := api.CreateServer(ctx.API, args.Image, args.Name, args.Bootscript, env, volume, dynamicIPRequired) if err != nil { return fmt.Errorf("failed to create server: %v", err) } logrus.Infof("Server created: %s", serverID) if args.AutoRemove { defer ctx.API.DeleteServerSafe(serverID) } // start SERVER logrus.Info("Server start requested ...") err = api.StartServer(ctx.API, serverID, false) if err != nil { return fmt.Errorf("failed to start server %s: %v", serverID, err) } logrus.Info("Server is starting, this may take up to a minute ...") if args.Detach { fmt.Fprintln(ctx.Stdout, serverID) return nil } else { // Sync cache on disk ctx.API.Sync() } if args.Attach { // Attach to server serial logrus.Info("Attaching to server console ...") err = utils.AttachToSerial(serverID, ctx.API.Token, true) if err != nil { return fmt.Errorf("cannot attach to server serial: %v", err) } } else { // Resolve gateway gateway, err := api.ResolveGateway(ctx.API, args.Gateway) if err != nil { return fmt.Errorf("cannot resolve Gateway '%s': %v", args.Gateway, err) } // waiting for server to be ready logrus.Debug("Waiting for server to be ready") // We wait for 30 seconds, which is the minimal amount of time needed by a server to boot server, err := api.WaitForServerReady(ctx.API, serverID, gateway) if err != nil { return fmt.Errorf("cannot get access to server %s: %v", serverID, err) } logrus.Debugf("SSH server is available: %s:22", server.PublicAddress.IP) logrus.Info("Server is ready !") // exec -w SERVER COMMAND ARGS... if len(args.Command) < 1 { logrus.Info("Connecting to server ...") err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, []string{}, false, gateway) } else { logrus.Infof("Executing command: %s ...", args.Command) err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, args.Command, false, gateway) } if err != nil { return fmt.Errorf("command execution failed: %v", err) } logrus.Info("Command successfuly executed") } return nil }