17170: Merge branch 'master'
[arvados.git] / lib / controller / rpc / conn.go
index 7dd89452bec7fbeff1ca0c70cdbd3b8e24eaa914..c9c0ac308cded26082ad07cf782042ed85ed1c76 100644 (file)
@@ -298,8 +298,13 @@ func (conn *Conn) ContainerSSH(ctx context.Context, options arvados.ContainerSSH
                // hostname or ::1 or 1::1
                addr = net.JoinHostPort(addr, "https")
        }
-       netconn, err := tls.Dial("tcp", addr, conn.httpClient.Transport.(*http.Transport).TLSClientConfig)
+       insecure := false
+       if tlsconf := conn.httpClient.Transport.(*http.Transport).TLSClientConfig; tlsconf != nil && tlsconf.InsecureSkipVerify {
+               insecure = true
+       }
+       netconn, err := tls.Dial("tcp", addr, &tls.Config{InsecureSkipVerify: insecure})
        if err != nil {
+               err = fmt.Errorf("tls.Dial: %w", err)
                return
        }
        defer func() {
@@ -312,6 +317,7 @@ func (conn *Conn) ContainerSSH(ctx context.Context, options arvados.ContainerSSH
 
        u, err := conn.baseURL.Parse("/" + strings.Replace(arvados.EndpointContainerSSH.Path, "{uuid}", options.UUID, -1))
        if err != nil {
+               err = fmt.Errorf("tls.Dial: %w", err)
                return
        }
        u.RawQuery = url.Values{
@@ -333,12 +339,20 @@ func (conn *Conn) ContainerSSH(ctx context.Context, options arvados.ContainerSSH
        bufw.Flush()
        resp, err := http.ReadResponse(bufr, &http.Request{Method: "GET"})
        if err != nil {
+               err = fmt.Errorf("http.ReadResponse: %w", err)
                return
        }
        if resp.StatusCode != http.StatusSwitchingProtocols {
                defer resp.Body.Close()
                body, _ := ioutil.ReadAll(resp.Body)
-               err = fmt.Errorf("server did not provide a tunnel: %d %q", resp.StatusCode, body)
+               var message string
+               var errDoc httpserver.ErrorResponse
+               if err := json.Unmarshal(body, &errDoc); err == nil {
+                       message = strings.Join(errDoc.Errors, "; ")
+               } else {
+                       message = fmt.Sprintf("%q", body)
+               }
+               err = fmt.Errorf("server did not provide a tunnel: %s (HTTP %d)", message, resp.StatusCode)
                return
        }
        if strings.ToLower(resp.Header.Get("Upgrade")) != "ssh" ||
@@ -351,6 +365,13 @@ func (conn *Conn) ContainerSSH(ctx context.Context, options arvados.ContainerSSH
        return
 }
 
+func (conn *Conn) ContainerRequestList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerRequestList, error) {
+       ep := arvados.EndpointContainerRequestList
+       var resp arvados.ContainerRequestList
+       err := conn.requestAndDecode(ctx, &resp, ep, nil, options)
+       return resp, err
+}
+
 func (conn *Conn) SpecimenCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Specimen, error) {
        ep := arvados.EndpointSpecimenCreate
        var resp arvados.Specimen