1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/pkg/cloudfoundry/Authentication.go
Daniel Mieg 7ea5b09555
Improve tests for cf steps (#1875)
* Improve Tests for cf steps:
CreateServiceKey and Delete Service

* Fix CodeClimate issues

* Adapt descriptions

* Defer logout
2020-08-10 11:08:34 +02:00

136 lines
3.4 KiB
Go

package cloudfoundry
import (
"errors"
"fmt"
"github.com/SAP/jenkins-library/pkg/command"
"github.com/SAP/jenkins-library/pkg/log"
)
//LoginCheck checks if user is logged in to Cloud Foundry with the receiver provided
//to the function call.
func (cf *CFUtils) LoginCheck(options LoginOptions) (bool, error) {
return cf.loggedIn, nil
}
//Login logs user in to Cloud Foundry via cf cli.
//Checks if user is logged in first, if not perform 'cf login' command with appropriate parameters
func (cf *CFUtils) Login(options LoginOptions) error {
var err error
_c := cf.Exec
if _c == nil {
_c = &command.Command{}
}
if options.CfAPIEndpoint == "" || options.CfOrg == "" || options.CfSpace == "" || options.Username == "" || options.Password == "" {
return fmt.Errorf("Failed to login to Cloud Foundry: %w", errors.New("Parameters missing. Please provide the Cloud Foundry Endpoint, Org, Space, Username and Password"))
}
var loggedIn bool
loggedIn, err = cf.LoginCheck(options)
if loggedIn == true {
return err
}
if err == nil {
log.Entry().Info("Logging in to Cloud Foundry")
var cfLoginScript = append([]string{
"login",
"-a", options.CfAPIEndpoint,
"-o", options.CfOrg,
"-s", options.CfSpace,
"-u", options.Username,
"-p", options.Password,
}, options.CfLoginOpts...)
log.Entry().WithField("cfAPI:", options.CfAPIEndpoint).WithField("cfOrg", options.CfOrg).WithField("space", options.CfSpace).Info("Logging into Cloud Foundry..")
err = _c.RunExecutable("cf", cfLoginScript...)
}
if err != nil {
return fmt.Errorf("Failed to login to Cloud Foundry: %w", err)
}
log.Entry().Info("Logged in successfully to Cloud Foundry..")
cf.loggedIn = true
return nil
}
//Logout logs User out of Cloud Foundry
//Logout can be perforned via 'cf logout' command regardless if user is logged in or not
func (cf *CFUtils) Logout() error {
_c := cf.Exec
if _c == nil {
_c = &command.Command{}
}
var cfLogoutScript = "logout"
log.Entry().Info("Logging out of Cloud Foundry")
err := _c.RunExecutable("cf", cfLogoutScript)
if err != nil {
return fmt.Errorf("Failed to Logout of Cloud Foundry: %w", err)
}
log.Entry().Info("Logged out successfully")
cf.loggedIn = false
return nil
}
//LoginOptions for logging in to CF
type LoginOptions struct {
CfAPIEndpoint string
CfOrg string
CfSpace string
Username string
Password string
CfLoginOpts []string
}
// CFUtils ...
type CFUtils struct {
// In order to avoid clashes between parallel workflows requiring cf login/logout
// this instance of command.ExecRunner can be configured accordingly by settings the
// environment variables CF_HOME to distict directories.
// In order to ensure plugins installed to the cf cli are found environment variables
// CF_PLUGIN_HOME can be set accordingly.
Exec command.ExecRunner
loggedIn bool
}
// AuthenticationUtils - interface for cloud foundry login and logout
type AuthenticationUtils interface {
Login(options LoginOptions) error
Logout() error
}
// CfUtilsMock - mock for CfUtils
type CfUtilsMock struct {
LoginError error
LogoutError error
}
// Login mock implementation
func (cf *CfUtilsMock) Login(options LoginOptions) error {
return cf.LoginError
}
// Logout mock implementation
func (cf *CfUtilsMock) Logout() error {
return cf.LogoutError
}
// Cleanup for CfUtilsMock
func (cf *CfUtilsMock) Cleanup() {
cf.LoginError = nil
cf.LogoutError = nil
}