Hi,
Line line 147 of register.go is status code check in the second for loop 
but now solved.

        if res.StatusCode != http.StatusNoContent {

But i still could not find out why the SendNFInstanceRegistration() message 
is send twice even though i have check
the responses here

fmt.Print("status:", status)

if status == http.StatusOK {
logrus.Println("PCF Profile Update SUCCESS")
} else if status == http.StatusCreated {
logrus.Println("PCF Profile Registration SUCCESS")
} else {

logrus.Println(fmt.Errorf("Wrong status code returned by nrf %d", status))
}

Response codes:
status:201INFO[0000] PCF Profile Registration SUCCESS             
status:200INFO[0000] PCF Profile Update SUCCESS  

I have check all errors and this is the final code but the problem now is 
the PUT message being sent twice. 
Could you help find out what am doing wrong
func SendNFInstanceRegistration() (int32, string, *http.Response, error) {

    var (
        profile Profile
        err        error
    )
    profilebytes, err := ioutil.ReadFile("./profile.json")
    if err != nil {
        logrus.Println("Cannot read json file")
    }
    // unmarshall it
    err = json.Unmarshal(profilebytes, &profile)
    if err != nil {
        logrus.Errorf("Read File profile Unmarshal failed %s", err.Error())
    }

    profile.NfInstanceId = contx.ID
    id := contx.ID

    locProfilebytes, err := json.Marshal(profile)
    if err != nil {
        logrus.Error(err)
    }

    locVarNRFUrl := NewConfig.BasePath + "/nf-instances/" + id

    htbt, contentLoc, resp, err := 
HandleNFInstanceRegistration(locProfilebytes, locVarUrl)
    if err != nil {
        logrus.Error("could not register profile")
        return htbt, contentLoc, resp, err
    }

    if resp == nil {
        logrus.Error(err)
        return htbt, contentLoc, resp, err
    }

    status := resp.StatusCode

    fmt.Print("status:", status)

    if status == http.StatusOK {
        logrus.Println("Profile Update SUCCESS")
    } else if status == http.StatusCreated {
        logrus.Println("Profile Registration SUCCESS")
    } else {

        logrus.Println(fmt.Errorf("Wrong status code returned %d", status))
    }

    heartBeatTimer := htbt
    return heartBeatTimer, contentLoc, resp, nil

}

func HandleNFInstanceRegistration(nfprofilebyte []byte, VarPath string) 
(int32, string, *http.Response, error) {

    var (
        // Set client and set url
        localVarHTTPMethod = http.MethodPut
        nfprofile          models.NfProfile
        heartBeatTimer     int32
        contentloc         string
    )

    req, err := http.NewRequest(localVarHTTPMethod, VarPath, 
bytes.NewBuffer(nfprofilebyte))
    if err != nil {
        logrus.Error(err)
    }
    req.Close = true
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Accept", "application/json")
    

    backoff := 1
    for {
        
        res, err := transport.Client.Do(req) //Use for dev
        if err != nil || res == nil {
            logrus.Println("trying to register profile ...")
            backoff *= 2
            if backoff > 20 {
                backoff = 20
            }
            time.Sleep(time.Duration(backoff) * time.Second)
            continue
        }

        if res == nil {
            logrus.Errorf("Registration failed %s", err.Error())
            return heartBeatTimer, contentloc, res, err
        }

        defer func() {
            if resCloseErr := res.Body.Close(); resCloseErr != nil {
                logrus.Errorf("RegisterNFInstance response body cannot 
close: %+v", resCloseErr)
            }
        }()

        bodybytes, err := ioutil.ReadAll(res.Body)
        if err != nil {
            logrus.Error(err)
            return heartBeatTimer, contentloc, res, err
        }

        err = json.Unmarshal(bodybytes, &nfprofile)
        if err != nil {
            logrus.Errorf("Profile Unmarshal failed %s", err.Error())
            return heartBeatTimer, contentloc, res, err
        }

        heartBeatTimer = nfprofile.HeartBeatTimer
        contentloc := res.Header.Get("Location")

        return heartBeatTimer, contentloc, res, nil
    }
}


func SendHeartbeat(ContentLocation string) (response *http.Response, err 
error) {

    // Preapare Heart-Beat message
    patchitem := []models.PatchItem{
        models.PatchItem{
            Op:    "replace",
            Path:  "/load",
            From:  ContentLocation,
            Value: "REG",
        }
    }

    patchitembytes, err := json.Marshal(patchitem)
    if err != nil {
        logrus.Error(err)
    }

    req, err := http.NewRequest("PATCH", ContentLocation, 
bytes.NewBuffer(patchitembytes))
    req.Header.Set("Content-Type", "application/json-patch+json")
    
    response, err = transport.Client.Do(req) // for dev
    if err != nil {
        logrus.Debug("Heart-Beat Request FAILED")
        return response, err
    }

    defer response.Body.Close()

    status := response.StatusCode
    if status == http.StatusNoContent {
        logrus.Info("Heart-Beat Message SUCCESS")

    } else if status == http.StatusNotFound {
        logrus.Println("Heart-Beat Message FAILED")
    }

    return response, err
}


func PutAndPatch() {

    var (
        interval int32
        resp     *http.Response
        cl       string
        err      error
    )
    for {

        for {
            interval, cl, resp, err = SendNFInstanceRegistration()
            if err != nil {
                logrus.Error(err)
                return
            }

            status := resp.StatusCode
            if status == http.StatusCreated || status == http.StatusOK {
                break
            }

        }

        ticker := time.NewTicker(time.Duration(interval) * time.Second)

        for range ticker.C {

            res, err := SendHeartbeat(cl)
            if err != nil {
                logrus.Error("Heat-Beat Message FAILED")
                break
            }
            if res.StatusCode != http.StatusNoContent {
                break
            }

        }

    }

}



On Sunday, March 21, 2021 at 1:47:07 PM UTC+2 Brian Candler wrote:

> On Sunday, 21 March 2021 at 11:42:37 UTC Brian Candler wrote:
>
>> Also: somebody has to be responsible for closing the response.  You're 
>> not explicitly returning an error from SendNFInstanceRegistration() to 
>> HandleNFInstanceRegistration(), so the only way you can indicate that the 
>> body is invalid is to return nil as the response pointer.
>>
>>
> Sorry, I got that the wrong way round.  SendNFInstanceRegistration calls 
> HandleNFInstanceRegistration, and you do return an error there.
>
> However, PutAndPatch calls SendNFInstanceRegistration, and you don't 
> return an error.  The caller then checks resp.StatusCode, but doesn't 
> account for the fact that there might have been some error, and so resp is 
> nil.
>
> I would suggest that instead of returning a resp, you return bool "ok" 
> which just says whether the request was successful or not.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/70f4feb3-8b0f-4b87-944d-4d59ef2799acn%40googlegroups.com.

Reply via email to