mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-16 11:09:33 +02:00
7ea5b09555
* Improve Tests for cf steps: CreateServiceKey and Delete Service * Fix CodeClimate issues * Adapt descriptions * Defer logout
136 lines
3.4 KiB
Go
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
|
|
}
|