func (j *ListContainersRequest) Execute(resp jobs.Response) { r := &ListContainersResponse{make(ContainerUnitResponses, 0)} if err := unitsMatching(reContainerUnits, func(name string, unit *dbus.UnitStatus) { if unit.LoadState == "not-found" || unit.LoadState == "masked" { return } r.Containers = append(r.Containers, ContainerUnitResponse{ UnitResponse{ name, unit.ActiveState, unit.SubState, }, unit.LoadState, unit.JobType, "", }) }); err != nil { log.Printf("list_units: Unable to list units from systemd: %v", err) resp.Failure(ErrListContainersFailed) return } r.Sort() resp.SuccessWithData(jobs.ResponseOk, r) }
func (j *ContainerPortsRequest) Execute(resp jobs.Response) { portPairs, err := containers.GetExistingPorts(j.Id) if err != nil { log.Printf("job_container_ports_log: Unable to find unit: %s\n", err.Error()) resp.Failure(ErrContainerNotFound) return } resp.SuccessWithData(jobs.ResponseAccepted, ContainerPortsResponse{portPairs}) }
func (j GetRoutesRequest) Execute(resp jobs.Response) { // router.ReadRoutes() var out string if j.Frontend == "*" { out = router.PrintRoutes() } else { out = router.PrintFrontendRoutes(j.Frontend) } fmt.Println(out) resp.SuccessWithData(jobs.ResponseOk, &out) // fmt.Fprintf(w, out) }
func (j *ListBuildsRequest) Execute(resp jobs.Response) { r := ListBuildsResponse{make(UnitResponses, 0)} if err := unitsMatching(reBuildUnits, func(name string, unit *dbus.UnitStatus) { r.Builds = append(r.Builds, UnitResponse{ name, unit.ActiveState, unit.SubState, }) }); err != nil { log.Printf("list_units: Unable to list units from systemd: %v", err) resp.Failure(ErrListContainersFailed) return } sort.Sort(r.Builds) resp.SuccessWithData(jobs.ResponseOk, r) }
func (h *HttpTransport) ExecuteRemote(baseUrl *url.URL, job RemoteExecutable, res jobs.Response) error { reader, writer := io.Pipe() httpreq, errn := http.NewRequest(job.HttpMethod(), baseUrl.String(), reader) if errn != nil { return errn } id := job.MarshalRequestIdentifier() if len(id) == 0 { id = jobs.NewRequestIdentifier() } query := &url.Values{} job.MarshalUrlQuery(query) req := httpreq req.Header.Set("X-Request-Id", id.String()) req.Header.Set("If-Match", "api="+ApiVersion()) req.Header.Set("Content-Type", "application/json") //TODO: introduce API version per job //TODO: content request signing for GETs req.URL.Path = job.HttpPath() req.URL.RawQuery = query.Encode() go func() { if err := job.MarshalHttpRequestBody(writer); err != nil { log.Printf("http_remote: Error when writing to http: %v", err) writer.CloseWithError(err) } else { writer.Close() } }() resp, err := h.client.Do(req) if err != nil { return err } defer resp.Body.Close() isJson := resp.Header.Get("Content-Type") == "application/json" switch code := resp.StatusCode; { case code == 202: if isJson { return errors.New("Decoding of streaming JSON has not been implemented") } data, err := job.UnmarshalHttpResponse(resp.Header, nil, ResponseTable) if err != nil { return err } if pending, ok := data.(map[string]interface{}); ok { for k := range pending { res.WritePendingSuccess(k, pending[k]) } } w := res.SuccessWithWrite(jobs.ResponseOk, false, false) if _, err := io.Copy(w, resp.Body); err != nil { return err } case code == 204: data, err := job.UnmarshalHttpResponse(resp.Header, nil, ResponseTable) if err != nil { return err } if pending, ok := data.(map[string]interface{}); ok { for k := range pending { res.WritePendingSuccess(k, pending[k]) } } res.Success(jobs.ResponseOk) case code >= 200 && code < 300: if !isJson { return errors.New(fmt.Sprintf("remote: Response with %d status code had content type %s (should be application/json)", code, resp.Header.Get("Content-Type"))) } data, err := job.UnmarshalHttpResponse(nil, resp.Body, ResponseJson) if err != nil { return err } res.SuccessWithData(jobs.ResponseOk, data) default: if isJson { decoder := json.NewDecoder(resp.Body) data := httpFailureResponse{} if err := decoder.Decode(&data); err != nil { return err } res.Failure(jobs.SimpleError{jobs.ResponseError, data.Message}) return nil } io.Copy(os.Stderr, resp.Body) res.Failure(jobs.SimpleError{jobs.ResponseError, "Unable to decode response."}) } return nil }