upload/koji: ensure that Koji type instance is always logged-in
Previously, Koji instance could be both logged-in and not logged-in. This change disallows it: Now, the Koji instance is created by calling koji.Login, so it must be always logged-in. This change should lead to more robust code.
This commit is contained in:
parent
f77f570202
commit
bc02da786d
3 changed files with 36 additions and 41 deletions
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -38,13 +39,7 @@ func main() {
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
k, err := koji.New(server)
|
k, err := koji.Login(server, "osbuild", "osbuildpass", http.DefaultTransport)
|
||||||
if err != nil {
|
|
||||||
println(err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = k.Login("osbuild", "osbuildpass")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println(err.Error())
|
println(err.Error())
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -106,15 +106,42 @@ type CGImportResult struct {
|
||||||
BuildID int `xmlrpc:"build_id"`
|
BuildID int `xmlrpc:"build_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(server string) (*Koji, error) {
|
func Login(server, user, password string) (*Koji, error) {
|
||||||
k := &Koji{}
|
// Create a temporary xmlrpc client with the default http transport
|
||||||
client, err := xmlrpc.NewClient(server, http.DefaultTransport)
|
// as we don't need sessionID, key nor callnum yet.
|
||||||
|
loginClient, err := xmlrpc.NewClient(server, http.DefaultTransport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
k.xmlrpc = client
|
|
||||||
k.server = server
|
args := []interface{}{user, password}
|
||||||
return k, nil
|
var reply struct {
|
||||||
|
SessionID int64 `xmlrpc:"session-id"`
|
||||||
|
SessionKey string `xmlrpc:"session-key"`
|
||||||
|
}
|
||||||
|
err = loginClient.Call("login", args, &reply)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the final xmlrpc client with our custom RoundTripper handling
|
||||||
|
// sessionID, sessionKey and callnum
|
||||||
|
kojiTransport := &Transport{
|
||||||
|
sessionID: reply.SessionID,
|
||||||
|
sessionKey: reply.SessionKey,
|
||||||
|
callnum: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
client, err := xmlrpc.NewClient(server, kojiTransport)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Koji{
|
||||||
|
xmlrpc: client,
|
||||||
|
server: server,
|
||||||
|
transport: kojiTransport,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAPIVersion gets the version of the API of the remote Koji instance
|
// GetAPIVersion gets the version of the API of the remote Koji instance
|
||||||
|
|
@ -128,26 +155,6 @@ func (k *Koji) GetAPIVersion() (int, error) {
|
||||||
return version, nil
|
return version, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Login sets up a new session with the given user/password
|
|
||||||
func (k *Koji) Login(user, password string) error {
|
|
||||||
args := []interface{}{user, password}
|
|
||||||
var reply struct {
|
|
||||||
SessionID int64 `xmlrpc:"session-id"`
|
|
||||||
SessionKey string `xmlrpc:"session-key"`
|
|
||||||
}
|
|
||||||
err := k.xmlrpc.Call("login", args, &reply)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
k.transport = &Transport{
|
|
||||||
sessionID: reply.SessionID,
|
|
||||||
sessionKey: reply.SessionKey,
|
|
||||||
callnum: 0,
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logout ends the session
|
// Logout ends the session
|
||||||
func (k *Koji) Logout() error {
|
func (k *Koji) Logout() error {
|
||||||
err := k.xmlrpc.Call("logout", nil, nil)
|
err := k.xmlrpc.Call("logout", nil, nil)
|
||||||
|
|
@ -279,10 +286,6 @@ type Transport struct {
|
||||||
// us to adjust the URL per-call (these arguments should really be in
|
// us to adjust the URL per-call (these arguments should really be in
|
||||||
// the body).
|
// the body).
|
||||||
func (rt *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
|
func (rt *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
if rt.sessionKey == "" {
|
|
||||||
return http.DefaultTransport.RoundTrip(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clone the request, so as not to alter the passed in value.
|
// Clone the request, so as not to alter the passed in value.
|
||||||
rClone := new(http.Request)
|
rClone := new(http.Request)
|
||||||
*rClone = *req
|
*rClone = *req
|
||||||
|
|
|
||||||
|
|
@ -31,10 +31,7 @@ func TestKojiImport(t *testing.T) {
|
||||||
// koji needs to specify a directory to which the upload should happen, let's reuse the build name
|
// koji needs to specify a directory to which the upload should happen, let's reuse the build name
|
||||||
uploadDirectory := buildName
|
uploadDirectory := buildName
|
||||||
|
|
||||||
// authenticate
|
k, err := koji.Login(server, user, password)
|
||||||
k, err := koji.New(server)
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = k.Login(user, password)
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue