func heartbeating(host string, clientid string) (msg core.HBmsg, err error) { response := new(HeartbeatResponse) targeturl := fmt.Sprintf("%s/client/%s?heartbeat", host, clientid) //res, err := http.Get(targeturl) var headers httpclient.Header if conf.CLIENT_GROUP_TOKEN != "" { headers = httpclient.Header{ "Authorization": []string{"CG_TOKEN " + conf.CLIENT_GROUP_TOKEN}, } } res, err := httpclient.Get(targeturl, headers, nil, nil) logger.Debug(3, fmt.Sprintf("client %s sent a heartbeat to %s", host, clientid)) if err != nil { return } defer res.Body.Close() jsonstream, err := ioutil.ReadAll(res.Body) if err != nil { return } if err = json.Unmarshal(jsonstream, response); err == nil { if len(response.Errs) > 0 { return msg, errors.New(strings.Join(response.Errs, ",")) } return response.Data, nil } return }
//fetch file by shock url func fetchFile(filename string, url string, token string) (err error) { fmt.Printf("fetching file name=%s, url=%s\n", filename, url) localfile, err := os.Create(filename) if err != nil { return err } defer localfile.Close() var user *httpclient.Auth if token != "" { user = httpclient.GetUserByTokenAuth(token) } //download file from Shock res, err := httpclient.Get(url, httpclient.Header{}, nil, user) if err != nil { return err } defer res.Body.Close() if res.StatusCode != 200 { //err in fetching data resbody, _ := ioutil.ReadAll(res.Body) msg := fmt.Sprintf("op=fetchFile, url=%s, res=%s", url, resbody) return errors.New(msg) } _, err = io.Copy(localfile, res.Body) if err != nil { return err } return }
func CheckoutWorkunitRemote() (workunit *core.Workunit, err error) { response := new(WorkResponse) targeturl := fmt.Sprintf("%s/work?client=%s", conf.SERVER_URL, core.Self.Id) //res, err := http.Get(fmt.Sprintf("%s/work?client=%s", conf.SERVER_URL, core.Self.Id)) res, err := httpclient.Get(targeturl, httpclient.Header{}, nil, nil) logger.Debug(3, fmt.Sprintf("client %s sent a checkout request to %s", core.Self.Id, conf.SERVER_URL)) if err != nil { fmt.Printf("err=%s\n", err.Error()) return } defer res.Body.Close() jsonstream, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } if err = json.Unmarshal(jsonstream, response); err != nil { return } if len(response.Errs) > 0 { return nil, errors.New(strings.Join(response.Errs, ",")) } if response.Code == 200 { workunit = response.Data if workunit.Info.Auth == true { if token, err := FetchDataTokenByWorkId(workunit.Id); err == nil { workunit.Info.DataToken = token } else { return workunit, errors.New("need data token but failed to fetch one") } } return workunit, nil } return }
func FetchDataTokenByWorkId(workid string) (token string, err error) { response := new(TokenResponse) targeturl := fmt.Sprintf("%s/work/%s?datatoken&client=%s", conf.SERVER_URL, workid, core.Self.Id) //res, err := http.Get(requrl) res, err := httpclient.Get(targeturl, httpclient.Header{}, nil, nil) logger.Debug(3, "GET:"+targeturl) if err != nil { return } defer res.Body.Close() jsonstream, err := ioutil.ReadAll(res.Body) if err != nil { return "", err } if err = json.Unmarshal(jsonstream, response); err != nil { return } if len(response.Errs) > 0 { return "", errors.New(strings.Join(response.Errs, ",")) } if response.Code == 200 { token = response.Data return token, nil } return }
func FetchPrivateEnvByWorkId(workid string) (envs map[string]string, err error) { targeturl := fmt.Sprintf("%s/work/%s?privateenv&client=%s", conf.SERVER_URL, workid, core.Self.Id) var headers httpclient.Header if conf.CLIENT_GROUP_TOKEN != "" { headers = httpclient.Header{ "Authorization": []string{"CG_TOKEN " + conf.CLIENT_GROUP_TOKEN}, } } res, err := httpclient.Get(targeturl, headers, nil, nil) if err != nil { return envs, err } defer res.Body.Close() var jsonstream string if res.Header != nil { if _, ok := res.Header["Privateenv"]; ok { jsonstream = res.Header["Privateenv"][0] } } tmp_map := new(map[string]string) if err := json.Unmarshal([]byte(jsonstream), tmp_map); err != nil { return nil, err } envs = make(map[string]string) for key, val := range *tmp_map { envs[key] = val } return }
func (sc *ShockClient) Get_request(resource string, query url.Values, response interface{}) (err error) { logger.Debug(1, fmt.Sprint("string_url: ", sc.Host)) myurl, err := url.ParseRequestURI(sc.Host) if err != nil { return err } (*myurl).Path = resource (*myurl).RawQuery = query.Encode() shockurl := myurl.String() logger.Debug(1, fmt.Sprint("shock request url: ", shockurl)) if len(shockurl) < 5 { return errors.New("could not parse SHOCK_DOCKER_IMAGE_REPOSITORY") } var res *http.Response c := make(chan int, 1) go func() { res, err = httpclient.Get(shockurl, httpclient.Header{}, nil, nil) c <- 1 //we are ending }() select { case <-c: //go ahead case <-time.After(conf.SHOCK_TIMEOUT): return errors.New("timeout when getting node from shock, url=" + shockurl) } if err != nil { return } defer res.Body.Close() jsonstream, err := ioutil.ReadAll(res.Body) //logger.Debug(1, string(jsonstream)) if err != nil { return err } //response := new(result) if err := json.Unmarshal(jsonstream, response); err != nil { return err } //if len(response.Errs) > 0 { // return errors.New(strings.Join(response.Errs, ",")) //} //node = &response.Data //if node == nil { // err = errors.New("empty node got from Shock") //} return }
func ShockGet(host string, nodeid string, token string) (node *ShockNode, err error) { if host == "" || nodeid == "" { return nil, errors.New("empty shock host or node id") } logger.Debug(1, fmt.Sprintf("ShockGet: %s %s %s", host, nodeid, token)) var res *http.Response shockurl := fmt.Sprintf("%s/node/%s", host, nodeid) var user *httpclient.Auth if token != "" { user = httpclient.GetUserByTokenAuth(token) } c := make(chan int, 1) go func() { res, err = httpclient.Get(shockurl, httpclient.Header{}, nil, user) c <- 1 //we are ending }() select { case <-c: //go ahead case <-time.After(conf.SHOCK_TIMEOUT): return nil, errors.New("timeout when getting node from shock, url=" + shockurl) } if err != nil { return } defer res.Body.Close() jsonstream, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } response := new(ShockResponse) if err := json.Unmarshal(jsonstream, response); err != nil { return nil, err } if len(response.Errs) > 0 { return nil, errors.New(strings.Join(response.Errs, ",")) } node = &response.Data if node == nil { err = errors.New("empty node got from Shock") } return }
func FetchShockStream(url string, token string) (r io.ReadCloser, err error) { var user *httpclient.Auth if token != "" { user = httpclient.GetUserByTokenAuth(token) } //download file from Shock res, err := httpclient.Get(url, httpclient.Header{}, nil, user) if err != nil { return nil, err } if res.StatusCode != 200 { //err in fetching data resbody, _ := ioutil.ReadAll(res.Body) return nil, errors.New(fmt.Sprintf("op=fetchFile, url=%s, res=%s", url, resbody)) } return res.Body, err }
func FetchDataTokenByWorkId(workid string) (token string, err error) { targeturl := fmt.Sprintf("%s/work/%s?datatoken&client=%s", conf.SERVER_URL, workid, core.Self.Id) var headers httpclient.Header if conf.CLIENT_GROUP_TOKEN != "" { headers = httpclient.Header{ "Authorization": []string{"CG_TOKEN " + conf.CLIENT_GROUP_TOKEN}, } } res, err := httpclient.Get(targeturl, headers, nil, nil) if err != nil { return "", err } defer res.Body.Close() if res.Header != nil { if _, ok := res.Header["Datatoken"]; ok { token = res.Header["Datatoken"][0] } } return }
func heartbeating(host string, clientid string) (msg core.HBmsg, err error) { response := new(HeartbeatResponse) targeturl := fmt.Sprintf("%s/client/%s?heartbeat", host, clientid) //res, err := http.Get(targeturl) res, err := httpclient.Get(targeturl, httpclient.Header{}, nil, nil) logger.Debug(3, fmt.Sprintf("client %s sent a heartbeat to %s", host, clientid)) if err != nil { return } defer res.Body.Close() jsonstream, err := ioutil.ReadAll(res.Body) if err != nil { return } if err = json.Unmarshal(jsonstream, response); err == nil { if len(response.Errs) > 0 { return msg, errors.New(strings.Join(response.Errs, ",")) } return response.Data, nil } return }