Merge pull request #63824 from dougm/vsphere-token-auth
Automatic merge from submit-queue (batch tested with PRs 63886, 63857, 63824). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. vSphere Cloud Provider: add SAML token authentication support **What this PR does / why we need it**: The vSphere cloud provider currently supports username+password based authentication, this PR adds an option to use token based authentication. **Which issue(s) this PR fixes**: Fixes #63209 **Special notes for your reviewer**: For now the config structs and validation are left as-is and the LoginByToken method is used if the username value is PEM encoded. In this case of username field configured with the public key, the password field is expected to be configured with the private key. In a follow-up PR we can look at collapsing the auth related fields into a common struct to avoid duplication of field merging and validation. And then add separate fields for the public and private keys. **Release note**: ```release-note vSphere Cloud Provider: add SAML token authentication support ```
This commit is contained in:
commit
a481f4bbe8
123
Godeps/Godeps.json
generated
123
Godeps/Godeps.json
generated
@ -2677,113 +2677,148 @@
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/find",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/list",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/lookup",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/lookup/methods",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/lookup/simulator",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/lookup/types",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/nfc",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/object",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/pbm",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/pbm/methods",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/pbm/types",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/property",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/session",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/simulator",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/simulator/esx",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/simulator/vpx",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/sts",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/sts/internal",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/sts/simulator",
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/task",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/debug",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/methods",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/mo",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/progress",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/soap",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/types",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/govmomi/vim25/xml",
|
||||
"Comment": "v0.16.0-97-g0f82f03",
|
||||
"Rev": "0f82f03a2bbf14037d2331cf02f1d4157bbef6cc"
|
||||
"Comment": "v0.17.1-46-ge70dd44",
|
||||
"Rev": "e70dd44f80baf671099254d675eb278529038234"
|
||||
},
|
||||
{
|
||||
"ImportPath": "github.com/vmware/photon-controller-go-sdk/SSPI",
|
||||
|
1470
Godeps/LICENSES
generated
1470
Godeps/LICENSES
generated
File diff suppressed because it is too large
Load Diff
@ -39,7 +39,10 @@ go_test(
|
||||
deps = [
|
||||
"//pkg/cloudprovider:go_default_library",
|
||||
"//pkg/cloudprovider/providers/vsphere/vclib:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/simulator:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/simulator:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/simulator/vpx:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/sts/simulator:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library",
|
||||
],
|
||||
|
@ -32,6 +32,7 @@ go_library(
|
||||
"//vendor/github.com/vmware/govmomi/pbm/types:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/property:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/session:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/sts:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
|
@ -18,12 +18,15 @@ package vclib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/pem"
|
||||
"net"
|
||||
neturl "net/url"
|
||||
"sync"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/vmware/govmomi/session"
|
||||
"github.com/vmware/govmomi/sts"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
)
|
||||
@ -78,6 +81,49 @@ func (connection *VSphereConnection) Connect(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// login calls SessionManager.LoginByToken if certificate and private key are configured,
|
||||
// otherwise calls SessionManager.Login with user and password.
|
||||
func (connection *VSphereConnection) login(ctx context.Context, client *vim25.Client) error {
|
||||
m := session.NewManager(client)
|
||||
|
||||
// TODO: Add separate fields for certificate and private-key.
|
||||
// For now we can leave the config structs and validation as-is and
|
||||
// decide to use LoginByToken if the username value is PEM encoded.
|
||||
b, _ := pem.Decode([]byte(connection.Username))
|
||||
if b == nil {
|
||||
glog.V(3).Infof("SessionManager.Login with username '%s'", connection.Username)
|
||||
return m.Login(ctx, neturl.UserPassword(connection.Username, connection.Password))
|
||||
}
|
||||
|
||||
glog.V(3).Infof("SessionManager.LoginByToken with certificate '%s'", connection.Username)
|
||||
|
||||
cert, err := tls.X509KeyPair([]byte(connection.Username), []byte(connection.Password))
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to load X509 key pair. err: %+v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
tokens, err := sts.NewClient(ctx, client)
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to create STS client. err: %+v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
req := sts.TokenRequest{
|
||||
Certificate: &cert,
|
||||
}
|
||||
|
||||
signer, err := tokens.Issue(ctx, req)
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to issue SAML token. err: %+v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
header := soap.Header{Security: signer}
|
||||
|
||||
return m.LoginByToken(client.WithHeader(ctx, header))
|
||||
}
|
||||
|
||||
// Logout calls SessionManager.Logout for the given connection.
|
||||
func (connection *VSphereConnection) Logout(ctx context.Context) {
|
||||
m := session.NewManager(connection.Client)
|
||||
@ -100,13 +146,16 @@ func (connection *VSphereConnection) NewClient(ctx context.Context) (*vim25.Clie
|
||||
glog.Errorf("Failed to create new client. err: %+v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
m := session.NewManager(client)
|
||||
|
||||
err = m.Login(ctx, neturl.UserPassword(connection.Username, connection.Password))
|
||||
err = connection.login(ctx, client)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if glog.V(3) {
|
||||
s, err := session.NewManager(client).UserSession(ctx)
|
||||
if err == nil {
|
||||
glog.Infof("New session ID for '%s' = %s", s.UserName, s.Key)
|
||||
}
|
||||
}
|
||||
|
||||
if connection.RoundTripperCount == 0 {
|
||||
connection.RoundTripperCount = RoundTripperDefaultCount
|
||||
|
@ -25,13 +25,41 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
lookup "github.com/vmware/govmomi/lookup/simulator"
|
||||
"github.com/vmware/govmomi/simulator"
|
||||
"github.com/vmware/govmomi/simulator/vpx"
|
||||
sts "github.com/vmware/govmomi/sts/simulator"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/apimachinery/pkg/util/rand"
|
||||
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib"
|
||||
)
|
||||
|
||||
// localhostCert was generated from crypto/tls/generate_cert.go with the following command:
|
||||
// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h
|
||||
var localhostCert = `-----BEGIN CERTIFICATE-----
|
||||
MIIBjzCCATmgAwIBAgIRAKpi2WmTcFrVjxrl5n5YDUEwDQYJKoZIhvcNAQELBQAw
|
||||
EjEQMA4GA1UEChMHQWNtZSBDbzAgFw03MDAxMDEwMDAwMDBaGA8yMDg0MDEyOTE2
|
||||
MDAwMFowEjEQMA4GA1UEChMHQWNtZSBDbzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
|
||||
QQC9fEbRszP3t14Gr4oahV7zFObBI4TfA5i7YnlMXeLinb7MnvT4bkfOJzE6zktn
|
||||
59zP7UiHs3l4YOuqrjiwM413AgMBAAGjaDBmMA4GA1UdDwEB/wQEAwICpDATBgNV
|
||||
HSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MC4GA1UdEQQnMCWCC2V4
|
||||
YW1wbGUuY29thwR/AAABhxAAAAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUA
|
||||
A0EAUsVE6KMnza/ZbodLlyeMzdo7EM/5nb5ywyOxgIOCf0OOLHsPS9ueGLQX9HEG
|
||||
//yjTXuhNcUugExIjM/AIwAZPQ==
|
||||
-----END CERTIFICATE-----`
|
||||
|
||||
// localhostKey is the private key for localhostCert.
|
||||
var localhostKey = `-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIBOwIBAAJBAL18RtGzM/e3XgavihqFXvMU5sEjhN8DmLtieUxd4uKdvsye9Phu
|
||||
R84nMTrOS2fn3M/tSIezeXhg66quOLAzjXcCAwEAAQJBAKcRxH9wuglYLBdI/0OT
|
||||
BLzfWPZCEw1vZmMR2FF1Fm8nkNOVDPleeVGTWoOEcYYlQbpTmkGSxJ6ya+hqRi6x
|
||||
goECIQDx3+X49fwpL6B5qpJIJMyZBSCuMhH4B7JevhGGFENi3wIhAMiNJN5Q3UkL
|
||||
IuSvv03kaPR5XVQ99/UeEetUgGvBcABpAiBJSBzVITIVCGkGc7d+RCf49KTCIklv
|
||||
bGWObufAR8Ni4QIgWpILjW8dkGg8GOUZ0zaNA6Nvt6TIv2UWGJ4v5PoV98kCIQDx
|
||||
rIiZs5QbKdycsv9gQJzwQAogC8o04X3Zz3dsoX+h4A==
|
||||
-----END RSA PRIVATE KEY-----`
|
||||
|
||||
func configFromEnv() (cfg VSphereConfig, ok bool) {
|
||||
var InsecureFlag bool
|
||||
var err error
|
||||
@ -61,14 +89,9 @@ func configFromEnv() (cfg VSphereConfig, ok bool) {
|
||||
return
|
||||
}
|
||||
|
||||
// configFromEnvOrSim returns config from configFromEnv if set,
|
||||
// otherwise starts a vcsim instance and returns config for use against the vcsim instance.
|
||||
func configFromEnvOrSim() (VSphereConfig, func()) {
|
||||
cfg, ok := configFromEnv()
|
||||
if ok {
|
||||
return cfg, func() {}
|
||||
}
|
||||
|
||||
// configFromSim starts a vcsim instance and returns config for use against the vcsim instance.
|
||||
func configFromSim() (VSphereConfig, func()) {
|
||||
var cfg VSphereConfig
|
||||
model := simulator.VPX()
|
||||
|
||||
err := model.Create()
|
||||
@ -79,6 +102,13 @@ func configFromEnvOrSim() (VSphereConfig, func()) {
|
||||
model.Service.TLS = new(tls.Config)
|
||||
s := model.Service.NewServer()
|
||||
|
||||
// STS simulator
|
||||
path, handler := sts.New(s.URL, vpx.Setting)
|
||||
model.Service.ServeMux.Handle(path, handler)
|
||||
|
||||
// Lookup Service simulator
|
||||
model.Service.RegisterSDK(lookup.New())
|
||||
|
||||
cfg.Global.InsecureFlag = true
|
||||
cfg.Global.VCenterIP = s.URL.Hostname()
|
||||
cfg.Global.VCenterPort = s.URL.Port()
|
||||
@ -105,6 +135,15 @@ func configFromEnvOrSim() (VSphereConfig, func()) {
|
||||
}
|
||||
}
|
||||
|
||||
// configFromEnvOrSim returns config from configFromEnv if set, otherwise returns configFromSim.
|
||||
func configFromEnvOrSim() (VSphereConfig, func()) {
|
||||
cfg, ok := configFromEnv()
|
||||
if ok {
|
||||
return cfg, func() {}
|
||||
}
|
||||
return configFromSim()
|
||||
}
|
||||
|
||||
func TestReadConfig(t *testing.T) {
|
||||
_, err := readConfig(nil)
|
||||
if err == nil {
|
||||
@ -179,7 +218,36 @@ func TestVSphereLogin(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Errorf("Failed to connect to vSphere: %s", err)
|
||||
}
|
||||
defer vcInstance.conn.Logout(ctx)
|
||||
vcInstance.conn.Logout(ctx)
|
||||
}
|
||||
|
||||
func TestVSphereLoginByToken(t *testing.T) {
|
||||
cfg, cleanup := configFromSim()
|
||||
defer cleanup()
|
||||
|
||||
// Configure for SAML token auth
|
||||
cfg.Global.User = localhostCert
|
||||
cfg.Global.Password = localhostKey
|
||||
|
||||
// Create vSphere configuration object
|
||||
vs, err := newControllerNode(cfg)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to construct/authenticate vSphere: %s", err)
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// Create vSphere client
|
||||
vcInstance, ok := vs.vsphereInstanceMap[cfg.Global.VCenterIP]
|
||||
if !ok {
|
||||
t.Fatalf("Couldn't get vSphere instance: %s", cfg.Global.VCenterIP)
|
||||
}
|
||||
|
||||
err = vcInstance.conn.Connect(ctx)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to connect to vSphere: %s", err)
|
||||
}
|
||||
vcInstance.conn.Logout(ctx)
|
||||
}
|
||||
|
||||
func TestZones(t *testing.T) {
|
||||
|
1
vendor/github.com/vmware/govmomi/.gitignore
generated
vendored
1
vendor/github.com/vmware/govmomi/.gitignore
generated
vendored
@ -1 +1,2 @@
|
||||
secrets.yml
|
||||
dist/
|
||||
|
57
vendor/github.com/vmware/govmomi/.goreleaser.yml
generated
vendored
Normal file
57
vendor/github.com/vmware/govmomi/.goreleaser.yml
generated
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
---
|
||||
project_name: govc
|
||||
builds:
|
||||
- goos:
|
||||
- linux
|
||||
- darwin
|
||||
- windows
|
||||
- freebsd
|
||||
goarch:
|
||||
- amd64
|
||||
- 386
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
main: ./govc/main.go
|
||||
binary: govc
|
||||
flags: -compiler gc
|
||||
ldflags: -X github.com/vmware/govmomi/govc/flags.GitVersion={{.Version}}
|
||||
archive:
|
||||
name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}'
|
||||
format: tar.gz
|
||||
format_overrides:
|
||||
- goos: windows
|
||||
format: zip
|
||||
files:
|
||||
- none*
|
||||
checksum:
|
||||
name_template: '{{ .ProjectName }}_{{ .Version }}_checksums.txt'
|
||||
changelog:
|
||||
sort: asc
|
||||
filters:
|
||||
exclude:
|
||||
- '^docs:'
|
||||
- '^test:'
|
||||
- Merge pull request
|
||||
- Merge branch
|
||||
brew:
|
||||
github:
|
||||
owner: govmomi
|
||||
name: homebrew-tap
|
||||
commit_author:
|
||||
name: Alfred the Narwhal
|
||||
email: cna-alfred@vmware.com
|
||||
folder: Formula
|
||||
homepage: "https://github.com/vmware/govmomi/blob/master/govc/README.md"
|
||||
description: "govc is a vSphere CLI built on top of govmomi."
|
||||
test: |
|
||||
system "#{bin}/govc version"
|
||||
dockers:
|
||||
- image: vmware/govc
|
||||
goos: linux
|
||||
goarch: amd64
|
||||
binary: govc
|
||||
tag_templates:
|
||||
- "{{ .Tag }}"
|
||||
- "v{{ .Major }}"
|
||||
- "v{{ .Major }}.{{ .Minor }}"
|
||||
- latest
|
19
vendor/github.com/vmware/govmomi/.travis.yml
generated
vendored
19
vendor/github.com/vmware/govmomi/.travis.yml
generated
vendored
@ -3,11 +3,28 @@ sudo: false
|
||||
language: go
|
||||
|
||||
go:
|
||||
- 1.8
|
||||
- 1.8.x
|
||||
- 1.9.x
|
||||
- '1.10'
|
||||
go_import_path: github.com/vmware/govmomi
|
||||
|
||||
before_install:
|
||||
- sudo apt-get -qq update
|
||||
- sudo apt-get install -y xmlstarlet
|
||||
- make vendor
|
||||
|
||||
script:
|
||||
- make check test
|
||||
- GOOS=windows make install
|
||||
|
||||
after_success:
|
||||
- test -n "$TRAVIS_TAG" && docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
|
||||
|
||||
deploy:
|
||||
- provider: script
|
||||
skip_cleanup: true
|
||||
script: curl -sL http://git.io/goreleaser | bash
|
||||
on:
|
||||
tags: true
|
||||
condition: $TRAVIS_OS_NAME = linux
|
||||
go: '1.10'
|
2
vendor/github.com/vmware/govmomi/BUILD
generated
vendored
2
vendor/github.com/vmware/govmomi/BUILD
generated
vendored
@ -27,12 +27,14 @@ filegroup(
|
||||
":package-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/find:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/list:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/lookup:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/nfc:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/object:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/pbm:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/property:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/session:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/simulator:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/sts:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/task:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/vim25:all-srcs",
|
||||
],
|
||||
|
18
vendor/github.com/vmware/govmomi/CHANGELOG.md
generated
vendored
18
vendor/github.com/vmware/govmomi/CHANGELOG.md
generated
vendored
@ -1,5 +1,23 @@
|
||||
# changelog
|
||||
|
||||
### 0.17.1 (2018-03-19)
|
||||
|
||||
* vcsim: add Destroy method for Folder and Datacenter types
|
||||
|
||||
* In progress.Reader emit final report on EOF.
|
||||
|
||||
* vcsim: add EventManager.QueryEvents
|
||||
|
||||
### 0.17.0 (2018-02-28)
|
||||
|
||||
* Add HostStorageSystem.AttachScsiLun method
|
||||
|
||||
* Avoid possible panic in Datastore.Stat (#969)
|
||||
|
||||
* Destroy event history collectors (#962)
|
||||
|
||||
* Add VirtualDiskManager.CreateChildDisk method
|
||||
|
||||
### 0.16.0 (2017-11-08)
|
||||
|
||||
* Add support for SOAP request operation ID header
|
||||
|
16
vendor/github.com/vmware/govmomi/CONTRIBUTORS
generated
vendored
16
vendor/github.com/vmware/govmomi/CONTRIBUTORS
generated
vendored
@ -6,8 +6,10 @@
|
||||
Abhijeet Kasurde <akasurde@redhat.com>
|
||||
abrarshivani <abrarshivani@users.noreply.github.com>
|
||||
Adam Shannon <adamkshannon@gmail.com>
|
||||
Alessandro Cortiana <alessandro.cortiana@gmail.com>
|
||||
Alex Bozhenko <alexbozhenko@fb.com>
|
||||
Alvaro Miranda <kikitux@gmail.com>
|
||||
amandahla <amanda.andrade@serpro.gov.br>
|
||||
Amanda H. L. de Andrade <amanda.andrade@serpro.gov.br>
|
||||
Amit Bathla <abathla@.vmware.com>
|
||||
amit bezalel <amit.bezalel@hpe.com>
|
||||
Andrew Chin <andrew@andrewtchin.com>
|
||||
@ -21,17 +23,19 @@ bastienbc <bastien.barbe.creuly@gmail.com>
|
||||
Bob Killen <killen.bob@gmail.com>
|
||||
Brad Fitzpatrick <bradfitz@golang.org>
|
||||
Bruce Downs <bruceadowns@gmail.com>
|
||||
Cédric Blomart <cblomart@gmail.com>
|
||||
Chris Marchesi <chrism@vancluevertech.com>
|
||||
Christian Höltje <docwhat@gerf.org>
|
||||
Clint Greenwood <cgreenwood@vmware.com>
|
||||
Cédric Blomart <cblomart@gmail.com>
|
||||
Danny Lockard <danny.lockard@banno.com>
|
||||
Dave Tucker <dave@dtucker.co.uk>
|
||||
Davide Agnello <dagnello@hp.com>
|
||||
David Stark <dave@davidstark.name>
|
||||
Davide Agnello <dagnello@hp.com>
|
||||
Doug MacEachern <dougm@vmware.com>
|
||||
Eloy Coto <eloy.coto@gmail.com>
|
||||
Eric Gray <egray@vmware.com>
|
||||
Eric Yutao <eric.yutao@gmail.com>
|
||||
Erik Hollensbe <github@hollensbe.org>
|
||||
Fabio Rapposelli <fabio@vmware.com>
|
||||
Faiyaz Ahmed <ahmedf@vmware.com>
|
||||
forkbomber <forkbomber@users.noreply.github.com>
|
||||
@ -46,11 +50,14 @@ Isaac Rodman <isaac@eyz.us>
|
||||
Ivan Porto Carrero <icarrero@vmware.com>
|
||||
Jason Kincl <jkincl@gmail.com>
|
||||
Jeremy Canady <jcanady@jackhenry.com>
|
||||
jeremy-clerc <jeremy@clerc.io>
|
||||
João Pereira <joaodrp@gmail.com>
|
||||
Louie Jiang <jiangl@vmware.com>
|
||||
Marc Carmier <mcarmier@gmail.com>
|
||||
Matthew Cosgrove <matthew.cosgrove@dell.com>
|
||||
Mevan Samaratunga <mevansam@gmail.com>
|
||||
Nicolas Lamirault <nicolas.lamirault@gmail.com>
|
||||
Parham Alvani <parham.alvani@gmail.com>
|
||||
Pieter Noordhuis <pnoordhuis@vmware.com>
|
||||
runner.mei <runner.mei@gmail.com>
|
||||
S.Çağlar Onur <conur@vmware.com>
|
||||
@ -60,7 +67,10 @@ Takaaki Furukawa <takaaki.frkw@gmail.com>
|
||||
tanishi <tanishi503@gmail.com>
|
||||
Ted Zlatanov <tzz@lifelogs.com>
|
||||
Thibaut Ackermann <thibaut.ackermann@alcatel-lucent.com>
|
||||
Trevor Dawe <trevor.dawe@gmail.com>
|
||||
Vadim Egorov <vegorov@vmware.com>
|
||||
Volodymyr Bobyr <pupsua@gmail.com>
|
||||
Witold Krecicki <wpk@culm.net>
|
||||
Yang Yang <yangy@vmware.com>
|
||||
Yuya Kusakabe <yuya.kusakabe@gmail.com>
|
||||
Zach Tucker <ztucker@vmware.com>
|
||||
|
4
vendor/github.com/vmware/govmomi/Dockerfile
generated
vendored
Normal file
4
vendor/github.com/vmware/govmomi/Dockerfile
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
FROM scratch
|
||||
LABEL maintainer="fabio@vmware.com"
|
||||
COPY govc /
|
||||
ENTRYPOINT [ "/govc" ]
|
44
vendor/github.com/vmware/govmomi/Gopkg.lock
generated
vendored
Normal file
44
vendor/github.com/vmware/govmomi/Gopkg.lock
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||
|
||||
|
||||
[[projects]]
|
||||
branch = "improvements"
|
||||
name = "github.com/davecgh/go-xdr"
|
||||
packages = ["xdr2"]
|
||||
revision = "4930550ba2e22f87187498acfd78348b15f4e7a8"
|
||||
source = "https://github.com/rasky/go-xdr"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/google/uuid"
|
||||
packages = ["."]
|
||||
revision = "6a5e28554805e78ea6141142aba763936c4761c0"
|
||||
|
||||
[[projects]]
|
||||
branch = "govmomi"
|
||||
name = "github.com/kr/pretty"
|
||||
packages = ["."]
|
||||
revision = "2ee9d7453c02ef7fa518a83ae23644eb8872186a"
|
||||
source = "https://github.com/dougm/pretty"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/kr/text"
|
||||
packages = ["."]
|
||||
revision = "7cafcd837844e784b526369c9bce262804aebc60"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/vmware/vmw-guestinfo"
|
||||
packages = [
|
||||
"bdoor",
|
||||
"message",
|
||||
"vmcheck"
|
||||
]
|
||||
revision = "25eff159a728be87e103a0b8045e08273f4dbec4"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
inputs-digest = "376638fa6c0621cbd980caf8fc53494d880886f100663da8de47ecb6e596e439"
|
||||
solver-name = "gps-cdcl"
|
||||
solver-version = 1
|
19
vendor/github.com/vmware/govmomi/Gopkg.toml
generated
vendored
Normal file
19
vendor/github.com/vmware/govmomi/Gopkg.toml
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
|
||||
# for detailed Gopkg.toml documentation.
|
||||
#
|
||||
# Refer to https://github.com/toml-lang/toml for detailed TOML docs.
|
||||
|
||||
[prune]
|
||||
non-go = true
|
||||
go-tests = true
|
||||
unused-packages = true
|
||||
|
||||
[[constraint]]
|
||||
branch = "improvements"
|
||||
name = "github.com/davecgh/go-xdr"
|
||||
source = "https://github.com/rasky/go-xdr"
|
||||
|
||||
[[constraint]]
|
||||
branch = "govmomi"
|
||||
name = "github.com/kr/pretty"
|
||||
source = "https://github.com/dougm/pretty"
|
31
vendor/github.com/vmware/govmomi/client.go
generated
vendored
31
vendor/github.com/vmware/govmomi/client.go
generated
vendored
@ -58,7 +58,6 @@ package govmomi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"net/url"
|
||||
|
||||
"github.com/vmware/govmomi/property"
|
||||
@ -99,41 +98,11 @@ func NewClient(ctx context.Context, u *url.URL, insecure bool) (*Client, error)
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// NewClientWithCertificate creates a new client from a URL. The client authenticates with the
|
||||
// server with the certificate before returning if the URL contains user information.
|
||||
func NewClientWithCertificate(ctx context.Context, u *url.URL, insecure bool, cert tls.Certificate) (*Client, error) {
|
||||
soapClient := soap.NewClient(u, insecure)
|
||||
soapClient.SetCertificate(cert)
|
||||
vimClient, err := vim25.NewClient(ctx, soapClient)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c := &Client{
|
||||
Client: vimClient,
|
||||
SessionManager: session.NewManager(vimClient),
|
||||
}
|
||||
|
||||
if u.User != nil {
|
||||
err = c.LoginExtensionByCertificate(ctx, u.User.Username(), "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// Login dispatches to the SessionManager.
|
||||
func (c *Client) Login(ctx context.Context, u *url.Userinfo) error {
|
||||
return c.SessionManager.Login(ctx, u)
|
||||
}
|
||||
|
||||
// Login dispatches to the SessionManager.
|
||||
func (c *Client) LoginExtensionByCertificate(ctx context.Context, key string, locale string) error {
|
||||
return c.SessionManager.LoginExtensionByCertificate(ctx, key, locale)
|
||||
}
|
||||
|
||||
// Logout dispatches to the SessionManager.
|
||||
func (c *Client) Logout(ctx context.Context) error {
|
||||
// Close any idle connections after logging out.
|
||||
|
2
vendor/github.com/vmware/govmomi/find/finder.go
generated
vendored
2
vendor/github.com/vmware/govmomi/find/finder.go
generated
vendored
@ -716,7 +716,7 @@ func (f *Finder) HostSystem(ctx context.Context, path string) (*object.HostSyste
|
||||
}
|
||||
|
||||
func (f *Finder) DefaultHostSystem(ctx context.Context) (*object.HostSystem, error) {
|
||||
hs, err := f.HostSystem(ctx, "*/*")
|
||||
hs, err := f.HostSystem(ctx, "*")
|
||||
if err != nil {
|
||||
return nil, toDefaultError(err)
|
||||
}
|
||||
|
34
vendor/github.com/vmware/govmomi/lookup/BUILD
generated
vendored
Normal file
34
vendor/github.com/vmware/govmomi/lookup/BUILD
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["client.go"],
|
||||
importpath = "github.com/vmware/govmomi/lookup",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/vmware/govmomi/lookup/methods:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/types:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/types:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [
|
||||
":package-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/methods:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/simulator:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/types:all-srcs",
|
||||
],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
135
vendor/github.com/vmware/govmomi/lookup/client.go
generated
vendored
Normal file
135
vendor/github.com/vmware/govmomi/lookup/client.go
generated
vendored
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package lookup
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"log"
|
||||
"net/url"
|
||||
|
||||
"github.com/vmware/govmomi/lookup/methods"
|
||||
"github.com/vmware/govmomi/lookup/types"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
vim "github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
const (
|
||||
Namespace = "lookup"
|
||||
Version = "2.0"
|
||||
Path = "/lookupservice" + vim25.Path
|
||||
)
|
||||
|
||||
var (
|
||||
ServiceInstance = vim.ManagedObjectReference{
|
||||
Type: "LookupServiceInstance",
|
||||
Value: "ServiceInstance",
|
||||
}
|
||||
)
|
||||
|
||||
// Client is a soap.Client targeting the SSO Lookup Service API endpoint.
|
||||
type Client struct {
|
||||
*soap.Client
|
||||
|
||||
ServiceContent types.LookupServiceContent
|
||||
}
|
||||
|
||||
// NewClient returns a client targeting the SSO Lookup Service API endpoint.
|
||||
func NewClient(ctx context.Context, c *vim25.Client) (*Client, error) {
|
||||
sc := c.Client.NewServiceClient(Path, Namespace)
|
||||
sc.Version = Version
|
||||
|
||||
req := types.RetrieveServiceContent{
|
||||
This: ServiceInstance,
|
||||
}
|
||||
|
||||
res, err := methods.RetrieveServiceContent(ctx, sc, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Client{sc, res.Returnval}, nil
|
||||
}
|
||||
|
||||
func (c *Client) List(ctx context.Context, filter *types.LookupServiceRegistrationFilter) ([]types.LookupServiceRegistrationInfo, error) {
|
||||
req := types.List{
|
||||
This: *c.ServiceContent.ServiceRegistration,
|
||||
FilterCriteria: filter,
|
||||
}
|
||||
|
||||
res, err := methods.List(ctx, c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (c *Client) SiteID(ctx context.Context) (string, error) {
|
||||
req := types.GetSiteId{
|
||||
This: *c.ServiceContent.ServiceRegistration,
|
||||
}
|
||||
|
||||
res, err := methods.GetSiteId(ctx, c, &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// EndpointURL uses the Lookup Service to find the endpoint URL and thumbprint for the given filter.
|
||||
// If the endpoint is found, its TLS certificate is also added to the vim25.Client's trusted host thumbprints.
|
||||
// If the Lookup Service is not available, the given path is returned as the default.
|
||||
func EndpointURL(ctx context.Context, c *vim25.Client, path string, filter *types.LookupServiceRegistrationFilter) string {
|
||||
if lu, err := NewClient(ctx, c); err == nil {
|
||||
info, _ := lu.List(ctx, filter)
|
||||
if len(info) != 0 && len(info[0].ServiceEndpoints) != 0 {
|
||||
endpoint := &info[0].ServiceEndpoints[0]
|
||||
path = endpoint.Url
|
||||
|
||||
if u, err := url.Parse(path); err == nil {
|
||||
if c.Thumbprint(u.Host) == "" {
|
||||
c.SetThumbprint(u.Host, endpointThumbprint(endpoint))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
// endpointThumbprint converts the base64 encoded endpoint certificate to a SHA1 thumbprint.
|
||||
func endpointThumbprint(endpoint *types.LookupServiceRegistrationEndpoint) string {
|
||||
if len(endpoint.SslTrust) == 0 {
|
||||
return ""
|
||||
}
|
||||
enc := endpoint.SslTrust[0]
|
||||
|
||||
b, err := base64.StdEncoding.DecodeString(enc)
|
||||
if err != nil {
|
||||
log.Printf("base64.Decode(%q): %s", enc, err)
|
||||
return ""
|
||||
}
|
||||
|
||||
cert, err := x509.ParseCertificate(b)
|
||||
if err != nil {
|
||||
log.Printf("x509.ParseCertificate(%q): %s", enc, err)
|
||||
return ""
|
||||
}
|
||||
|
||||
return soap.ThumbprintSHA1(cert)
|
||||
}
|
26
vendor/github.com/vmware/govmomi/lookup/methods/BUILD
generated
vendored
Normal file
26
vendor/github.com/vmware/govmomi/lookup/methods/BUILD
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["methods.go"],
|
||||
importpath = "github.com/vmware/govmomi/lookup/methods",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/vmware/govmomi/lookup/types:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
224
vendor/github.com/vmware/govmomi/lookup/methods/methods.go
generated
vendored
Normal file
224
vendor/github.com/vmware/govmomi/lookup/methods/methods.go
generated
vendored
Normal file
@ -0,0 +1,224 @@
|
||||
/*
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package methods
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/vmware/govmomi/lookup/types"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
)
|
||||
|
||||
type CreateBody struct {
|
||||
Req *types.Create `xml:"urn:lookup Create,omitempty"`
|
||||
Res *types.CreateResponse `xml:"urn:lookup CreateResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *CreateBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func Create(ctx context.Context, r soap.RoundTripper, req *types.Create) (*types.CreateResponse, error) {
|
||||
var reqBody, resBody CreateBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type DeleteBody struct {
|
||||
Req *types.Delete `xml:"urn:lookup Delete,omitempty"`
|
||||
Res *types.DeleteResponse `xml:"urn:lookup DeleteResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *DeleteBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func Delete(ctx context.Context, r soap.RoundTripper, req *types.Delete) (*types.DeleteResponse, error) {
|
||||
var reqBody, resBody DeleteBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type GetBody struct {
|
||||
Req *types.Get `xml:"urn:lookup Get,omitempty"`
|
||||
Res *types.GetResponse `xml:"urn:lookup GetResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *GetBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func Get(ctx context.Context, r soap.RoundTripper, req *types.Get) (*types.GetResponse, error) {
|
||||
var reqBody, resBody GetBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type GetLocaleBody struct {
|
||||
Req *types.GetLocale `xml:"urn:lookup GetLocale,omitempty"`
|
||||
Res *types.GetLocaleResponse `xml:"urn:lookup GetLocaleResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *GetLocaleBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func GetLocale(ctx context.Context, r soap.RoundTripper, req *types.GetLocale) (*types.GetLocaleResponse, error) {
|
||||
var reqBody, resBody GetLocaleBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type GetSiteIdBody struct {
|
||||
Req *types.GetSiteId `xml:"urn:lookup GetSiteId,omitempty"`
|
||||
Res *types.GetSiteIdResponse `xml:"urn:lookup GetSiteIdResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *GetSiteIdBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func GetSiteId(ctx context.Context, r soap.RoundTripper, req *types.GetSiteId) (*types.GetSiteIdResponse, error) {
|
||||
var reqBody, resBody GetSiteIdBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type ListBody struct {
|
||||
Req *types.List `xml:"urn:lookup List,omitempty"`
|
||||
Res *types.ListResponse `xml:"urn:lookup ListResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *ListBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func List(ctx context.Context, r soap.RoundTripper, req *types.List) (*types.ListResponse, error) {
|
||||
var reqBody, resBody ListBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type RetrieveHaBackupConfigurationBody struct {
|
||||
Req *types.RetrieveHaBackupConfiguration `xml:"urn:lookup RetrieveHaBackupConfiguration,omitempty"`
|
||||
Res *types.RetrieveHaBackupConfigurationResponse `xml:"urn:lookup RetrieveHaBackupConfigurationResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *RetrieveHaBackupConfigurationBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func RetrieveHaBackupConfiguration(ctx context.Context, r soap.RoundTripper, req *types.RetrieveHaBackupConfiguration) (*types.RetrieveHaBackupConfigurationResponse, error) {
|
||||
var reqBody, resBody RetrieveHaBackupConfigurationBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type RetrieveServiceContentBody struct {
|
||||
Req *types.RetrieveServiceContent `xml:"urn:lookup RetrieveServiceContent,omitempty"`
|
||||
Res *types.RetrieveServiceContentResponse `xml:"urn:lookup RetrieveServiceContentResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *RetrieveServiceContentBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func RetrieveServiceContent(ctx context.Context, r soap.RoundTripper, req *types.RetrieveServiceContent) (*types.RetrieveServiceContentResponse, error) {
|
||||
var reqBody, resBody RetrieveServiceContentBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type SetBody struct {
|
||||
Req *types.Set `xml:"urn:lookup Set,omitempty"`
|
||||
Res *types.SetResponse `xml:"urn:lookup SetResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *SetBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func Set(ctx context.Context, r soap.RoundTripper, req *types.Set) (*types.SetResponse, error) {
|
||||
var reqBody, resBody SetBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type SetLocaleBody struct {
|
||||
Req *types.SetLocale `xml:"urn:lookup SetLocale,omitempty"`
|
||||
Res *types.SetLocaleResponse `xml:"urn:lookup SetLocaleResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *SetLocaleBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func SetLocale(ctx context.Context, r soap.RoundTripper, req *types.SetLocale) (*types.SetLocaleResponse, error) {
|
||||
var reqBody, resBody SetLocaleBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
35
vendor/github.com/vmware/govmomi/lookup/simulator/BUILD
generated
vendored
Normal file
35
vendor/github.com/vmware/govmomi/lookup/simulator/BUILD
generated
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"registration_info.go",
|
||||
"simulator.go",
|
||||
],
|
||||
importpath = "github.com/vmware/govmomi/lookup/simulator",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/google/uuid:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/methods:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/types:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/simulator:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/types:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
129
vendor/github.com/vmware/govmomi/lookup/simulator/registration_info.go
generated
vendored
Normal file
129
vendor/github.com/vmware/govmomi/lookup/simulator/registration_info.go
generated
vendored
Normal file
@ -0,0 +1,129 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package simulator
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/vmware/govmomi/lookup"
|
||||
"github.com/vmware/govmomi/lookup/types"
|
||||
"github.com/vmware/govmomi/simulator"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
)
|
||||
|
||||
var (
|
||||
siteID = "vcsim"
|
||||
)
|
||||
|
||||
// registrationInfo returns a ServiceRegistration populated with vcsim's OptionManager settings.
|
||||
// The complete list can be captured using: govc sso.service.ls -dump
|
||||
func registrationInfo() []types.LookupServiceRegistrationInfo {
|
||||
vc := simulator.Map.Get(vim25.ServiceInstance).(*simulator.ServiceInstance)
|
||||
setting := simulator.Map.OptionManager().Setting
|
||||
opts := make(map[string]string, len(setting))
|
||||
|
||||
for _, o := range setting {
|
||||
opt := o.GetOptionValue()
|
||||
if val, ok := opt.Value.(string); ok {
|
||||
opts[opt.Key] = val
|
||||
}
|
||||
}
|
||||
|
||||
trust := []string{opts["vcsim.server.cert"]}
|
||||
sdk := opts["vcsim.server.url"] + vim25.Path
|
||||
admin := opts["config.vpxd.sso.default.admin"]
|
||||
owner := opts["config.vpxd.sso.solutionUser.name"]
|
||||
instance := opts["VirtualCenter.InstanceName"]
|
||||
|
||||
// Real PSC has 30+ services by default, we just provide a few that are useful for vmomi interaction..
|
||||
return []types.LookupServiceRegistrationInfo{
|
||||
{
|
||||
LookupServiceRegistrationCommonServiceInfo: types.LookupServiceRegistrationCommonServiceInfo{
|
||||
LookupServiceRegistrationMutableServiceInfo: types.LookupServiceRegistrationMutableServiceInfo{
|
||||
ServiceVersion: lookup.Version,
|
||||
ServiceEndpoints: []types.LookupServiceRegistrationEndpoint{
|
||||
{
|
||||
Url: opts["config.vpxd.sso.sts.uri"],
|
||||
EndpointType: types.LookupServiceRegistrationEndpointType{
|
||||
Protocol: "wsTrust",
|
||||
Type: "com.vmware.cis.cs.identity.sso",
|
||||
},
|
||||
SslTrust: trust,
|
||||
},
|
||||
},
|
||||
},
|
||||
OwnerId: admin,
|
||||
ServiceType: types.LookupServiceRegistrationServiceType{
|
||||
Product: "com.vmware.cis",
|
||||
Type: "sso:sts",
|
||||
},
|
||||
},
|
||||
ServiceId: siteID + ":" + uuid.New().String(),
|
||||
SiteId: siteID,
|
||||
},
|
||||
{
|
||||
LookupServiceRegistrationCommonServiceInfo: types.LookupServiceRegistrationCommonServiceInfo{
|
||||
LookupServiceRegistrationMutableServiceInfo: types.LookupServiceRegistrationMutableServiceInfo{
|
||||
ServiceVersion: vim25.Version,
|
||||
ServiceEndpoints: []types.LookupServiceRegistrationEndpoint{
|
||||
{
|
||||
Url: sdk,
|
||||
EndpointType: types.LookupServiceRegistrationEndpointType{
|
||||
Protocol: "vmomi",
|
||||
Type: "com.vmware.vim",
|
||||
},
|
||||
SslTrust: trust,
|
||||
EndpointAttributes: []types.LookupServiceRegistrationAttribute{
|
||||
{
|
||||
Key: "cis.common.ep.localurl",
|
||||
Value: sdk,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
ServiceAttributes: []types.LookupServiceRegistrationAttribute{
|
||||
{
|
||||
Key: "com.vmware.cis.cm.GroupInternalId",
|
||||
Value: "com.vmware.vim.vcenter",
|
||||
},
|
||||
{
|
||||
Key: "com.vmware.vim.vcenter.instanceName",
|
||||
Value: instance,
|
||||
},
|
||||
{
|
||||
Key: "com.vmware.cis.cm.ControlScript",
|
||||
Value: "service-control-default-vmon",
|
||||
},
|
||||
{
|
||||
Key: "com.vmware.cis.cm.HostId",
|
||||
Value: uuid.New().String(),
|
||||
},
|
||||
},
|
||||
ServiceNameResourceKey: "AboutInfo.vpx.name",
|
||||
ServiceDescriptionResourceKey: "AboutInfo.vpx.name",
|
||||
},
|
||||
OwnerId: owner,
|
||||
ServiceType: types.LookupServiceRegistrationServiceType{
|
||||
Product: "com.vmware.cis",
|
||||
Type: "vcenterserver",
|
||||
},
|
||||
NodeId: uuid.New().String(),
|
||||
},
|
||||
ServiceId: vc.Content.About.InstanceUuid,
|
||||
SiteId: siteID,
|
||||
},
|
||||
}
|
||||
}
|
158
vendor/github.com/vmware/govmomi/lookup/simulator/simulator.go
generated
vendored
Normal file
158
vendor/github.com/vmware/govmomi/lookup/simulator/simulator.go
generated
vendored
Normal file
@ -0,0 +1,158 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package simulator
|
||||
|
||||
import (
|
||||
"github.com/vmware/govmomi/lookup"
|
||||
"github.com/vmware/govmomi/lookup/methods"
|
||||
"github.com/vmware/govmomi/lookup/types"
|
||||
"github.com/vmware/govmomi/simulator"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
vim "github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
var content = types.LookupServiceContent{
|
||||
LookupService: vim.ManagedObjectReference{Type: "LookupLookupService", Value: "lookupService"},
|
||||
ServiceRegistration: &vim.ManagedObjectReference{Type: "LookupServiceRegistration", Value: "ServiceRegistration"},
|
||||
DeploymentInformationService: vim.ManagedObjectReference{Type: "LookupDeploymentInformationService", Value: "deploymentInformationService"},
|
||||
L10n: vim.ManagedObjectReference{Type: "LookupL10n", Value: "l10n"},
|
||||
}
|
||||
|
||||
func New() *simulator.Registry {
|
||||
r := simulator.NewRegistry()
|
||||
r.Namespace = lookup.Namespace
|
||||
r.Path = lookup.Path
|
||||
|
||||
r.Put(&ServiceInstance{
|
||||
ManagedObjectReference: lookup.ServiceInstance,
|
||||
Content: content,
|
||||
})
|
||||
r.Put(&ServiceRegistration{
|
||||
ManagedObjectReference: *content.ServiceRegistration,
|
||||
Info: registrationInfo(),
|
||||
})
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
type ServiceInstance struct {
|
||||
vim.ManagedObjectReference
|
||||
|
||||
Content types.LookupServiceContent
|
||||
}
|
||||
|
||||
func (s *ServiceInstance) RetrieveServiceContent(_ *types.RetrieveServiceContent) soap.HasFault {
|
||||
return &methods.RetrieveServiceContentBody{
|
||||
Res: &types.RetrieveServiceContentResponse{
|
||||
Returnval: s.Content,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type ServiceRegistration struct {
|
||||
vim.ManagedObjectReference
|
||||
|
||||
Info []types.LookupServiceRegistrationInfo
|
||||
}
|
||||
|
||||
func (s *ServiceRegistration) GetSiteId(_ *types.GetSiteId) soap.HasFault {
|
||||
return &methods.GetSiteIdBody{
|
||||
Res: &types.GetSiteIdResponse{
|
||||
Returnval: siteID,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func matchServiceType(filter, info *types.LookupServiceRegistrationServiceType) bool {
|
||||
if filter.Product != "" {
|
||||
if filter.Product != info.Product {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if filter.Type != "" {
|
||||
if filter.Type != info.Type {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func matchEndpointType(filter, info *types.LookupServiceRegistrationEndpointType) bool {
|
||||
if filter.Protocol != "" {
|
||||
if filter.Protocol != info.Protocol {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if filter.Type != "" {
|
||||
if filter.Type != info.Type {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ServiceRegistration) List(req *types.List) soap.HasFault {
|
||||
body := new(methods.ListBody)
|
||||
filter := req.FilterCriteria
|
||||
|
||||
if filter == nil {
|
||||
// This is what a real PSC returns if FilterCriteria is nil.
|
||||
body.Fault_ = simulator.Fault("LookupFaultServiceFault", &vim.SystemError{
|
||||
Reason: "Invalid fault",
|
||||
})
|
||||
return body
|
||||
}
|
||||
body.Res = new(types.ListResponse)
|
||||
|
||||
for _, info := range s.Info {
|
||||
if filter.SiteId != "" {
|
||||
if filter.SiteId != info.SiteId {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if filter.NodeId != "" {
|
||||
if filter.NodeId != info.NodeId {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if filter.ServiceType != nil {
|
||||
if !matchServiceType(filter.ServiceType, &info.ServiceType) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if filter.EndpointType != nil {
|
||||
services := info.ServiceEndpoints
|
||||
info.ServiceEndpoints = nil
|
||||
for _, service := range services {
|
||||
if !matchEndpointType(filter.EndpointType, &service.EndpointType) {
|
||||
continue
|
||||
}
|
||||
info.ServiceEndpoints = append(info.ServiceEndpoints, service)
|
||||
}
|
||||
if len(info.ServiceEndpoints) == 0 {
|
||||
continue
|
||||
}
|
||||
}
|
||||
body.Res.Returnval = append(body.Res.Returnval, info)
|
||||
}
|
||||
|
||||
return body
|
||||
}
|
23
vendor/github.com/vmware/govmomi/lookup/types/BUILD
generated
vendored
Normal file
23
vendor/github.com/vmware/govmomi/lookup/types/BUILD
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["types.go"],
|
||||
importpath = "github.com/vmware/govmomi/lookup/types",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = ["//vendor/github.com/vmware/govmomi/vim25/types:go_default_library"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
412
vendor/github.com/vmware/govmomi/lookup/types/types.go
generated
vendored
Normal file
412
vendor/github.com/vmware/govmomi/lookup/types/types.go
generated
vendored
Normal file
@ -0,0 +1,412 @@
|
||||
/*
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package types
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
vim "github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type Create CreateRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:Create", reflect.TypeOf((*Create)(nil)).Elem())
|
||||
}
|
||||
|
||||
type CreateRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
ServiceId string `xml:"serviceId"`
|
||||
CreateSpec LookupServiceRegistrationCreateSpec `xml:"createSpec"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:CreateRequestType", reflect.TypeOf((*CreateRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type CreateResponse struct {
|
||||
}
|
||||
|
||||
type Delete DeleteRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:Delete", reflect.TypeOf((*Delete)(nil)).Elem())
|
||||
}
|
||||
|
||||
type DeleteRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
ServiceId string `xml:"serviceId"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:DeleteRequestType", reflect.TypeOf((*DeleteRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type DeleteResponse struct {
|
||||
}
|
||||
|
||||
type Get GetRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:Get", reflect.TypeOf((*Get)(nil)).Elem())
|
||||
}
|
||||
|
||||
type GetLocale GetLocaleRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:GetLocale", reflect.TypeOf((*GetLocale)(nil)).Elem())
|
||||
}
|
||||
|
||||
type GetLocaleRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:GetLocaleRequestType", reflect.TypeOf((*GetLocaleRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type GetLocaleResponse struct {
|
||||
Returnval string `xml:"returnval"`
|
||||
}
|
||||
|
||||
type GetRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
ServiceId string `xml:"serviceId"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:GetRequestType", reflect.TypeOf((*GetRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type GetResponse struct {
|
||||
Returnval LookupServiceRegistrationInfo `xml:"returnval"`
|
||||
}
|
||||
|
||||
type GetSiteId GetSiteIdRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:GetSiteId", reflect.TypeOf((*GetSiteId)(nil)).Elem())
|
||||
}
|
||||
|
||||
type GetSiteIdRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:GetSiteIdRequestType", reflect.TypeOf((*GetSiteIdRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type GetSiteIdResponse struct {
|
||||
Returnval string `xml:"returnval"`
|
||||
}
|
||||
|
||||
type List ListRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:List", reflect.TypeOf((*List)(nil)).Elem())
|
||||
}
|
||||
|
||||
type ListRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
FilterCriteria *LookupServiceRegistrationFilter `xml:"filterCriteria,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:ListRequestType", reflect.TypeOf((*ListRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type ListResponse struct {
|
||||
Returnval []LookupServiceRegistrationInfo `xml:"returnval,omitempty"`
|
||||
}
|
||||
|
||||
type LookupFaultEntryExistsFault struct {
|
||||
LookupFaultServiceFault
|
||||
|
||||
Name string `xml:"name"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultEntryExistsFault", reflect.TypeOf((*LookupFaultEntryExistsFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupFaultEntryExistsFaultFault LookupFaultEntryExistsFault
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultEntryExistsFaultFault", reflect.TypeOf((*LookupFaultEntryExistsFaultFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupFaultEntryNotFoundFault struct {
|
||||
LookupFaultServiceFault
|
||||
|
||||
Name string `xml:"name"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultEntryNotFoundFault", reflect.TypeOf((*LookupFaultEntryNotFoundFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupFaultEntryNotFoundFaultFault LookupFaultEntryNotFoundFault
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultEntryNotFoundFaultFault", reflect.TypeOf((*LookupFaultEntryNotFoundFaultFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupFaultServiceFault struct {
|
||||
vim.MethodFault
|
||||
|
||||
ErrorMessage string `xml:"errorMessage,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultServiceFault", reflect.TypeOf((*LookupFaultServiceFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupFaultUnsupportedSiteFault struct {
|
||||
LookupFaultServiceFault
|
||||
|
||||
OperatingSite string `xml:"operatingSite"`
|
||||
RequestedSite string `xml:"requestedSite"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultUnsupportedSiteFault", reflect.TypeOf((*LookupFaultUnsupportedSiteFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupFaultUnsupportedSiteFaultFault LookupFaultUnsupportedSiteFault
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupFaultUnsupportedSiteFaultFault", reflect.TypeOf((*LookupFaultUnsupportedSiteFaultFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupHaBackupNodeConfiguration struct {
|
||||
vim.DynamicData
|
||||
|
||||
DbType string `xml:"dbType"`
|
||||
DbJdbcUrl string `xml:"dbJdbcUrl"`
|
||||
DbUser string `xml:"dbUser"`
|
||||
DbPass string `xml:"dbPass"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupHaBackupNodeConfiguration", reflect.TypeOf((*LookupHaBackupNodeConfiguration)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceContent struct {
|
||||
vim.DynamicData
|
||||
|
||||
LookupService vim.ManagedObjectReference `xml:"lookupService"`
|
||||
ServiceRegistration *vim.ManagedObjectReference `xml:"serviceRegistration,omitempty"`
|
||||
DeploymentInformationService vim.ManagedObjectReference `xml:"deploymentInformationService"`
|
||||
L10n vim.ManagedObjectReference `xml:"l10n"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceContent", reflect.TypeOf((*LookupServiceContent)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationAttribute struct {
|
||||
vim.DynamicData
|
||||
|
||||
Key string `xml:"key"`
|
||||
Value string `xml:"value"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationAttribute", reflect.TypeOf((*LookupServiceRegistrationAttribute)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationCommonServiceInfo struct {
|
||||
LookupServiceRegistrationMutableServiceInfo
|
||||
|
||||
OwnerId string `xml:"ownerId"`
|
||||
ServiceType LookupServiceRegistrationServiceType `xml:"serviceType"`
|
||||
NodeId string `xml:"nodeId,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationCommonServiceInfo", reflect.TypeOf((*LookupServiceRegistrationCommonServiceInfo)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationCreateSpec struct {
|
||||
LookupServiceRegistrationCommonServiceInfo
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationCreateSpec", reflect.TypeOf((*LookupServiceRegistrationCreateSpec)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationEndpoint struct {
|
||||
vim.DynamicData
|
||||
|
||||
Url string `xml:"url"`
|
||||
EndpointType LookupServiceRegistrationEndpointType `xml:"endpointType"`
|
||||
SslTrust []string `xml:"sslTrust,omitempty"`
|
||||
EndpointAttributes []LookupServiceRegistrationAttribute `xml:"endpointAttributes,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationEndpoint", reflect.TypeOf((*LookupServiceRegistrationEndpoint)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationEndpointType struct {
|
||||
vim.DynamicData
|
||||
|
||||
Protocol string `xml:"protocol,omitempty"`
|
||||
Type string `xml:"type,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationEndpointType", reflect.TypeOf((*LookupServiceRegistrationEndpointType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationFilter struct {
|
||||
vim.DynamicData
|
||||
|
||||
SiteId string `xml:"siteId,omitempty"`
|
||||
NodeId string `xml:"nodeId,omitempty"`
|
||||
ServiceType *LookupServiceRegistrationServiceType `xml:"serviceType,omitempty"`
|
||||
EndpointType *LookupServiceRegistrationEndpointType `xml:"endpointType,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationFilter", reflect.TypeOf((*LookupServiceRegistrationFilter)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationInfo struct {
|
||||
LookupServiceRegistrationCommonServiceInfo
|
||||
|
||||
ServiceId string `xml:"serviceId"`
|
||||
SiteId string `xml:"siteId"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationInfo", reflect.TypeOf((*LookupServiceRegistrationInfo)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationMutableServiceInfo struct {
|
||||
vim.DynamicData
|
||||
|
||||
ServiceVersion string `xml:"serviceVersion"`
|
||||
VendorNameResourceKey string `xml:"vendorNameResourceKey,omitempty"`
|
||||
VendorNameDefault string `xml:"vendorNameDefault,omitempty"`
|
||||
VendorProductInfoResourceKey string `xml:"vendorProductInfoResourceKey,omitempty"`
|
||||
VendorProductInfoDefault string `xml:"vendorProductInfoDefault,omitempty"`
|
||||
ServiceEndpoints []LookupServiceRegistrationEndpoint `xml:"serviceEndpoints,omitempty"`
|
||||
ServiceAttributes []LookupServiceRegistrationAttribute `xml:"serviceAttributes,omitempty"`
|
||||
ServiceNameResourceKey string `xml:"serviceNameResourceKey,omitempty"`
|
||||
ServiceNameDefault string `xml:"serviceNameDefault,omitempty"`
|
||||
ServiceDescriptionResourceKey string `xml:"serviceDescriptionResourceKey,omitempty"`
|
||||
ServiceDescriptionDefault string `xml:"serviceDescriptionDefault,omitempty"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationMutableServiceInfo", reflect.TypeOf((*LookupServiceRegistrationMutableServiceInfo)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationServiceType struct {
|
||||
vim.DynamicData
|
||||
|
||||
Product string `xml:"product"`
|
||||
Type string `xml:"type"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationServiceType", reflect.TypeOf((*LookupServiceRegistrationServiceType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type LookupServiceRegistrationSetSpec struct {
|
||||
LookupServiceRegistrationMutableServiceInfo
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:LookupServiceRegistrationSetSpec", reflect.TypeOf((*LookupServiceRegistrationSetSpec)(nil)).Elem())
|
||||
}
|
||||
|
||||
type RetrieveHaBackupConfiguration RetrieveHaBackupConfigurationRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:RetrieveHaBackupConfiguration", reflect.TypeOf((*RetrieveHaBackupConfiguration)(nil)).Elem())
|
||||
}
|
||||
|
||||
type RetrieveHaBackupConfigurationRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:RetrieveHaBackupConfigurationRequestType", reflect.TypeOf((*RetrieveHaBackupConfigurationRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type RetrieveHaBackupConfigurationResponse struct {
|
||||
Returnval LookupHaBackupNodeConfiguration `xml:"returnval"`
|
||||
}
|
||||
|
||||
type RetrieveServiceContent RetrieveServiceContentRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:RetrieveServiceContent", reflect.TypeOf((*RetrieveServiceContent)(nil)).Elem())
|
||||
}
|
||||
|
||||
type RetrieveServiceContentRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:RetrieveServiceContentRequestType", reflect.TypeOf((*RetrieveServiceContentRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type RetrieveServiceContentResponse struct {
|
||||
Returnval LookupServiceContent `xml:"returnval"`
|
||||
}
|
||||
|
||||
type Set SetRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:Set", reflect.TypeOf((*Set)(nil)).Elem())
|
||||
}
|
||||
|
||||
type SetLocale SetLocaleRequestType
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:SetLocale", reflect.TypeOf((*SetLocale)(nil)).Elem())
|
||||
}
|
||||
|
||||
type SetLocaleRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
Locale string `xml:"locale"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:SetLocaleRequestType", reflect.TypeOf((*SetLocaleRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type SetLocaleResponse struct {
|
||||
Returnval string `xml:"returnval"`
|
||||
}
|
||||
|
||||
type SetRequestType struct {
|
||||
This vim.ManagedObjectReference `xml:"_this"`
|
||||
ServiceId string `xml:"serviceId"`
|
||||
ServiceSpec LookupServiceRegistrationSetSpec `xml:"serviceSpec"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("lookup:SetRequestType", reflect.TypeOf((*SetRequestType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type SetResponse struct {
|
||||
}
|
9
vendor/github.com/vmware/govmomi/object/distributed_virtual_portgroup.go
generated
vendored
9
vendor/github.com/vmware/govmomi/object/distributed_virtual_portgroup.go
generated
vendored
@ -18,6 +18,7 @@ package object
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
@ -39,11 +40,17 @@ func NewDistributedVirtualPortgroup(c *vim25.Client, ref types.ManagedObjectRefe
|
||||
func (p DistributedVirtualPortgroup) EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error) {
|
||||
var dvp mo.DistributedVirtualPortgroup
|
||||
var dvs mo.DistributedVirtualSwitch
|
||||
prop := "config.distributedVirtualSwitch"
|
||||
|
||||
if err := p.Properties(ctx, p.Reference(), []string{"key", "config.distributedVirtualSwitch"}, &dvp); err != nil {
|
||||
if err := p.Properties(ctx, p.Reference(), []string{"key", prop}, &dvp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// "This property should always be set unless the user's setting does not have System.Read privilege on the object referred to by this property."
|
||||
if dvp.Config.DistributedVirtualSwitch == nil {
|
||||
return nil, fmt.Errorf("no System.Read privilege on: %s.%s", p.Reference(), prop)
|
||||
}
|
||||
|
||||
if err := p.Properties(ctx, *dvp.Config.DistributedVirtualSwitch, []string{"uuid"}, &dvs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
5
vendor/github.com/vmware/govmomi/object/distributed_virtual_switch.go
generated
vendored
5
vendor/github.com/vmware/govmomi/object/distributed_virtual_switch.go
generated
vendored
@ -66,9 +66,10 @@ func (s DistributedVirtualSwitch) AddPortgroup(ctx context.Context, spec []types
|
||||
return NewTask(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) FetchDVPorts(ctx context.Context) ([]types.DistributedVirtualPort, error) {
|
||||
func (s DistributedVirtualSwitch) FetchDVPorts(ctx context.Context, criteria *types.DistributedVirtualSwitchPortCriteria) ([]types.DistributedVirtualPort, error) {
|
||||
req := &types.FetchDVPorts{
|
||||
This: s.Reference(),
|
||||
This: s.Reference(),
|
||||
Criteria: criteria,
|
||||
}
|
||||
|
||||
res, err := methods.FetchDVPorts(ctx, s.Client(), req)
|
||||
|
5
vendor/github.com/vmware/govmomi/object/virtual_device_list.go
generated
vendored
5
vendor/github.com/vmware/govmomi/object/virtual_device_list.go
generated
vendored
@ -61,7 +61,10 @@ func EthernetCardTypes() VirtualDeviceList {
|
||||
return VirtualDeviceList([]types.BaseVirtualDevice{
|
||||
&types.VirtualE1000{},
|
||||
&types.VirtualE1000e{},
|
||||
&types.VirtualVmxnet2{},
|
||||
&types.VirtualVmxnet3{},
|
||||
&types.VirtualPCNet32{},
|
||||
&types.VirtualSriovEthernetCard{},
|
||||
}).Select(func(device types.BaseVirtualDevice) bool {
|
||||
c := device.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard()
|
||||
c.GetVirtualDevice().Key = -1
|
||||
@ -834,7 +837,7 @@ func (l VirtualDeviceList) TypeName(device types.BaseVirtualDevice) string {
|
||||
return dtype.Elem().Name()
|
||||
}
|
||||
|
||||
var deviceNameRegexp = regexp.MustCompile(`(?:Virtual)?(?:Machine)?(\w+?)(?:Card|Device|Controller)?$`)
|
||||
var deviceNameRegexp = regexp.MustCompile(`(?:Virtual)?(?:Machine)?(\w+?)(?:Card|EthernetCard|Device|Controller)?$`)
|
||||
|
||||
func (l VirtualDeviceList) deviceName(device types.BaseVirtualDevice) string {
|
||||
name := "device"
|
||||
|
13
vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go
generated
vendored
13
vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go
generated
vendored
@ -46,9 +46,10 @@ type queryVirtualDiskInfoTaskResponse struct {
|
||||
}
|
||||
|
||||
type queryVirtualDiskInfoTaskBody struct {
|
||||
Req *queryVirtualDiskInfoTaskRequest `xml:"urn:internalvim25 QueryVirtualDiskInfo_Task,omitempty"`
|
||||
Res *queryVirtualDiskInfoTaskResponse `xml:"urn:vim25 QueryVirtualDiskInfo_TaskResponse,omitempty"`
|
||||
Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
Req *queryVirtualDiskInfoTaskRequest `xml:"urn:internalvim25 QueryVirtualDiskInfo_Task,omitempty"`
|
||||
Res *queryVirtualDiskInfoTaskResponse `xml:"urn:vim25 QueryVirtualDiskInfo_TaskResponse,omitempty"`
|
||||
InternalRes *queryVirtualDiskInfoTaskResponse `xml:"urn:internalvim25 QueryVirtualDiskInfo_TaskResponse,omitempty"`
|
||||
Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *queryVirtualDiskInfoTaskBody) Fault() *soap.Fault { return b.Err }
|
||||
@ -62,7 +63,11 @@ func queryVirtualDiskInfoTask(ctx context.Context, r soap.RoundTripper, req *que
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
if resBody.Res != nil {
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
return resBody.InternalRes, nil
|
||||
}
|
||||
|
||||
type VirtualDiskInfo struct {
|
||||
|
19
vendor/github.com/vmware/govmomi/pbm/client.go
generated
vendored
19
vendor/github.com/vmware/govmomi/pbm/client.go
generated
vendored
@ -27,6 +27,18 @@ import (
|
||||
vim "github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
const (
|
||||
Namespace = "pbm"
|
||||
Path = "/pbm" + vim25.Path
|
||||
)
|
||||
|
||||
var (
|
||||
ServiceInstance = vim.ManagedObjectReference{
|
||||
Type: "PbmServiceInstance",
|
||||
Value: "ServiceInstance",
|
||||
}
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
*soap.Client
|
||||
|
||||
@ -34,13 +46,10 @@ type Client struct {
|
||||
}
|
||||
|
||||
func NewClient(ctx context.Context, c *vim25.Client) (*Client, error) {
|
||||
sc := c.Client.NewServiceClient("/pbm/sdk", "urn:pbm")
|
||||
sc := c.Client.NewServiceClient(Path, Namespace)
|
||||
|
||||
req := types.PbmRetrieveServiceContent{
|
||||
This: vim.ManagedObjectReference{
|
||||
Type: "PbmServiceInstance",
|
||||
Value: "ServiceInstance",
|
||||
},
|
||||
This: ServiceInstance,
|
||||
}
|
||||
|
||||
res, err := methods.PbmRetrieveServiceContent(ctx, sc, &req)
|
||||
|
2
vendor/github.com/vmware/govmomi/pbm/methods/methods.go
generated
vendored
2
vendor/github.com/vmware/govmomi/pbm/methods/methods.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
17
vendor/github.com/vmware/govmomi/pbm/types/enum.go
generated
vendored
17
vendor/github.com/vmware/govmomi/pbm/types/enum.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -152,6 +152,20 @@ func init() {
|
||||
types.Add("pbm:PbmObjectType", reflect.TypeOf((*PbmObjectType)(nil)).Elem())
|
||||
}
|
||||
|
||||
type PbmOperation string
|
||||
|
||||
const (
|
||||
PbmOperationCREATE = PbmOperation("CREATE")
|
||||
PbmOperationREGISTER = PbmOperation("REGISTER")
|
||||
PbmOperationRECONFIGURE = PbmOperation("RECONFIGURE")
|
||||
PbmOperationMIGRATE = PbmOperation("MIGRATE")
|
||||
PbmOperationCLONE = PbmOperation("CLONE")
|
||||
)
|
||||
|
||||
func init() {
|
||||
types.Add("pbm:PbmOperation", reflect.TypeOf((*PbmOperation)(nil)).Elem())
|
||||
}
|
||||
|
||||
type PbmProfileCategoryEnum string
|
||||
|
||||
const (
|
||||
@ -179,6 +193,7 @@ type PbmSystemCreatedProfileType string
|
||||
const (
|
||||
PbmSystemCreatedProfileTypeVsanDefaultProfile = PbmSystemCreatedProfileType("VsanDefaultProfile")
|
||||
PbmSystemCreatedProfileTypeVVolDefaultProfile = PbmSystemCreatedProfileType("VVolDefaultProfile")
|
||||
PbmSystemCreatedProfileTypePmemDefaultProfile = PbmSystemCreatedProfileType("PmemDefaultProfile")
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
2
vendor/github.com/vmware/govmomi/pbm/types/if.go
generated
vendored
2
vendor/github.com/vmware/govmomi/pbm/types/if.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
14
vendor/github.com/vmware/govmomi/pbm/types/types.go
generated
vendored
14
vendor/github.com/vmware/govmomi/pbm/types/types.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -269,6 +269,12 @@ func init() {
|
||||
types.Add("pbm:PbmAlreadyExists", reflect.TypeOf((*PbmAlreadyExists)(nil)).Elem())
|
||||
}
|
||||
|
||||
type PbmAlreadyExistsFault PbmAlreadyExists
|
||||
|
||||
func init() {
|
||||
types.Add("pbm:PbmAlreadyExistsFault", reflect.TypeOf((*PbmAlreadyExistsFault)(nil)).Elem())
|
||||
}
|
||||
|
||||
type PbmAssignDefaultRequirementProfile PbmAssignDefaultRequirementProfileRequestType
|
||||
|
||||
func init() {
|
||||
@ -1710,3 +1716,9 @@ type PbmVaioDataServiceInfo struct {
|
||||
func init() {
|
||||
types.Add("pbm:PbmVaioDataServiceInfo", reflect.TypeOf((*PbmVaioDataServiceInfo)(nil)).Elem())
|
||||
}
|
||||
|
||||
type VersionURI string
|
||||
|
||||
func init() {
|
||||
types.Add("pbm:versionURI", reflect.TypeOf((*VersionURI)(nil)).Elem())
|
||||
}
|
||||
|
2
vendor/github.com/vmware/govmomi/property/filter.go
generated
vendored
2
vendor/github.com/vmware/govmomi/property/filter.go
generated
vendored
@ -122,7 +122,7 @@ func (f Filter) MatchPropertyList(props []types.DynamicProperty) bool {
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
return len(f) == len(props) // false if a property such as VM "guest" is unset
|
||||
}
|
||||
|
||||
// MatchObjectContent returns a list of ObjectContent.Obj where the ObjectContent.PropSet matches the Filter.
|
||||
|
44
vendor/github.com/vmware/govmomi/session/manager.go
generated
vendored
44
vendor/github.com/vmware/govmomi/session/manager.go
generated
vendored
@ -18,6 +18,7 @@ package session
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
|
||||
@ -89,14 +90,51 @@ func (sm *Manager) Login(ctx context.Context, u *url.Userinfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sm *Manager) LoginExtensionByCertificate(ctx context.Context, key string, locale string) error {
|
||||
// LoginExtensionByCertificate uses the vCenter SDK tunnel to login using a client certificate.
|
||||
// The client certificate can be set using the soap.Client.SetCertificate method.
|
||||
// See: https://kb.vmware.com/s/article/2004305
|
||||
func (sm *Manager) LoginExtensionByCertificate(ctx context.Context, key string) error {
|
||||
c := sm.client
|
||||
u := c.URL()
|
||||
if u.Hostname() != "sdkTunnel" {
|
||||
sc := c.Tunnel()
|
||||
c = &vim25.Client{
|
||||
Client: sc,
|
||||
RoundTripper: sc,
|
||||
ServiceContent: c.ServiceContent,
|
||||
}
|
||||
// When http.Transport.Proxy is used, our thumbprint checker is bypassed, resulting in:
|
||||
// "Post https://sdkTunnel:8089/sdk: x509: certificate is valid for $vcenter_hostname, not sdkTunnel"
|
||||
// The only easy way around this is to disable verification for the call to LoginExtensionByCertificate().
|
||||
// TODO: find a way to avoid disabling InsecureSkipVerify.
|
||||
c.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify = true
|
||||
}
|
||||
|
||||
req := types.LoginExtensionByCertificate{
|
||||
This: sm.Reference(),
|
||||
ExtensionKey: key,
|
||||
Locale: locale,
|
||||
Locale: Locale,
|
||||
}
|
||||
|
||||
login, err := methods.LoginExtensionByCertificate(ctx, sm.client, &req)
|
||||
login, err := methods.LoginExtensionByCertificate(ctx, c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Copy the session cookie
|
||||
sm.client.Jar.SetCookies(u, c.Jar.Cookies(c.URL()))
|
||||
|
||||
sm.userSession = &login.Returnval
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sm *Manager) LoginByToken(ctx context.Context) error {
|
||||
req := types.LoginByToken{
|
||||
This: sm.Reference(),
|
||||
Locale: Locale,
|
||||
}
|
||||
|
||||
login, err := methods.LoginByToken(ctx, sm.client, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
25
vendor/github.com/vmware/govmomi/simulator/datacenter.go
generated
vendored
25
vendor/github.com/vmware/govmomi/simulator/datacenter.go
generated
vendored
@ -133,3 +133,28 @@ func (dc *Datacenter) PowerOnMultiVMTask(ctx *Context, req *types.PowerOnMultiVM
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Datacenter) DestroyTask(req *types.Destroy_Task) soap.HasFault {
|
||||
task := CreateTask(d, "destroy", func(t *Task) (types.AnyType, types.BaseMethodFault) {
|
||||
folders := []types.ManagedObjectReference{
|
||||
d.VmFolder,
|
||||
d.HostFolder,
|
||||
}
|
||||
|
||||
for _, ref := range folders {
|
||||
if len(Map.Get(ref).(*Folder).ChildEntity) != 0 {
|
||||
return nil, &types.ResourceInUse{}
|
||||
}
|
||||
}
|
||||
|
||||
Map.Get(*d.Parent).(*Folder).removeChild(d.Self)
|
||||
|
||||
return nil, nil
|
||||
})
|
||||
|
||||
return &methods.Destroy_TaskBody{
|
||||
Res: &types.Destroy_TaskResponse{
|
||||
Returnval: task.Run(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
23
vendor/github.com/vmware/govmomi/simulator/dvs.go
generated
vendored
23
vendor/github.com/vmware/govmomi/simulator/dvs.go
generated
vendored
@ -63,6 +63,14 @@ func (s *DistributedVirtualSwitch) AddDVPortgroupTask(c *types.AddDVPortgroup_Ta
|
||||
VmVnicNetworkResourcePoolKey: spec.VmVnicNetworkResourcePoolKey,
|
||||
}
|
||||
|
||||
if pg.Config.DefaultPortConfig == nil {
|
||||
pg.Config.DefaultPortConfig = &types.VMwareDVSPortSetting{
|
||||
Vlan: new(types.VmwareDistributedVirtualSwitchVlanIdSpec),
|
||||
}
|
||||
}
|
||||
|
||||
pg.PortKeys = []string{}
|
||||
|
||||
s.Portgroup = append(s.Portgroup, pg.Self)
|
||||
s.Summary.PortgroupName = append(s.Summary.PortgroupName, pg.Name)
|
||||
|
||||
@ -111,10 +119,13 @@ func (s *DistributedVirtualSwitch) ReconfigureDvsTask(req *types.ReconfigureDvs_
|
||||
Map.AddReference(pg, &pg.Host, member.Host)
|
||||
}
|
||||
case types.ConfigSpecOperationRemove:
|
||||
if pg := FindReference(host.Network, s.Portgroup...); pg != nil {
|
||||
return nil, &types.ResourceInUse{
|
||||
Type: pg.Type,
|
||||
Name: pg.Value,
|
||||
for _, ref := range host.Vm {
|
||||
vm := Map.Get(ref).(*VirtualMachine)
|
||||
if pg := FindReference(vm.Network, s.Portgroup...); pg != nil {
|
||||
return nil, &types.ResourceInUse{
|
||||
Type: pg.Type,
|
||||
Name: pg.Value,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -170,10 +181,6 @@ func (s *DistributedVirtualSwitch) dvPortgroups(_ *types.DistributedVirtualSwitc
|
||||
},
|
||||
})
|
||||
|
||||
if pg.PortKeys == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, key := range pg.PortKeys {
|
||||
res = append(res, types.DistributedVirtualPort{
|
||||
DvsUuid: s.Uuid,
|
||||
|
55
vendor/github.com/vmware/govmomi/simulator/event_manager.go
generated
vendored
55
vendor/github.com/vmware/govmomi/simulator/event_manager.go
generated
vendored
@ -63,17 +63,14 @@ func NewEventManager(ref types.ManagedObjectReference) object.Reference {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *EventManager) CreateCollectorForEvents(ctx *Context, req *types.CreateCollectorForEvents) soap.HasFault {
|
||||
body := new(methods.CreateCollectorForEventsBody)
|
||||
func (m *EventManager) createCollector(ctx *Context, req *types.CreateCollectorForEvents) (*EventHistoryCollector, *soap.Fault) {
|
||||
size, err := validatePageSize(req.Filter.MaxCount)
|
||||
if err != nil {
|
||||
body.Fault_ = err
|
||||
return body
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(m.collectors) >= int(m.MaxCollector) {
|
||||
body.Fault_ = Fault("Too many event collectors to create", new(types.InvalidState))
|
||||
return body
|
||||
return nil, Fault("Too many event collectors to create", new(types.InvalidState))
|
||||
}
|
||||
|
||||
collector := &EventHistoryCollector{
|
||||
@ -83,6 +80,17 @@ func (m *EventManager) CreateCollectorForEvents(ctx *Context, req *types.CreateC
|
||||
collector.Filter = req.Filter
|
||||
collector.fillPage(size)
|
||||
|
||||
return collector, nil
|
||||
}
|
||||
|
||||
func (m *EventManager) CreateCollectorForEvents(ctx *Context, req *types.CreateCollectorForEvents) soap.HasFault {
|
||||
body := new(methods.CreateCollectorForEventsBody)
|
||||
collector, err := m.createCollector(ctx, req)
|
||||
if err != nil {
|
||||
body.Fault_ = err
|
||||
return body
|
||||
}
|
||||
|
||||
ref := ctx.Session.Put(collector).Reference()
|
||||
m.collectors[ref] = collector
|
||||
|
||||
@ -93,6 +101,27 @@ func (m *EventManager) CreateCollectorForEvents(ctx *Context, req *types.CreateC
|
||||
return body
|
||||
}
|
||||
|
||||
func (m *EventManager) QueryEvents(ctx *Context, req *types.QueryEvents) soap.HasFault {
|
||||
if Map.IsESX() {
|
||||
return &methods.QueryEventsBody{
|
||||
Fault_: Fault("", new(types.NotImplemented)),
|
||||
}
|
||||
}
|
||||
|
||||
body := new(methods.QueryEventsBody)
|
||||
collector, err := m.createCollector(ctx, &types.CreateCollectorForEvents{Filter: req.Filter})
|
||||
if err != nil {
|
||||
body.Fault_ = err
|
||||
return body
|
||||
}
|
||||
|
||||
body.Res = &types.QueryEventsResponse{
|
||||
Returnval: collector.GetLatestPage(),
|
||||
}
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
// formatMessage applies the EventDescriptionEventDetail.FullFormat template to the given event's FullFormattedMessage field.
|
||||
func (m *EventManager) formatMessage(event types.BaseEvent) {
|
||||
id := reflect.ValueOf(event).Elem().Type().Name()
|
||||
@ -372,15 +401,23 @@ func (c *EventHistoryCollector) DestroyCollector(ctx *Context, req *types.Destro
|
||||
}
|
||||
}
|
||||
|
||||
func (c *EventHistoryCollector) Get() mo.Reference {
|
||||
clone := *c
|
||||
func (c *EventHistoryCollector) GetLatestPage() []types.BaseEvent {
|
||||
var latestPage []types.BaseEvent
|
||||
|
||||
c.page.Do(func(val interface{}) {
|
||||
if val == nil {
|
||||
return
|
||||
}
|
||||
clone.LatestPage = append(clone.LatestPage, val.(types.BaseEvent))
|
||||
latestPage = append(latestPage, val.(types.BaseEvent))
|
||||
})
|
||||
|
||||
return latestPage
|
||||
}
|
||||
|
||||
func (c *EventHistoryCollector) Get() mo.Reference {
|
||||
clone := *c
|
||||
|
||||
clone.LatestPage = clone.GetLatestPage()
|
||||
|
||||
return &clone
|
||||
}
|
||||
|
54
vendor/github.com/vmware/govmomi/simulator/folder.go
generated
vendored
54
vendor/github.com/vmware/govmomi/simulator/folder.go
generated
vendored
@ -20,6 +20,7 @@ import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
||||
@ -514,6 +515,17 @@ func (f *Folder) CreateDVSTask(req *types.CreateDVS_Task) soap.HasFault {
|
||||
}
|
||||
}
|
||||
|
||||
dvs.AddDVPortgroupTask(&types.AddDVPortgroup_Task{
|
||||
Spec: []types.DVPortgroupConfigSpec{{
|
||||
Name: dvs.Name + "-DVUplinks" + strings.TrimPrefix(dvs.Self.Value, "dvs"),
|
||||
DefaultPortConfig: &types.VMwareDVSPortSetting{
|
||||
Vlan: &types.VmwareDistributedVirtualSwitchTrunkVlanSpec{
|
||||
VlanId: []types.NumericRange{{Start: 0, End: 4094}},
|
||||
},
|
||||
},
|
||||
}},
|
||||
})
|
||||
|
||||
return dvs.Reference(), nil
|
||||
})
|
||||
|
||||
@ -527,3 +539,45 @@ func (f *Folder) CreateDVSTask(req *types.CreateDVS_Task) soap.HasFault {
|
||||
func (f *Folder) RenameTask(r *types.Rename_Task) soap.HasFault {
|
||||
return RenameTask(f, r)
|
||||
}
|
||||
|
||||
func (f *Folder) DestroyTask(req *types.Destroy_Task) soap.HasFault {
|
||||
type destroyer interface {
|
||||
mo.Reference
|
||||
DestroyTask(*types.Destroy_Task) soap.HasFault
|
||||
}
|
||||
|
||||
task := CreateTask(f, "destroy", func(*Task) (types.AnyType, types.BaseMethodFault) {
|
||||
// Attempt to destroy all children
|
||||
for _, c := range f.ChildEntity {
|
||||
obj, ok := Map.Get(c).(destroyer)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
var fault types.BaseMethodFault
|
||||
Map.WithLock(obj, func() {
|
||||
id := obj.DestroyTask(&types.Destroy_Task{
|
||||
This: c,
|
||||
}).(*methods.Destroy_TaskBody).Res.Returnval
|
||||
|
||||
t := Map.Get(id).(*Task)
|
||||
if t.Info.Error != nil {
|
||||
fault = t.Info.Error.Fault // For example, can't destroy a powered on VM
|
||||
}
|
||||
})
|
||||
if fault != nil {
|
||||
return nil, fault
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the folder itself
|
||||
Map.Get(*f.Parent).(*Folder).removeChild(f.Self)
|
||||
return nil, nil
|
||||
})
|
||||
|
||||
return &methods.Destroy_TaskBody{
|
||||
Res: &types.Destroy_TaskResponse{
|
||||
Returnval: task.Run(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
19
vendor/github.com/vmware/govmomi/simulator/host_system.go
generated
vendored
19
vendor/github.com/vmware/govmomi/simulator/host_system.go
generated
vendored
@ -173,6 +173,25 @@ func CreateStandaloneHost(f *Folder, spec types.HostConnectSpec) (*HostSystem, t
|
||||
return host, nil
|
||||
}
|
||||
|
||||
func (h *HostSystem) DestroyTask(req *types.Destroy_Task) soap.HasFault {
|
||||
task := CreateTask(h, "destroy", func(t *Task) (types.AnyType, types.BaseMethodFault) {
|
||||
if len(h.Vm) > 0 {
|
||||
return nil, &types.ResourceInUse{}
|
||||
}
|
||||
|
||||
f := Map.getEntityParent(h, "Folder").(*Folder)
|
||||
f.removeChild(h.Reference())
|
||||
|
||||
return nil, nil
|
||||
})
|
||||
|
||||
return &methods.Destroy_TaskBody{
|
||||
Res: &types.Destroy_TaskResponse{
|
||||
Returnval: task.Run(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (h *HostSystem) EnterMaintenanceModeTask(spec *types.EnterMaintenanceMode_Task) soap.HasFault {
|
||||
task := CreateTask(h, "enterMaintenanceMode", func(t *Task) (types.AnyType, types.BaseMethodFault) {
|
||||
h.Runtime.InMaintenanceMode = true
|
||||
|
35
vendor/github.com/vmware/govmomi/simulator/property_collector.go
generated
vendored
35
vendor/github.com/vmware/govmomi/simulator/property_collector.go
generated
vendored
@ -111,17 +111,29 @@ func fieldValueInterface(f reflect.StructField, rval reflect.Value) interface{}
|
||||
pval = &types.ArrayOfString{
|
||||
String: v,
|
||||
}
|
||||
case []uint8:
|
||||
pval = &types.ArrayOfByte{
|
||||
Byte: v,
|
||||
}
|
||||
case []int16:
|
||||
pval = &types.ArrayOfShort{
|
||||
Short: v,
|
||||
}
|
||||
case []int32:
|
||||
pval = &types.ArrayOfInt{
|
||||
Int: v,
|
||||
}
|
||||
case []int64:
|
||||
pval = &types.ArrayOfLong{
|
||||
Long: v,
|
||||
}
|
||||
default:
|
||||
kind := f.Type.Elem().Name()
|
||||
// Remove govmomi interface prefix name
|
||||
if strings.HasPrefix(kind, "Base") {
|
||||
kind = kind[4:]
|
||||
}
|
||||
akind, _ := typeFunc("ArrayOf" + kind)
|
||||
akind, _ := defaultMapType("ArrayOf" + kind)
|
||||
a := reflect.New(akind)
|
||||
a.Elem().FieldByName(kind).Set(rval)
|
||||
pval = a.Interface()
|
||||
@ -278,14 +290,10 @@ func (rr *retrieveResult) collectFields(ctx *Context, rval reflect.Value, fields
|
||||
seen[name] = true
|
||||
|
||||
val, err := fieldValue(rval, name)
|
||||
if err == nil {
|
||||
rr.add(ctx, name, val, content)
|
||||
continue
|
||||
}
|
||||
|
||||
switch err {
|
||||
case errEmptyField:
|
||||
// ok
|
||||
case nil, errEmptyField:
|
||||
rr.add(ctx, name, val, content)
|
||||
case errMissingField:
|
||||
content.MissingSet = append(content.MissingSet, types.MissingProperty{
|
||||
Path: name,
|
||||
@ -469,6 +477,19 @@ func (pc *PropertyCollector) RetrievePropertiesEx(ctx *Context, r *types.Retriev
|
||||
if fault != nil {
|
||||
body.Fault_ = Fault("", fault)
|
||||
} else {
|
||||
objects := res.Objects[:0]
|
||||
for _, o := range res.Objects {
|
||||
propSet := o.PropSet[:0]
|
||||
for _, p := range o.PropSet {
|
||||
if p.Val != nil {
|
||||
propSet = append(propSet, p)
|
||||
}
|
||||
}
|
||||
o.PropSet = propSet
|
||||
|
||||
objects = append(objects, o)
|
||||
}
|
||||
res.Objects = objects
|
||||
body.Res = &types.RetrievePropertiesExResponse{
|
||||
Returnval: res,
|
||||
}
|
||||
|
25
vendor/github.com/vmware/govmomi/simulator/registry.go
generated
vendored
25
vendor/github.com/vmware/govmomi/simulator/registry.go
generated
vendored
@ -24,7 +24,7 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
@ -40,6 +40,7 @@ var refValueMap = map[string]string{
|
||||
"VirtualMachine": "vm",
|
||||
"VirtualMachineSnapshot": "snapshot",
|
||||
"VmwareDistributedVirtualSwitch": "dvs",
|
||||
"DistributedVirtualSwitch": "dvs",
|
||||
}
|
||||
|
||||
// Map is the default Registry instance.
|
||||
@ -59,6 +60,9 @@ type Registry struct {
|
||||
handlers map[types.ManagedObjectReference]RegisterObject
|
||||
locks map[types.ManagedObjectReference]sync.Locker
|
||||
counter int
|
||||
|
||||
Namespace string
|
||||
Path string
|
||||
}
|
||||
|
||||
// NewRegistry creates a new instances of Registry
|
||||
@ -67,11 +71,23 @@ func NewRegistry() *Registry {
|
||||
objects: make(map[types.ManagedObjectReference]mo.Reference),
|
||||
handlers: make(map[types.ManagedObjectReference]RegisterObject),
|
||||
locks: make(map[types.ManagedObjectReference]sync.Locker),
|
||||
|
||||
Namespace: vim25.Namespace,
|
||||
Path: vim25.Path,
|
||||
}
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *Registry) typeFunc(name string) (reflect.Type, bool) {
|
||||
if r.Namespace != "" && r.Namespace != vim25.Namespace {
|
||||
if kind, ok := defaultMapType(r.Namespace + ":" + name); ok {
|
||||
return kind, ok
|
||||
}
|
||||
}
|
||||
return defaultMapType(name)
|
||||
}
|
||||
|
||||
// typeName returns the type of the given object.
|
||||
func typeName(item mo.Reference) string {
|
||||
return reflect.TypeOf(item).Elem().Name()
|
||||
@ -332,7 +348,7 @@ func (r *Registry) removeString(obj mo.Reference, field *[]string, val string) {
|
||||
}
|
||||
|
||||
func (r *Registry) content() types.ServiceContent {
|
||||
return r.Get(methods.ServiceInstance).(*ServiceInstance).Content
|
||||
return r.Get(vim25.ServiceInstance).(*ServiceInstance).Content
|
||||
}
|
||||
|
||||
// IsESX returns true if this Registry maps an ESX model
|
||||
@ -380,6 +396,11 @@ func (r *Registry) SessionManager() *SessionManager {
|
||||
return r.Get(r.content().SessionManager.Reference()).(*SessionManager)
|
||||
}
|
||||
|
||||
// OptionManager returns the OptionManager singleton
|
||||
func (r *Registry) OptionManager() *OptionManager {
|
||||
return r.Get(r.content().Setting.Reference()).(*OptionManager)
|
||||
}
|
||||
|
||||
func (r *Registry) MarshalJSON() ([]byte, error) {
|
||||
r.m.Lock()
|
||||
defer r.m.Unlock()
|
||||
|
5
vendor/github.com/vmware/govmomi/simulator/service_instance.go
generated
vendored
5
vendor/github.com/vmware/govmomi/simulator/service_instance.go
generated
vendored
@ -19,8 +19,10 @@ package simulator
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/vmware/govmomi/object"
|
||||
"github.com/vmware/govmomi/simulator/vpx"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
@ -36,7 +38,7 @@ func NewServiceInstance(content types.ServiceContent, folder mo.Folder) *Service
|
||||
|
||||
s := &ServiceInstance{}
|
||||
|
||||
s.Self = methods.ServiceInstance
|
||||
s.Self = vim25.ServiceInstance
|
||||
s.Content = content
|
||||
|
||||
Map.Put(s)
|
||||
@ -49,6 +51,7 @@ func NewServiceInstance(content types.ServiceContent, folder mo.Folder) *Service
|
||||
if content.About.ApiType == "HostAgent" {
|
||||
CreateDefaultESX(f)
|
||||
} else {
|
||||
content.About.InstanceUuid = uuid.New().String()
|
||||
setting = vpx.Setting
|
||||
}
|
||||
|
||||
|
93
vendor/github.com/vmware/govmomi/simulator/session_manager.go
generated
vendored
93
vendor/github.com/vmware/govmomi/simulator/session_manager.go
generated
vendored
@ -49,33 +49,85 @@ func NewSessionManager(ref types.ManagedObjectReference) object.Reference {
|
||||
return s
|
||||
}
|
||||
|
||||
func (s *SessionManager) Login(ctx *Context, login *types.Login) soap.HasFault {
|
||||
body := &methods.LoginBody{}
|
||||
func createSession(ctx *Context, name string, locale string) types.UserSession {
|
||||
now := time.Now().UTC()
|
||||
|
||||
if login.Locale == "" {
|
||||
login.Locale = session.Locale
|
||||
if locale == "" {
|
||||
locale = session.Locale
|
||||
}
|
||||
|
||||
if login.UserName == "" || login.Password == "" || ctx.Session != nil {
|
||||
session := Session{
|
||||
UserSession: types.UserSession{
|
||||
Key: uuid.New().String(),
|
||||
UserName: name,
|
||||
FullName: name,
|
||||
LoginTime: now,
|
||||
LastActiveTime: now,
|
||||
Locale: locale,
|
||||
MessageLocale: locale,
|
||||
},
|
||||
Registry: NewRegistry(),
|
||||
}
|
||||
|
||||
ctx.SetSession(session, true)
|
||||
|
||||
return session.UserSession
|
||||
}
|
||||
|
||||
func (s *SessionManager) Login(ctx *Context, req *types.Login) soap.HasFault {
|
||||
body := new(methods.LoginBody)
|
||||
|
||||
if req.UserName == "" || req.Password == "" || ctx.Session != nil {
|
||||
body.Fault_ = invalidLogin
|
||||
} else {
|
||||
session := Session{
|
||||
UserSession: types.UserSession{
|
||||
Key: uuid.New().String(),
|
||||
UserName: login.UserName,
|
||||
FullName: login.UserName,
|
||||
LoginTime: time.Now(),
|
||||
LastActiveTime: time.Now(),
|
||||
Locale: login.Locale,
|
||||
MessageLocale: login.Locale,
|
||||
},
|
||||
Registry: NewRegistry(),
|
||||
body.Res = &types.LoginResponse{
|
||||
Returnval: createSession(ctx, req.UserName, req.Locale),
|
||||
}
|
||||
}
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
func (s *SessionManager) LoginExtensionByCertificate(ctx *Context, req *types.LoginExtensionByCertificate) soap.HasFault {
|
||||
body := new(methods.LoginExtensionByCertificateBody)
|
||||
|
||||
if ctx.req.TLS == nil || len(ctx.req.TLS.PeerCertificates) == 0 {
|
||||
body.Fault_ = Fault("", new(types.NoClientCertificate))
|
||||
return body
|
||||
}
|
||||
|
||||
if req.ExtensionKey == "" || ctx.Session != nil {
|
||||
body.Fault_ = invalidLogin
|
||||
} else {
|
||||
body.Res = &types.LoginExtensionByCertificateResponse{
|
||||
Returnval: createSession(ctx, req.ExtensionKey, req.Locale),
|
||||
}
|
||||
}
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
func (s *SessionManager) LoginByToken(ctx *Context, req *types.LoginByToken) soap.HasFault {
|
||||
body := new(methods.LoginByTokenBody)
|
||||
|
||||
if ctx.Session != nil {
|
||||
body.Fault_ = invalidLogin
|
||||
} else {
|
||||
var subject struct {
|
||||
ID string `xml:"Assertion>Subject>NameID"`
|
||||
}
|
||||
|
||||
ctx.SetSession(session, true)
|
||||
if s, ok := ctx.Header.Security.(*Element); ok {
|
||||
_ = s.Decode(&subject)
|
||||
}
|
||||
|
||||
body.Res = &types.LoginResponse{
|
||||
Returnval: session.UserSession,
|
||||
if subject.ID == "" {
|
||||
body.Fault_ = invalidLogin
|
||||
return body
|
||||
}
|
||||
|
||||
body.Res = &types.LoginByTokenResponse{
|
||||
Returnval: createSession(ctx, subject.ID, req.Locale),
|
||||
}
|
||||
}
|
||||
|
||||
@ -163,6 +215,7 @@ var internalContext = &Context{
|
||||
},
|
||||
Registry: NewRegistry(),
|
||||
},
|
||||
Map: Map,
|
||||
}
|
||||
|
||||
var invalidLogin = Fault("Login failure", new(types.InvalidLogin))
|
||||
@ -175,7 +228,9 @@ type Context struct {
|
||||
|
||||
context.Context
|
||||
Session *Session
|
||||
Header soap.Header
|
||||
Caller *types.ManagedObjectReference
|
||||
Map *Registry
|
||||
}
|
||||
|
||||
// mapSession maps an HTTP cookie to a Session.
|
||||
|
184
vendor/github.com/vmware/govmomi/simulator/simulator.go
generated
vendored
184
vendor/github.com/vmware/govmomi/simulator/simulator.go
generated
vendored
@ -21,6 +21,7 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"encoding/pem"
|
||||
"flag"
|
||||
@ -28,6 +29,7 @@ import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
@ -35,6 +37,7 @@ import (
|
||||
"path"
|
||||
"reflect"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/find"
|
||||
@ -51,15 +54,17 @@ var Trace = false
|
||||
|
||||
// Method encapsulates a decoded SOAP client request
|
||||
type Method struct {
|
||||
Name string
|
||||
This types.ManagedObjectReference
|
||||
Body types.AnyType
|
||||
Name string
|
||||
This types.ManagedObjectReference
|
||||
Header soap.Header
|
||||
Body types.AnyType
|
||||
}
|
||||
|
||||
// Service decodes incoming requests and dispatches to a Handler
|
||||
type Service struct {
|
||||
client *vim25.Client
|
||||
sm *SessionManager
|
||||
sdk map[string]*Registry
|
||||
|
||||
readAll func(io.Reader) ([]byte, error)
|
||||
|
||||
@ -70,7 +75,8 @@ type Service struct {
|
||||
// Server provides a simulator Service over HTTP
|
||||
type Server struct {
|
||||
*httptest.Server
|
||||
URL *url.URL
|
||||
URL *url.URL
|
||||
Tunnel int
|
||||
|
||||
caFile string
|
||||
}
|
||||
@ -80,6 +86,7 @@ func New(instance *ServiceInstance) *Service {
|
||||
s := &Service{
|
||||
readAll: ioutil.ReadAll,
|
||||
sm: Map.SessionManager(),
|
||||
sdk: make(map[string]*Registry),
|
||||
}
|
||||
|
||||
s.client, _ = vim25.NewClient(context.Background(), s)
|
||||
@ -110,12 +117,12 @@ func Fault(msg string, fault types.BaseMethodFault) *soap.Fault {
|
||||
}
|
||||
|
||||
func (s *Service) call(ctx *Context, method *Method) soap.HasFault {
|
||||
handler := Map.Get(method.This)
|
||||
handler := ctx.Map.Get(method.This)
|
||||
session := ctx.Session
|
||||
|
||||
if session == nil {
|
||||
switch method.Name {
|
||||
case "RetrieveServiceContent", "Login", "RetrieveProperties", "RetrievePropertiesEx", "CloneSession":
|
||||
case "RetrieveServiceContent", "List", "Login", "LoginByToken", "LoginExtensionByCertificate", "RetrieveProperties", "RetrievePropertiesEx", "CloneSession":
|
||||
// ok for now, TODO: authz
|
||||
default:
|
||||
fault := &types.NotAuthenticated{
|
||||
@ -170,7 +177,7 @@ func (s *Service) call(ctx *Context, method *Method) soap.HasFault {
|
||||
args = append(args, reflect.ValueOf(ctx))
|
||||
}
|
||||
args = append(args, reflect.ValueOf(method.Body))
|
||||
Map.WithLock(handler, func() {
|
||||
ctx.Map.WithLock(handler, func() {
|
||||
res = m.Call(args)
|
||||
})
|
||||
|
||||
@ -197,6 +204,7 @@ func (s *Service) RoundTrip(ctx context.Context, request, response soap.HasFault
|
||||
}
|
||||
|
||||
res := s.call(&Context{
|
||||
Map: Map,
|
||||
Context: ctx,
|
||||
Session: internalContext.Session,
|
||||
}, method)
|
||||
@ -281,6 +289,16 @@ func (s *Service) About(w http.ResponseWriter, r *http.Request) {
|
||||
_ = enc.Encode(&about)
|
||||
}
|
||||
|
||||
// RegisterSDK adds an HTTP handler for the Registry's Path and Namespace.
|
||||
func (s *Service) RegisterSDK(r *Registry) {
|
||||
if s.ServeMux == nil {
|
||||
s.ServeMux = http.NewServeMux()
|
||||
}
|
||||
|
||||
s.sdk[r.Path] = r
|
||||
s.ServeMux.HandleFunc(r.Path, s.ServeSDK)
|
||||
}
|
||||
|
||||
// ServeSDK implements the http.Handler interface
|
||||
func (s *Service) ServeSDK(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "POST" {
|
||||
@ -305,17 +323,19 @@ func (s *Service) ServeSDK(w http.ResponseWriter, r *http.Request) {
|
||||
res: w,
|
||||
m: s.sm,
|
||||
|
||||
Map: s.sdk[r.URL.Path],
|
||||
Context: context.Background(),
|
||||
}
|
||||
Map.WithLock(s.sm, ctx.mapSession)
|
||||
ctx.Map.WithLock(s.sm, ctx.mapSession)
|
||||
|
||||
var res soap.HasFault
|
||||
var soapBody interface{}
|
||||
|
||||
method, err := UnmarshalBody(body)
|
||||
method, err := UnmarshalBody(ctx.Map.typeFunc, body)
|
||||
if err != nil {
|
||||
res = serverFault(err.Error())
|
||||
} else {
|
||||
ctx.Header = method.Header
|
||||
res = s.call(ctx, method)
|
||||
}
|
||||
|
||||
@ -447,15 +467,10 @@ func (*Service) ServiceVersions(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// NewServer returns an http Server instance for the given service
|
||||
func (s *Service) NewServer() *Server {
|
||||
s.RegisterSDK(Map)
|
||||
|
||||
mux := s.ServeMux
|
||||
if mux == nil {
|
||||
mux = http.NewServeMux()
|
||||
}
|
||||
|
||||
path := "/sdk"
|
||||
|
||||
mux.HandleFunc(path, s.ServeSDK)
|
||||
mux.HandleFunc(path+"/vimServiceVersions.xml", s.ServiceVersions)
|
||||
mux.HandleFunc(Map.Path+"/vimServiceVersions.xml", s.ServiceVersions)
|
||||
mux.HandleFunc(folderPrefix, s.ServeDatastore)
|
||||
mux.HandleFunc("/about", s.About)
|
||||
|
||||
@ -466,7 +481,7 @@ func (s *Service) NewServer() *Server {
|
||||
u := &url.URL{
|
||||
Scheme: "http",
|
||||
Host: ts.Listener.Addr().String(),
|
||||
Path: path,
|
||||
Path: Map.Path,
|
||||
User: url.UserPassword("user", "pass"),
|
||||
}
|
||||
|
||||
@ -478,14 +493,31 @@ func (s *Service) NewServer() *Server {
|
||||
_ = f.Value.Set("")
|
||||
}
|
||||
|
||||
cert := ""
|
||||
if s.TLS == nil {
|
||||
ts.Start()
|
||||
} else {
|
||||
ts.TLS = s.TLS
|
||||
ts.TLS.ClientAuth = tls.RequestClientCert // Used by SessionManager.LoginExtensionByCertificate
|
||||
ts.StartTLS()
|
||||
u.Scheme += "s"
|
||||
|
||||
cert = base64.StdEncoding.EncodeToString(ts.TLS.Certificates[0].Certificate[0])
|
||||
}
|
||||
|
||||
// Add vcsim config to OptionManager for use by SDK handlers (see lookup/simulator for example)
|
||||
m := Map.OptionManager()
|
||||
m.Setting = append(m.Setting,
|
||||
&types.OptionValue{
|
||||
Key: "vcsim.server.url",
|
||||
Value: ts.URL,
|
||||
},
|
||||
&types.OptionValue{
|
||||
Key: "vcsim.server.cert",
|
||||
Value: cert,
|
||||
},
|
||||
)
|
||||
|
||||
return &Server{
|
||||
Server: ts,
|
||||
URL: u,
|
||||
@ -525,6 +557,60 @@ func (s *Server) CertificateFile() (string, error) {
|
||||
return s.caFile, pem.Encode(f, &pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw})
|
||||
}
|
||||
|
||||
// proxy tunnels SDK requests
|
||||
func (s *Server) proxy(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodConnect {
|
||||
http.Error(w, "", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
dst, err := net.Dial("tcp", s.URL.Host)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadGateway)
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusOK)
|
||||
|
||||
src, _, err := w.(http.Hijacker).Hijack()
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
go io.Copy(src, dst)
|
||||
go func() {
|
||||
_, _ = io.Copy(dst, src)
|
||||
_ = dst.Close()
|
||||
_ = src.Close()
|
||||
}()
|
||||
}
|
||||
|
||||
// StartTunnel runs an HTTP proxy for tunneling SDK requests that require TLS client certificate authentication.
|
||||
func (s *Server) StartTunnel() error {
|
||||
tunnel := &http.Server{
|
||||
Addr: fmt.Sprintf("%s:%d", s.URL.Hostname(), s.Tunnel),
|
||||
Handler: http.HandlerFunc(s.proxy),
|
||||
}
|
||||
|
||||
l, err := net.Listen("tcp", tunnel.Addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if s.Tunnel == 0 {
|
||||
s.Tunnel = l.Addr().(*net.TCPAddr).Port
|
||||
}
|
||||
|
||||
// Set client proxy port (defaults to vCenter host port 80 in real life)
|
||||
q := s.URL.Query()
|
||||
q.Set("GOVMOMI_TUNNEL_PROXY_PORT", strconv.Itoa(s.Tunnel))
|
||||
s.URL.RawQuery = q.Encode()
|
||||
|
||||
go tunnel.Serve(l)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Close shuts down the server and blocks until all outstanding
|
||||
// requests on this server have completed.
|
||||
func (s *Server) Close() {
|
||||
@ -536,7 +622,6 @@ func (s *Server) Close() {
|
||||
|
||||
var (
|
||||
vim25MapType = types.TypeFunc()
|
||||
typeFunc = defaultMapType
|
||||
)
|
||||
|
||||
func defaultMapType(name string) (reflect.Type, bool) {
|
||||
@ -552,14 +637,39 @@ func defaultMapType(name string) (reflect.Type, bool) {
|
||||
return typ, ok
|
||||
}
|
||||
|
||||
// UnmarshalBody extracts the Body from a soap.Envelope and unmarshals to the corresponding govmomi type
|
||||
func UnmarshalBody(data []byte) (*Method, error) {
|
||||
body := struct {
|
||||
// Element can be used to defer decoding of an XML node.
|
||||
type Element struct {
|
||||
start xml.StartElement
|
||||
inner struct {
|
||||
Content string `xml:",innerxml"`
|
||||
}{}
|
||||
}
|
||||
typeFunc func(string) (reflect.Type, bool)
|
||||
}
|
||||
|
||||
func (e *Element) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||
e.start = start
|
||||
|
||||
return d.DecodeElement(&e.inner, &start)
|
||||
}
|
||||
|
||||
func (e *Element) decoder() *xml.Decoder {
|
||||
decoder := xml.NewDecoder(strings.NewReader(e.inner.Content))
|
||||
decoder.TypeFunc = e.typeFunc // required to decode interface types
|
||||
return decoder
|
||||
}
|
||||
|
||||
func (e *Element) Decode(val interface{}) error {
|
||||
return e.decoder().DecodeElement(val, &e.start)
|
||||
}
|
||||
|
||||
// UnmarshalBody extracts the Body from a soap.Envelope and unmarshals to the corresponding govmomi type
|
||||
func UnmarshalBody(typeFunc func(string) (reflect.Type, bool), data []byte) (*Method, error) {
|
||||
body := &Element{typeFunc: typeFunc}
|
||||
req := soap.Envelope{
|
||||
Body: &body,
|
||||
Header: &soap.Header{
|
||||
Security: new(Element),
|
||||
},
|
||||
Body: body,
|
||||
}
|
||||
|
||||
err := xml.Unmarshal(data, &req)
|
||||
@ -567,40 +677,38 @@ func UnmarshalBody(data []byte) (*Method, error) {
|
||||
return nil, fmt.Errorf("xml.Unmarshal: %s", err)
|
||||
}
|
||||
|
||||
decoder := xml.NewDecoder(bytes.NewReader([]byte(body.Content)))
|
||||
decoder.TypeFunc = typeFunc // required to decode interface types
|
||||
|
||||
var start *xml.StartElement
|
||||
var start xml.StartElement
|
||||
var ok bool
|
||||
decoder := body.decoder()
|
||||
|
||||
for {
|
||||
tok, derr := decoder.Token()
|
||||
if derr != nil {
|
||||
return nil, fmt.Errorf("decoding body: %s", err)
|
||||
return nil, fmt.Errorf("decoding: %s", derr)
|
||||
}
|
||||
if t, ok := tok.(xml.StartElement); ok {
|
||||
start = &t
|
||||
if start, ok = tok.(xml.StartElement); ok {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
kind := start.Name.Local
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("decoding: method token not found")
|
||||
}
|
||||
|
||||
kind := start.Name.Local
|
||||
rtype, ok := typeFunc(kind)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no vmomi type defined for '%s'", kind)
|
||||
}
|
||||
|
||||
var val interface{}
|
||||
if rtype != nil {
|
||||
val = reflect.New(rtype).Interface()
|
||||
}
|
||||
val := reflect.New(rtype).Interface()
|
||||
|
||||
err = decoder.DecodeElement(val, start)
|
||||
err = decoder.DecodeElement(val, &start)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("decoding %s: %s", kind, err)
|
||||
}
|
||||
|
||||
method := &Method{Name: kind, Body: val}
|
||||
method := &Method{Name: kind, Header: *req.Header, Body: val}
|
||||
|
||||
field := reflect.ValueOf(val).Elem().FieldByName("This")
|
||||
|
||||
|
4
vendor/github.com/vmware/govmomi/simulator/snapshot.go
generated
vendored
4
vendor/github.com/vmware/govmomi/simulator/snapshot.go
generated
vendored
@ -39,6 +39,10 @@ func (v *VirtualMachineSnapshot) RemoveSnapshotTask(req *types.RemoveSnapshot_Ta
|
||||
}
|
||||
|
||||
vm.Snapshot.RootSnapshotList = removeSnapshotInTree(vm.Snapshot.RootSnapshotList, req.This, req.RemoveChildren)
|
||||
|
||||
if len(vm.Snapshot.RootSnapshotList) == 0 {
|
||||
vm.Snapshot = nil
|
||||
}
|
||||
})
|
||||
|
||||
return nil, nil
|
||||
|
30
vendor/github.com/vmware/govmomi/simulator/virtual_machine.go
generated
vendored
30
vendor/github.com/vmware/govmomi/simulator/virtual_machine.go
generated
vendored
@ -17,11 +17,13 @@ limitations under the License.
|
||||
package simulator
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@ -63,7 +65,7 @@ func NewVirtualMachine(parent types.ManagedObjectReference, spec *types.VirtualM
|
||||
MemoryAllocation: &rspec.MemoryAllocation,
|
||||
CpuAllocation: &rspec.CpuAllocation,
|
||||
}
|
||||
vm.Snapshot = &types.VirtualMachineSnapshotInfo{}
|
||||
vm.Snapshot = nil // intentionally set to nil until a snapshot is created
|
||||
vm.Storage = &types.VirtualMachineStorageInfo{
|
||||
Timestamp: time.Now(),
|
||||
}
|
||||
@ -420,6 +422,28 @@ func (vm *VirtualMachine) generateMAC() string {
|
||||
return mac.String()
|
||||
}
|
||||
|
||||
func numberToString(n int64, sep rune) string {
|
||||
buf := &bytes.Buffer{}
|
||||
if n < 0 {
|
||||
n = -n
|
||||
buf.WriteRune('-')
|
||||
}
|
||||
s := strconv.FormatInt(n, 10)
|
||||
pos := 3 - (len(s) % 3)
|
||||
for i := 0; i < len(s); i++ {
|
||||
if pos == 3 {
|
||||
if i != 0 {
|
||||
buf.WriteRune(sep)
|
||||
}
|
||||
pos = 0
|
||||
}
|
||||
pos++
|
||||
buf.WriteByte(s[i])
|
||||
}
|
||||
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
func (vm *VirtualMachine) configureDevice(devices object.VirtualDeviceList, spec *types.VirtualDeviceConfigSpec) types.BaseMethodFault {
|
||||
device := spec.Device
|
||||
d := device.GetVirtualDevice()
|
||||
@ -469,6 +493,7 @@ func (vm *VirtualMachine) configureDevice(devices object.VirtualDeviceList, spec
|
||||
c.MacAddress = vm.generateMAC()
|
||||
}
|
||||
case *types.VirtualDisk:
|
||||
summary = fmt.Sprintf("%s KB", numberToString(x.CapacityInKB, ','))
|
||||
switch b := d.Backing.(type) {
|
||||
case types.BaseVirtualDeviceFileBackingInfo:
|
||||
info := b.GetVirtualDeviceFileBackingInfo()
|
||||
@ -991,8 +1016,7 @@ func (vm *VirtualMachine) RemoveAllSnapshotsTask(req *types.RemoveAllSnapshots_T
|
||||
|
||||
refs := allSnapshotsInTree(vm.Snapshot.RootSnapshotList)
|
||||
|
||||
vm.Snapshot.CurrentSnapshot = nil
|
||||
vm.Snapshot.RootSnapshotList = nil
|
||||
vm.Snapshot = nil
|
||||
|
||||
for _, ref := range refs {
|
||||
Map.Remove(ref)
|
||||
|
4
vendor/github.com/vmware/govmomi/simulator/vpx/setting.go
generated
vendored
4
vendor/github.com/vmware/govmomi/simulator/vpx/setting.go
generated
vendored
@ -57,6 +57,10 @@ var Setting = []types.BaseOptionValue{
|
||||
Key: "config.vpxd.sso.admin.uri",
|
||||
Value: "https://127.0.0.1/sso-adminserver/sdk/vsphere.local",
|
||||
},
|
||||
&types.OptionValue{
|
||||
Key: "VirtualCenter.InstanceName",
|
||||
Value: "127.0.0.1",
|
||||
},
|
||||
&types.OptionValue{
|
||||
Key: "event.batchsize",
|
||||
Value: int32(2000),
|
||||
|
39
vendor/github.com/vmware/govmomi/sts/BUILD
generated
vendored
Normal file
39
vendor/github.com/vmware/govmomi/sts/BUILD
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"client.go",
|
||||
"signer.go",
|
||||
],
|
||||
importpath = "github.com/vmware/govmomi/sts",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/google/uuid:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/lookup/types:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/sts/internal:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/methods:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/xml:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [
|
||||
":package-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/sts/internal:all-srcs",
|
||||
"//vendor/github.com/vmware/govmomi/sts/simulator:all-srcs",
|
||||
],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
193
vendor/github.com/vmware/govmomi/sts/client.go
generated
vendored
Normal file
193
vendor/github.com/vmware/govmomi/sts/client.go
generated
vendored
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package sts
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"github.com/vmware/govmomi/lookup"
|
||||
"github.com/vmware/govmomi/lookup/types"
|
||||
"github.com/vmware/govmomi/sts/internal"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
)
|
||||
|
||||
const (
|
||||
Namespace = "oasis:names:tc:SAML:2.0:assertion"
|
||||
Path = "/sts/STSService"
|
||||
)
|
||||
|
||||
// Client is a soap.Client targeting the STS (Secure Token Service) API endpoint.
|
||||
type Client struct {
|
||||
*soap.Client
|
||||
}
|
||||
|
||||
// NewClient returns a client targeting the STS API endpoint.
|
||||
// The Client.URL will be set to that of the Lookup Service's endpoint registration,
|
||||
// as the SSO endpoint can be external to vCenter. If the Lookup Service is not available,
|
||||
// URL defaults to Path on the vim25.Client.URL.Host.
|
||||
func NewClient(ctx context.Context, c *vim25.Client) (*Client, error) {
|
||||
filter := &types.LookupServiceRegistrationFilter{
|
||||
ServiceType: &types.LookupServiceRegistrationServiceType{
|
||||
Product: "com.vmware.cis",
|
||||
Type: "sso:sts",
|
||||
},
|
||||
EndpointType: &types.LookupServiceRegistrationEndpointType{
|
||||
Protocol: "wsTrust",
|
||||
Type: "com.vmware.cis.cs.identity.sso",
|
||||
},
|
||||
}
|
||||
|
||||
url := lookup.EndpointURL(ctx, c, Path, filter)
|
||||
sc := c.Client.NewServiceClient(url, Namespace)
|
||||
|
||||
return &Client{sc}, nil
|
||||
}
|
||||
|
||||
// TokenRequest parameters for issuing a SAML token.
|
||||
// At least one of Userinfo or Certificate must be specified.
|
||||
type TokenRequest struct {
|
||||
Userinfo *url.Userinfo // Userinfo when set issues a Bearer token
|
||||
Certificate *tls.Certificate // Certificate when set issues a HoK token
|
||||
Lifetime time.Duration // Lifetime is the token's lifetime, defaults to 10m
|
||||
Renewable bool // Renewable allows the issued token to be renewed
|
||||
Delegatable bool // Delegatable allows the issued token to be delegated (e.g. for use with ActAs)
|
||||
Token string // Token for Renew request or Issue request ActAs identity
|
||||
}
|
||||
|
||||
func (c *Client) newRequest(req TokenRequest, kind string, s *Signer) (internal.RequestSecurityToken, error) {
|
||||
if req.Lifetime == 0 {
|
||||
req.Lifetime = 5 * time.Minute
|
||||
}
|
||||
|
||||
created := time.Now().UTC()
|
||||
rst := internal.RequestSecurityToken{
|
||||
TokenType: c.Namespace,
|
||||
RequestType: "http://docs.oasis-open.org/ws-sx/ws-trust/200512/" + kind,
|
||||
SignatureAlgorithm: internal.SHA256,
|
||||
Lifetime: &internal.Lifetime{
|
||||
Created: created.Format(internal.Time),
|
||||
Expires: created.Add(req.Lifetime).Format(internal.Time),
|
||||
},
|
||||
Renewing: &internal.Renewing{
|
||||
Allow: req.Renewable,
|
||||
// /wst:RequestSecurityToken/wst:Renewing/@OK
|
||||
// "It NOT RECOMMENDED to use this as it can leave you open to certain types of security attacks.
|
||||
// Issuers MAY restrict the period after expiration during which time the token can be renewed.
|
||||
// This window is governed by the issuer's policy."
|
||||
OK: false,
|
||||
},
|
||||
Delegatable: req.Delegatable,
|
||||
}
|
||||
|
||||
if req.Certificate == nil {
|
||||
if req.Userinfo == nil {
|
||||
return rst, errors.New("one of TokenRequest Certificate or Userinfo is required")
|
||||
}
|
||||
rst.KeyType = "http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer"
|
||||
} else {
|
||||
rst.KeyType = "http://docs.oasis-open.org/ws-sx/ws-trust/200512/PublicKey"
|
||||
rst.UseKey = &internal.UseKey{Sig: newID()}
|
||||
s.keyID = rst.UseKey.Sig
|
||||
}
|
||||
|
||||
return rst, nil
|
||||
}
|
||||
|
||||
func (s *Signer) setLifetime(lifetime *internal.Lifetime) error {
|
||||
var err error
|
||||
if lifetime != nil {
|
||||
s.Lifetime.Created, err = time.Parse(internal.Time, lifetime.Created)
|
||||
if err == nil {
|
||||
s.Lifetime.Expires, err = time.Parse(internal.Time, lifetime.Expires)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// Issue is used to request a security token.
|
||||
// The returned Signer can be used to sign SOAP requests, such as the SessionManager LoginByToken method and the RequestSecurityToken method itself.
|
||||
// One of TokenRequest Certificate or Userinfo is required, with Certificate taking precedence.
|
||||
// When Certificate is set, a Holder-of-Key token will be requested. Otherwise, a Bearer token is requested with the Userinfo credentials.
|
||||
// See: http://docs.oasis-open.org/ws-sx/ws-trust/v1.4/errata01/os/ws-trust-1.4-errata01-os-complete.html#_Toc325658937
|
||||
func (c *Client) Issue(ctx context.Context, req TokenRequest) (*Signer, error) {
|
||||
s := &Signer{
|
||||
Certificate: req.Certificate,
|
||||
user: req.Userinfo,
|
||||
}
|
||||
|
||||
rst, err := c.newRequest(req, "Issue", s)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if req.Token != "" {
|
||||
rst.ActAs = &internal.Target{
|
||||
Token: req.Token,
|
||||
}
|
||||
}
|
||||
|
||||
header := soap.Header{
|
||||
Security: s,
|
||||
Action: rst.Action(),
|
||||
}
|
||||
|
||||
res, err := internal.Issue(c.WithHeader(ctx, header), c, &rst)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.Token = res.RequestSecurityTokenResponse.RequestedSecurityToken.Assertion
|
||||
|
||||
return s, s.setLifetime(res.RequestSecurityTokenResponse.Lifetime)
|
||||
}
|
||||
|
||||
// Renew is used to request a security token renewal.
|
||||
func (c *Client) Renew(ctx context.Context, req TokenRequest) (*Signer, error) {
|
||||
s := &Signer{
|
||||
Certificate: req.Certificate,
|
||||
}
|
||||
|
||||
rst, err := c.newRequest(req, "Renew", s)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if req.Token == "" {
|
||||
return nil, errors.New("TokenRequest Token is required")
|
||||
}
|
||||
|
||||
rst.RenewTarget = &internal.Target{Token: req.Token}
|
||||
|
||||
header := soap.Header{
|
||||
Security: s,
|
||||
Action: rst.Action(),
|
||||
}
|
||||
|
||||
res, err := internal.Renew(c.WithHeader(ctx, header), c, &rst)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.Token = res.RequestedSecurityToken.Assertion
|
||||
|
||||
return s, s.setLifetime(res.Lifetime)
|
||||
}
|
27
vendor/github.com/vmware/govmomi/sts/internal/BUILD
generated
vendored
Normal file
27
vendor/github.com/vmware/govmomi/sts/internal/BUILD
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["types.go"],
|
||||
importpath = "github.com/vmware/govmomi/sts/internal",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/types:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/xml:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
694
vendor/github.com/vmware/govmomi/sts/internal/types.go
generated
vendored
Normal file
694
vendor/github.com/vmware/govmomi/sts/internal/types.go
generated
vendored
Normal file
@ -0,0 +1,694 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package internal
|
||||
|
||||
// The sts/internal package provides the types for invoking the sts.Issue method.
|
||||
// The sts.Issue and SessionManager LoginByToken methods require an XML signature.
|
||||
// Unlike the JRE and .NET runtimes, the Go stdlib does not support XML signing.
|
||||
// We should considering contributing to the goxmldsig package and gosaml2 to meet
|
||||
// the needs of sts.Issue rather than maintaining this package long term.
|
||||
// The tricky part of xmldig is the XML canonicalization (C14N), which is responsible
|
||||
// for most of the make-your-eyes bleed XML formatting in this package.
|
||||
// C14N is also why some structures use xml.Name without a field tag and methods modify the xml.Name directly,
|
||||
// though also working around Go's handling of XML namespace prefixes.
|
||||
// Most of the types in this package were originally generated from the wsdl and hacked up gen/ scripts,
|
||||
// but have since been modified by hand.
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"log"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
"github.com/vmware/govmomi/vim25/xml"
|
||||
)
|
||||
|
||||
const (
|
||||
XSI = "http://www.w3.org/2001/XMLSchema-instance"
|
||||
WSU = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
|
||||
DSIG = "http://www.w3.org/2000/09/xmldsig#"
|
||||
SHA256 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
|
||||
Time = "2006-01-02T15:04:05.000Z"
|
||||
)
|
||||
|
||||
// Security is used as soap.Envelope.Header.Security when signing requests.
|
||||
type Security struct {
|
||||
XMLName xml.Name `xml:"wsse:Security"`
|
||||
WSSE string `xml:"xmlns:wsse,attr"`
|
||||
WSU string `xml:"xmlns:wsu,attr"`
|
||||
Timestamp Timestamp
|
||||
BinarySecurityToken *BinarySecurityToken `xml:",omitempty"`
|
||||
UsernameToken *UsernameToken `xml:",omitempty"`
|
||||
Assertion string `xml:",innerxml"`
|
||||
Signature *Signature `xml:",omitempty"`
|
||||
}
|
||||
|
||||
type Timestamp struct {
|
||||
XMLName xml.Name `xml:"wsu:Timestamp"`
|
||||
NS string `xml:"xmlns:wsu,attr"`
|
||||
ID string `xml:"wsu:Id,attr"`
|
||||
Created string `xml:"wsu:Created"`
|
||||
Expires string `xml:"wsu:Expires"`
|
||||
}
|
||||
|
||||
func (t *Timestamp) C14N() string {
|
||||
return Marshal(t)
|
||||
}
|
||||
|
||||
type BinarySecurityToken struct {
|
||||
XMLName xml.Name `xml:"wsse:BinarySecurityToken"`
|
||||
EncodingType string `xml:"EncodingType,attr"`
|
||||
ValueType string `xml:"ValueType,attr"`
|
||||
ID string `xml:"wsu:Id,attr"`
|
||||
Value string `xml:",chardata"`
|
||||
}
|
||||
|
||||
type UsernameToken struct {
|
||||
XMLName xml.Name `xml:"wsse:UsernameToken"`
|
||||
Username string `xml:"wsse:Username"`
|
||||
Password string `xml:"wsse:Password"`
|
||||
}
|
||||
|
||||
type Signature struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:ds,attr"`
|
||||
ID string `xml:"Id,attr"`
|
||||
SignedInfo SignedInfo
|
||||
SignatureValue Value
|
||||
KeyInfo KeyInfo
|
||||
}
|
||||
|
||||
func (s *Signature) C14N() string {
|
||||
return fmt.Sprintf(`<ds:Signature xmlns:ds="%s">%s%s%s</ds:Signature>`,
|
||||
DSIG, s.SignedInfo.C14N(), s.SignatureValue.C14N(), s.KeyInfo.C14N())
|
||||
}
|
||||
|
||||
type SignedInfo struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:ds,attr,omitempty"`
|
||||
CanonicalizationMethod Method
|
||||
SignatureMethod Method
|
||||
Reference []Reference
|
||||
}
|
||||
|
||||
func (s SignedInfo) C14N() string {
|
||||
ns := "" // empty in ActAs c14n form for example
|
||||
if s.NS != "" {
|
||||
ns = fmt.Sprintf(` xmlns:ds="%s"`, s.NS)
|
||||
}
|
||||
|
||||
c14n := []string{fmt.Sprintf("<ds:SignedInfo%s>", ns)}
|
||||
c14n = append(c14n, s.CanonicalizationMethod.C14N(), s.SignatureMethod.C14N())
|
||||
for i := range s.Reference {
|
||||
c14n = append(c14n, s.Reference[i].C14N())
|
||||
}
|
||||
c14n = append(c14n, "</ds:SignedInfo>")
|
||||
|
||||
return strings.Join(c14n, "")
|
||||
}
|
||||
|
||||
type Method struct {
|
||||
XMLName xml.Name
|
||||
Algorithm string `xml:",attr"`
|
||||
}
|
||||
|
||||
func (m *Method) C14N() string {
|
||||
return mkns("ds", m, &m.XMLName)
|
||||
}
|
||||
|
||||
type Value struct {
|
||||
XMLName xml.Name
|
||||
Value string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
func (v *Value) C14N() string {
|
||||
return mkns("ds", v, &v.XMLName)
|
||||
}
|
||||
|
||||
type Reference struct {
|
||||
XMLName xml.Name
|
||||
URI string `xml:",attr"`
|
||||
Transforms Transforms
|
||||
DigestMethod Method
|
||||
DigestValue Value
|
||||
}
|
||||
|
||||
func (r Reference) C14N() string {
|
||||
for i := range r.Transforms.Transform {
|
||||
t := &r.Transforms.Transform[i]
|
||||
t.XMLName.Local = "ds:Transform"
|
||||
t.XMLName.Space = ""
|
||||
|
||||
if t.InclusiveNamespaces != nil {
|
||||
name := &t.InclusiveNamespaces.XMLName
|
||||
if !strings.HasPrefix(name.Local, "ec:") {
|
||||
name.Local = "ec:" + name.Local
|
||||
name.Space = ""
|
||||
}
|
||||
t.InclusiveNamespaces.NS = t.Algorithm
|
||||
}
|
||||
}
|
||||
|
||||
c14n := []string{
|
||||
fmt.Sprintf(`<ds:Reference URI="%s">`, r.URI),
|
||||
r.Transforms.C14N(),
|
||||
r.DigestMethod.C14N(),
|
||||
r.DigestValue.C14N(),
|
||||
"</ds:Reference>",
|
||||
}
|
||||
|
||||
return strings.Join(c14n, "")
|
||||
}
|
||||
|
||||
func NewReference(id string, val string) Reference {
|
||||
sum := sha256.Sum256([]byte(val))
|
||||
|
||||
return Reference{
|
||||
XMLName: xml.Name{Local: "ds:Reference"},
|
||||
URI: "#" + id,
|
||||
Transforms: Transforms{
|
||||
XMLName: xml.Name{Local: "ds:Transforms"},
|
||||
Transform: []Transform{
|
||||
Transform{
|
||||
XMLName: xml.Name{Local: "ds:Transform"},
|
||||
Algorithm: "http://www.w3.org/2001/10/xml-exc-c14n#",
|
||||
},
|
||||
},
|
||||
},
|
||||
DigestMethod: Method{
|
||||
XMLName: xml.Name{Local: "ds:DigestMethod"},
|
||||
Algorithm: "http://www.w3.org/2001/04/xmlenc#sha256",
|
||||
},
|
||||
DigestValue: Value{
|
||||
XMLName: xml.Name{Local: "ds:DigestValue"},
|
||||
Value: base64.StdEncoding.EncodeToString(sum[:]),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type Transforms struct {
|
||||
XMLName xml.Name
|
||||
Transform []Transform
|
||||
}
|
||||
|
||||
func (t *Transforms) C14N() string {
|
||||
return mkns("ds", t, &t.XMLName)
|
||||
}
|
||||
|
||||
type Transform struct {
|
||||
XMLName xml.Name
|
||||
Algorithm string `xml:",attr"`
|
||||
InclusiveNamespaces *InclusiveNamespaces `xml:",omitempty"`
|
||||
}
|
||||
|
||||
type InclusiveNamespaces struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:ec,attr,omitempty"`
|
||||
PrefixList string `xml:",attr"`
|
||||
}
|
||||
|
||||
type X509Data struct {
|
||||
XMLName xml.Name
|
||||
X509Certificate string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
type KeyInfo struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:ds,attr,omitempty"`
|
||||
SecurityTokenReference *SecurityTokenReference `xml:",omitempty"`
|
||||
X509Data *X509Data `xml:",omitempty"`
|
||||
}
|
||||
|
||||
func (o *KeyInfo) C14N() string {
|
||||
names := []*xml.Name{
|
||||
&o.XMLName,
|
||||
}
|
||||
|
||||
if o.SecurityTokenReference != nil {
|
||||
names = append(names, &o.SecurityTokenReference.XMLName)
|
||||
}
|
||||
if o.X509Data != nil {
|
||||
names = append(names, &o.X509Data.XMLName)
|
||||
}
|
||||
|
||||
return mkns("ds", o, names...)
|
||||
}
|
||||
|
||||
type SecurityTokenReference struct {
|
||||
XMLName xml.Name `xml:"wsse:SecurityTokenReference"`
|
||||
WSSE11 string `xml:"xmlns:wsse11,attr,omitempty"`
|
||||
TokenType string `xml:"wsse11:TokenType,attr,omitempty"`
|
||||
Reference *SecurityReference `xml:",omitempty"`
|
||||
KeyIdentifier *KeyIdentifier `xml:",omitempty"`
|
||||
}
|
||||
|
||||
type SecurityReference struct {
|
||||
XMLName xml.Name `xml:"wsse:Reference"`
|
||||
URI string `xml:",attr"`
|
||||
ValueType string `xml:",attr"`
|
||||
}
|
||||
|
||||
type KeyIdentifier struct {
|
||||
XMLName xml.Name `xml:"wsse:KeyIdentifier"`
|
||||
ID string `xml:",innerxml"`
|
||||
ValueType string `xml:",attr"`
|
||||
}
|
||||
|
||||
type Issuer struct {
|
||||
XMLName xml.Name
|
||||
Format string `xml:",attr"`
|
||||
Value string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
func (i *Issuer) C14N() string {
|
||||
return mkns("saml2", i, &i.XMLName)
|
||||
}
|
||||
|
||||
type Assertion struct {
|
||||
XMLName xml.Name
|
||||
ID string `xml:",attr"`
|
||||
IssueInstant string `xml:",attr"`
|
||||
Version string `xml:",attr"`
|
||||
Issuer Issuer
|
||||
Signature Signature
|
||||
Subject Subject
|
||||
Conditions Conditions
|
||||
AuthnStatement AuthnStatement
|
||||
AttributeStatement AttributeStatement
|
||||
}
|
||||
|
||||
func (a *Assertion) C14N() string {
|
||||
start := `<saml2:Assertion xmlns:saml2="%s" ID="%s" IssueInstant="%s" Version="%s">`
|
||||
c14n := []string{
|
||||
fmt.Sprintf(start, a.XMLName.Space, a.ID, a.IssueInstant, a.Version),
|
||||
a.Issuer.C14N(),
|
||||
a.Signature.C14N(),
|
||||
a.Subject.C14N(),
|
||||
a.Conditions.C14N(),
|
||||
a.AuthnStatement.C14N(),
|
||||
a.AttributeStatement.C14N(),
|
||||
`</saml2:Assertion>`,
|
||||
}
|
||||
|
||||
return strings.Join(c14n, "")
|
||||
}
|
||||
|
||||
type NameID struct {
|
||||
XMLName xml.Name
|
||||
Format string `xml:",attr"`
|
||||
ID string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
type Subject struct {
|
||||
XMLName xml.Name
|
||||
NameID NameID
|
||||
SubjectConfirmation SubjectConfirmation
|
||||
}
|
||||
|
||||
func (s *Subject) C14N() string {
|
||||
data := &s.SubjectConfirmation.SubjectConfirmationData
|
||||
names := []*xml.Name{
|
||||
&s.XMLName,
|
||||
&s.NameID.XMLName,
|
||||
&s.SubjectConfirmation.XMLName,
|
||||
&data.XMLName,
|
||||
}
|
||||
if s.SubjectConfirmation.NameID != nil {
|
||||
names = append(names, &s.SubjectConfirmation.NameID.XMLName)
|
||||
}
|
||||
if data.KeyInfo != nil {
|
||||
data.NS = XSI
|
||||
data.Type = "saml2:KeyInfoConfirmationDataType"
|
||||
data.KeyInfo.XMLName = xml.Name{Local: "ds:KeyInfo"}
|
||||
data.KeyInfo.X509Data.XMLName = xml.Name{Local: "ds:X509Data"}
|
||||
data.KeyInfo.NS = DSIG
|
||||
}
|
||||
return mkns("saml2", s, names...)
|
||||
}
|
||||
|
||||
type SubjectConfirmationData struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:xsi,attr,omitempty"`
|
||||
Type string `xml:"xsi:type,attr,omitempty"`
|
||||
NotOnOrAfter string `xml:",attr,omitempty"`
|
||||
KeyInfo *KeyInfo
|
||||
}
|
||||
|
||||
type SubjectConfirmation struct {
|
||||
XMLName xml.Name
|
||||
Method string `xml:",attr"`
|
||||
NameID *NameID
|
||||
SubjectConfirmationData SubjectConfirmationData
|
||||
}
|
||||
|
||||
type Condition struct {
|
||||
Type string `xml:"xsi:type,attr,omitempty"`
|
||||
}
|
||||
|
||||
func (c *Condition) GetCondition() *Condition {
|
||||
return c
|
||||
}
|
||||
|
||||
type BaseCondition interface {
|
||||
GetCondition() *Condition
|
||||
}
|
||||
|
||||
func init() {
|
||||
types.Add("BaseCondition", reflect.TypeOf((*Condition)(nil)).Elem())
|
||||
types.Add("del:DelegationRestrictionType", reflect.TypeOf((*DelegateRestriction)(nil)).Elem())
|
||||
types.Add("rsa:RenewRestrictionType", reflect.TypeOf((*RenewRestriction)(nil)).Elem())
|
||||
}
|
||||
|
||||
type Conditions struct {
|
||||
XMLName xml.Name
|
||||
NotBefore string `xml:",attr"`
|
||||
NotOnOrAfter string `xml:",attr"`
|
||||
ProxyRestriction *ProxyRestriction `xml:",omitempty"`
|
||||
Condition []BaseCondition `xml:",omitempty"`
|
||||
}
|
||||
|
||||
func (c *Conditions) C14N() string {
|
||||
names := []*xml.Name{
|
||||
&c.XMLName,
|
||||
}
|
||||
|
||||
if c.ProxyRestriction != nil {
|
||||
names = append(names, &c.ProxyRestriction.XMLName)
|
||||
}
|
||||
|
||||
for i := range c.Condition {
|
||||
switch r := c.Condition[i].(type) {
|
||||
case *DelegateRestriction:
|
||||
names = append(names, &r.XMLName, &r.Delegate.NameID.XMLName)
|
||||
r.NS = XSI
|
||||
r.Type = "del:DelegationRestrictionType"
|
||||
r.Delegate.NS = r.Delegate.XMLName.Space
|
||||
r.Delegate.XMLName = xml.Name{Local: "del:Delegate"}
|
||||
case *RenewRestriction:
|
||||
names = append(names, &r.XMLName)
|
||||
r.NS = XSI
|
||||
r.Type = "rsa:RenewRestrictionType"
|
||||
}
|
||||
}
|
||||
|
||||
return mkns("saml2", c, names...)
|
||||
}
|
||||
|
||||
type ProxyRestriction struct {
|
||||
XMLName xml.Name
|
||||
Count int32 `xml:",attr"`
|
||||
}
|
||||
|
||||
type RenewRestriction struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:xsi,attr,omitempty"`
|
||||
Count int32 `xml:",attr"`
|
||||
Condition
|
||||
}
|
||||
|
||||
type Delegate struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:del,attr,omitempty"`
|
||||
DelegationInstant string `xml:",attr"`
|
||||
NameID NameID
|
||||
}
|
||||
|
||||
type DelegateRestriction struct {
|
||||
XMLName xml.Name
|
||||
NS string `xml:"xmlns:xsi,attr,omitempty"`
|
||||
Condition
|
||||
Delegate Delegate
|
||||
}
|
||||
|
||||
type AuthnStatement struct {
|
||||
XMLName xml.Name
|
||||
AuthnInstant string `xml:",attr"`
|
||||
AuthnContext struct {
|
||||
XMLName xml.Name
|
||||
AuthnContextClassRef struct {
|
||||
XMLName xml.Name
|
||||
Value string `xml:",innerxml"`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AuthnStatement) C14N() string {
|
||||
return mkns("saml2", a, &a.XMLName, &a.AuthnContext.XMLName, &a.AuthnContext.AuthnContextClassRef.XMLName)
|
||||
}
|
||||
|
||||
type AttributeStatement struct {
|
||||
XMLName xml.Name
|
||||
Attribute []Attribute
|
||||
}
|
||||
|
||||
func (a *AttributeStatement) C14N() string {
|
||||
c14n := []string{"<saml2:AttributeStatement>"}
|
||||
for i := range a.Attribute {
|
||||
c14n = append(c14n, a.Attribute[i].C14N())
|
||||
}
|
||||
c14n = append(c14n, "</saml2:AttributeStatement>")
|
||||
return strings.Join(c14n, "")
|
||||
}
|
||||
|
||||
type AttributeValue struct {
|
||||
XMLName xml.Name
|
||||
Type string `xml:"type,attr"`
|
||||
Value string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
func (a *AttributeValue) C14N() string {
|
||||
return fmt.Sprintf(`<saml2:AttributeValue xmlns:xsi="%s" xsi:type="xs:string">%s</saml2:AttributeValue>`, XSI, a.Value)
|
||||
}
|
||||
|
||||
type Attribute struct {
|
||||
XMLName xml.Name
|
||||
FriendlyName string `xml:",attr"`
|
||||
Name string `xml:",attr"`
|
||||
NameFormat string `xml:",attr"`
|
||||
AttributeValue []AttributeValue
|
||||
}
|
||||
|
||||
func (a *Attribute) C14N() string {
|
||||
c14n := []string{
|
||||
fmt.Sprintf(`<saml2:Attribute FriendlyName="%s" Name="%s" NameFormat="%s">`, a.FriendlyName, a.Name, a.NameFormat),
|
||||
}
|
||||
|
||||
for i := range a.AttributeValue {
|
||||
c14n = append(c14n, a.AttributeValue[i].C14N())
|
||||
}
|
||||
|
||||
c14n = append(c14n, `</saml2:Attribute>`)
|
||||
|
||||
return strings.Join(c14n, "")
|
||||
}
|
||||
|
||||
type Lifetime struct {
|
||||
Created string `xml:"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd Created"`
|
||||
Expires string `xml:"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd Expires"`
|
||||
}
|
||||
|
||||
func (t *Lifetime) C14N() string {
|
||||
return fmt.Sprintf(`<Lifetime><wsu:Created>%s</wsu:Created><wsu:Expires>%s</wsu:Expires></Lifetime>`, t.Created, t.Expires)
|
||||
}
|
||||
|
||||
type Renewing struct {
|
||||
Allow bool `xml:",attr"`
|
||||
OK bool `xml:",attr"`
|
||||
}
|
||||
|
||||
type UseKey struct {
|
||||
Sig string `xml:",attr"`
|
||||
}
|
||||
|
||||
type Target struct {
|
||||
Token string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
type RequestSecurityToken struct {
|
||||
TokenType string `xml:",omitempty"`
|
||||
RequestType string `xml:",omitempty"`
|
||||
Lifetime *Lifetime `xml:",omitempty"`
|
||||
Renewing *Renewing `xml:",omitempty"`
|
||||
Delegatable bool `xml:",omitempty"`
|
||||
KeyType string `xml:",omitempty"`
|
||||
SignatureAlgorithm string `xml:",omitempty"`
|
||||
UseKey *UseKey `xml:",omitempty"`
|
||||
ActAs *Target `xml:",omitempty"`
|
||||
ValidateTarget *Target `xml:",omitempty"`
|
||||
RenewTarget *Target `xml:",omitempty"`
|
||||
}
|
||||
|
||||
func Unmarshal(data []byte, v interface{}) error {
|
||||
dec := xml.NewDecoder(bytes.NewReader(data))
|
||||
dec.TypeFunc = types.TypeFunc()
|
||||
return dec.Decode(v)
|
||||
}
|
||||
|
||||
// toString returns an XML encoded RequestSecurityToken.
|
||||
// When c14n is true, returns the canonicalized ActAs.Assertion which is required to sign the Issue request.
|
||||
// When c14n is false, returns the original content of the ActAs.Assertion.
|
||||
// The original content must be used within the request Body, as it has its own signature.
|
||||
func (r *RequestSecurityToken) toString(c14n bool) string {
|
||||
actas := ""
|
||||
if r.ActAs != nil {
|
||||
token := r.ActAs.Token
|
||||
if c14n {
|
||||
var a Assertion
|
||||
err := Unmarshal([]byte(r.ActAs.Token), &a)
|
||||
if err != nil {
|
||||
log.Printf("decode ActAs: %s", err)
|
||||
}
|
||||
token = a.C14N()
|
||||
}
|
||||
|
||||
actas = fmt.Sprintf(`<wst:ActAs xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200802">%s</wst:ActAs>`, token)
|
||||
}
|
||||
|
||||
body := []string{
|
||||
fmt.Sprintf(`<RequestSecurityToken xmlns="http://docs.oasis-open.org/ws-sx/ws-trust/200512">`),
|
||||
fmt.Sprintf(`<TokenType>%s</TokenType>`, r.TokenType),
|
||||
fmt.Sprintf(`<RequestType>%s</RequestType>`, r.RequestType),
|
||||
r.Lifetime.C14N(),
|
||||
}
|
||||
|
||||
if r.RenewTarget == nil {
|
||||
body = append(body,
|
||||
fmt.Sprintf(`<Renewing Allow="%t" OK="%t"></Renewing>`, r.Renewing.Allow, r.Renewing.OK),
|
||||
fmt.Sprintf(`<Delegatable>%t</Delegatable>`, r.Delegatable),
|
||||
actas,
|
||||
fmt.Sprintf(`<KeyType>%s</KeyType>`, r.KeyType),
|
||||
fmt.Sprintf(`<SignatureAlgorithm>%s</SignatureAlgorithm>`, r.SignatureAlgorithm),
|
||||
fmt.Sprintf(`<UseKey Sig="%s"></UseKey>`, r.UseKey.Sig))
|
||||
} else {
|
||||
token := r.RenewTarget.Token
|
||||
if c14n {
|
||||
var a Assertion
|
||||
err := Unmarshal([]byte(r.RenewTarget.Token), &a)
|
||||
if err != nil {
|
||||
log.Printf("decode Renew: %s", err)
|
||||
}
|
||||
token = a.C14N()
|
||||
}
|
||||
|
||||
body = append(body,
|
||||
fmt.Sprintf(`<UseKey Sig="%s"></UseKey>`, r.UseKey.Sig),
|
||||
fmt.Sprintf(`<RenewTarget>%s</RenewTarget>`, token))
|
||||
}
|
||||
|
||||
return strings.Join(append(body, `</RequestSecurityToken>`), "")
|
||||
}
|
||||
|
||||
func (r *RequestSecurityToken) C14N() string {
|
||||
return r.toString(true)
|
||||
}
|
||||
|
||||
func (r *RequestSecurityToken) String() string {
|
||||
return r.toString(false)
|
||||
}
|
||||
|
||||
type RequestSecurityTokenResponseCollection struct {
|
||||
RequestSecurityTokenResponse RequestSecurityTokenResponse
|
||||
}
|
||||
|
||||
type RequestSecurityTokenResponse struct {
|
||||
RequestedSecurityToken RequestedSecurityToken
|
||||
Lifetime *Lifetime `xml:"http://docs.oasis-open.org/ws-sx/ws-trust/200512 Lifetime"`
|
||||
}
|
||||
|
||||
type RequestedSecurityToken struct {
|
||||
Assertion string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
type RequestSecurityTokenBody struct {
|
||||
Req *RequestSecurityToken `xml:"http://docs.oasis-open.org/ws-sx/ws-trust/200512 RequestSecurityToken,omitempty"`
|
||||
Res *RequestSecurityTokenResponseCollection `xml:"http://docs.oasis-open.org/ws-sx/ws-trust/200512 RequestSecurityTokenResponseCollection,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *RequestSecurityTokenBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func (b *RequestSecurityTokenBody) RequestSecurityToken() *RequestSecurityToken { return b.Req }
|
||||
|
||||
func (r *RequestSecurityToken) Action() string {
|
||||
kind := path.Base(r.RequestType)
|
||||
return "http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/" + kind
|
||||
}
|
||||
|
||||
func Issue(ctx context.Context, r soap.RoundTripper, req *RequestSecurityToken) (*RequestSecurityTokenResponseCollection, error) {
|
||||
var reqBody, resBody RequestSecurityTokenBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
type RenewSecurityTokenBody struct {
|
||||
Req *RequestSecurityToken `xml:"http://docs.oasis-open.org/ws-sx/ws-trust/200512 RequestSecurityToken,omitempty"`
|
||||
Res *RequestSecurityTokenResponse `xml:"http://docs.oasis-open.org/ws-sx/ws-trust/200512 RequestSecurityTokenResponse,omitempty"`
|
||||
Fault_ *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *RenewSecurityTokenBody) Fault() *soap.Fault { return b.Fault_ }
|
||||
|
||||
func (b *RenewSecurityTokenBody) RequestSecurityToken() *RequestSecurityToken { return b.Req }
|
||||
|
||||
func Renew(ctx context.Context, r soap.RoundTripper, req *RequestSecurityToken) (*RequestSecurityTokenResponse, error) {
|
||||
var reqBody, resBody RenewSecurityTokenBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
// Marshal panics if xml.Marshal returns an error
|
||||
func Marshal(val interface{}) string {
|
||||
b, err := xml.Marshal(val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// mkns prepends the given namespace to xml.Name.Local and returns obj encoded as xml.
|
||||
// Note that the namespace is required when encoding, but the namespace prefix must not be
|
||||
// present when decoding as Go's decoding does not handle namespace prefix.
|
||||
func mkns(ns string, obj interface{}, name ...*xml.Name) string {
|
||||
ns = ns + ":"
|
||||
for i := range name {
|
||||
name[i].Space = ""
|
||||
if !strings.HasPrefix(name[i].Local, ns) {
|
||||
name[i].Local = ns + name[i].Local
|
||||
}
|
||||
}
|
||||
|
||||
return Marshal(obj)
|
||||
}
|
220
vendor/github.com/vmware/govmomi/sts/signer.go
generated
vendored
Normal file
220
vendor/github.com/vmware/govmomi/sts/signer.go
generated
vendored
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package sts
|
||||
|
||||
import (
|
||||
"crypto"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha256"
|
||||
"crypto/tls"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/vmware/govmomi/sts/internal"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/xml"
|
||||
)
|
||||
|
||||
// Signer implements the soap.Signer interface.
|
||||
type Signer struct {
|
||||
Token string // Token is a SAML token
|
||||
Certificate *tls.Certificate // Certificate is used to sign requests
|
||||
Lifetime struct {
|
||||
Created time.Time
|
||||
Expires time.Time
|
||||
}
|
||||
user *url.Userinfo // user contains the credentials for bearer token request
|
||||
keyID string // keyID is the Signature UseKey ID, which is referenced in both the soap body and header
|
||||
}
|
||||
|
||||
// signedEnvelope is similar to soap.Envelope, but with namespace and Body as innerxml
|
||||
type signedEnvelope struct {
|
||||
XMLName xml.Name `xml:"soap:Envelope"`
|
||||
NS string `xml:"xmlns:soap,attr"`
|
||||
Header soap.Header `xml:"soap:Header"`
|
||||
Body string `xml:",innerxml"`
|
||||
}
|
||||
|
||||
// newID returns a unique Reference ID, with a leading underscore as required by STS.
|
||||
func newID() string {
|
||||
return "_" + uuid.New().String()
|
||||
}
|
||||
|
||||
func (s *Signer) setTokenReference(info *internal.KeyInfo) error {
|
||||
var token struct {
|
||||
ID string `xml:",attr"` // parse saml2:Assertion ID attribute
|
||||
InnerXML string `xml:",innerxml"` // no need to parse the entire token
|
||||
}
|
||||
if err := xml.Unmarshal([]byte(s.Token), &token); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
info.SecurityTokenReference = &internal.SecurityTokenReference{
|
||||
WSSE11: "http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd",
|
||||
TokenType: "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0",
|
||||
KeyIdentifier: &internal.KeyIdentifier{
|
||||
ID: token.ID,
|
||||
ValueType: "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID",
|
||||
},
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sign is a soap.Signer implementation which can be used to sign RequestSecurityToken and LoginByTokenBody requests.
|
||||
func (s *Signer) Sign(env soap.Envelope) ([]byte, error) {
|
||||
var key *rsa.PrivateKey
|
||||
hasKey := false
|
||||
if s.Certificate != nil {
|
||||
key, hasKey = s.Certificate.PrivateKey.(*rsa.PrivateKey)
|
||||
if !hasKey {
|
||||
return nil, errors.New("sts: rsa.PrivateKey is required")
|
||||
}
|
||||
}
|
||||
|
||||
created := time.Now().UTC()
|
||||
header := &internal.Security{
|
||||
WSU: internal.WSU,
|
||||
WSSE: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
|
||||
Timestamp: internal.Timestamp{
|
||||
NS: internal.WSU,
|
||||
ID: newID(),
|
||||
Created: created.Format(internal.Time),
|
||||
Expires: created.Add(time.Minute).Format(internal.Time), // If STS receives this request after this, it is assumed to have expired.
|
||||
},
|
||||
}
|
||||
env.Header.Security = header
|
||||
|
||||
info := internal.KeyInfo{XMLName: xml.Name{Local: "ds:KeyInfo"}}
|
||||
var c14n, body string
|
||||
type requestToken interface {
|
||||
RequestSecurityToken() *internal.RequestSecurityToken
|
||||
}
|
||||
|
||||
switch x := env.Body.(type) {
|
||||
case requestToken:
|
||||
if hasKey {
|
||||
// We need c14n for all requests, as its digest is included in the signature and must match on the server side.
|
||||
// We need the body in original form when using an ActAs or RenewTarget token, where the token and its signature are embedded in the body.
|
||||
req := x.RequestSecurityToken()
|
||||
c14n = req.C14N()
|
||||
body = req.String()
|
||||
id := newID()
|
||||
|
||||
info.SecurityTokenReference = &internal.SecurityTokenReference{
|
||||
Reference: &internal.SecurityReference{
|
||||
URI: "#" + id,
|
||||
ValueType: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3",
|
||||
},
|
||||
}
|
||||
|
||||
header.BinarySecurityToken = &internal.BinarySecurityToken{
|
||||
EncodingType: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary",
|
||||
ValueType: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3",
|
||||
ID: id,
|
||||
Value: base64.StdEncoding.EncodeToString(s.Certificate.Certificate[0]),
|
||||
}
|
||||
} else {
|
||||
header.UsernameToken = &internal.UsernameToken{
|
||||
Username: s.user.Username(),
|
||||
}
|
||||
header.UsernameToken.Password, _ = s.user.Password()
|
||||
}
|
||||
case *methods.LoginByTokenBody:
|
||||
header.Assertion = s.Token
|
||||
|
||||
if hasKey {
|
||||
if err := s.setTokenReference(&info); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c14n = internal.Marshal(x.Req)
|
||||
}
|
||||
default:
|
||||
// We can end up here via ssoadmin.SessionManager.Login().
|
||||
// No other known cases where a signed request is needed.
|
||||
header.Assertion = s.Token
|
||||
if hasKey {
|
||||
if err := s.setTokenReference(&info); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
type Req interface {
|
||||
C14N() string
|
||||
}
|
||||
c14n = env.Body.(Req).C14N()
|
||||
}
|
||||
}
|
||||
|
||||
if !hasKey {
|
||||
return xml.Marshal(env) // Bearer token without key to sign
|
||||
}
|
||||
|
||||
id := newID()
|
||||
tmpl := `<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="%s" wsu:Id="%s">%s</soap:Body>`
|
||||
c14n = fmt.Sprintf(tmpl, internal.WSU, id, c14n)
|
||||
if body == "" {
|
||||
body = c14n
|
||||
} else {
|
||||
body = fmt.Sprintf(tmpl, internal.WSU, id, body)
|
||||
}
|
||||
|
||||
header.Signature = &internal.Signature{
|
||||
XMLName: xml.Name{Local: "ds:Signature"},
|
||||
NS: internal.DSIG,
|
||||
ID: s.keyID,
|
||||
KeyInfo: info,
|
||||
SignedInfo: internal.SignedInfo{
|
||||
XMLName: xml.Name{Local: "ds:SignedInfo"},
|
||||
NS: internal.DSIG,
|
||||
CanonicalizationMethod: internal.Method{
|
||||
XMLName: xml.Name{Local: "ds:CanonicalizationMethod"},
|
||||
Algorithm: "http://www.w3.org/2001/10/xml-exc-c14n#",
|
||||
},
|
||||
SignatureMethod: internal.Method{
|
||||
XMLName: xml.Name{Local: "ds:SignatureMethod"},
|
||||
Algorithm: internal.SHA256,
|
||||
},
|
||||
Reference: []internal.Reference{
|
||||
internal.NewReference(header.Timestamp.ID, header.Timestamp.C14N()),
|
||||
internal.NewReference(id, c14n),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
sum := sha256.Sum256([]byte(header.Signature.SignedInfo.C14N()))
|
||||
sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, sum[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
header.Signature.SignatureValue = internal.Value{
|
||||
XMLName: xml.Name{Local: "ds:SignatureValue"},
|
||||
Value: base64.StdEncoding.EncodeToString(sig),
|
||||
}
|
||||
|
||||
return xml.Marshal(signedEnvelope{
|
||||
NS: "http://schemas.xmlsoap.org/soap/envelope/",
|
||||
Header: *env.Header,
|
||||
Body: body,
|
||||
})
|
||||
}
|
27
vendor/github.com/vmware/govmomi/sts/simulator/BUILD
generated
vendored
Normal file
27
vendor/github.com/vmware/govmomi/sts/simulator/BUILD
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["simulator.go"],
|
||||
importpath = "github.com/vmware/govmomi/sts/simulator",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/vmware/govmomi/sts/internal:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library",
|
||||
"//vendor/github.com/vmware/govmomi/vim25/types:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
134
vendor/github.com/vmware/govmomi/sts/simulator/simulator.go
generated
vendored
Normal file
134
vendor/github.com/vmware/govmomi/sts/simulator/simulator.go
generated
vendored
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
Copyright (c) 2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package simulator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"path"
|
||||
"time"
|
||||
|
||||
"github.com/vmware/govmomi/sts/internal"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
vim "github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
// New creates an STS simulator and configures the simulator endpoint in the given settings.
|
||||
// The path returned is that of the settings "config.vpxd.sso.sts.uri" property.
|
||||
func New(u *url.URL, settings []vim.BaseOptionValue) (string, http.Handler) {
|
||||
for i := range settings {
|
||||
setting := settings[i].GetOptionValue()
|
||||
if setting.Key == "config.vpxd.sso.sts.uri" {
|
||||
endpoint, _ := url.Parse(setting.Value.(string))
|
||||
endpoint.Host = u.Host
|
||||
setting.Value = endpoint.String()
|
||||
settings[i] = setting
|
||||
return endpoint.Path, new(handler)
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
type handler struct{}
|
||||
|
||||
// ServeHTTP handles STS requests.
|
||||
func (s *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
action := r.Header.Get("SOAPAction")
|
||||
env := soap.Envelope{}
|
||||
now := time.Now()
|
||||
lifetime := &internal.Lifetime{
|
||||
Created: now.Format(internal.Time),
|
||||
Expires: now.Add(5 * time.Minute).Format(internal.Time),
|
||||
}
|
||||
|
||||
switch path.Base(action) {
|
||||
case "Issue":
|
||||
body := internal.RequestSecurityTokenBody{
|
||||
Res: &internal.RequestSecurityTokenResponseCollection{
|
||||
RequestSecurityTokenResponse: internal.RequestSecurityTokenResponse{
|
||||
RequestedSecurityToken: internal.RequestedSecurityToken{
|
||||
Assertion: token,
|
||||
},
|
||||
Lifetime: lifetime,
|
||||
},
|
||||
},
|
||||
}
|
||||
env.Body = body
|
||||
case "Renew":
|
||||
body := internal.RenewSecurityTokenBody{
|
||||
Res: &internal.RequestSecurityTokenResponse{
|
||||
RequestedSecurityToken: internal.RequestedSecurityToken{
|
||||
Assertion: token,
|
||||
},
|
||||
Lifetime: lifetime,
|
||||
},
|
||||
}
|
||||
env.Body = body
|
||||
default:
|
||||
log.Printf("sts: unsupported action=%s", action)
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusOK)
|
||||
fmt.Fprint(w, internal.Marshal(env))
|
||||
}
|
||||
|
||||
// Currently simulator.SessionManager.LoginByToken() only checks for a non-empty Assertion.Subject.NameID field,
|
||||
// so the token below is returned by Issue and Renew requests for now.
|
||||
var token = `<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="_1881a9ba-4a76-4baa-839b-36e2cba10743" IssueInstant="2018-03-04T00:27:56.409Z" Version="2.0"><saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://office1-sfo2-dhcp221.eng.vmware.com/websso/SAML2/Metadata/vsphere.local</saml2:Issuer><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><ds:Reference URI="#_1881a9ba-4a76-4baa-839b-36e2cba10743"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs xsi"/></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><ds:DigestValue>l/0AzCGiPB69oTstUdrCkihBIDtwb83A93zAe10tG3k=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>EKHf14V0CHctwqXRlhYSYNyID5lNJLimbw57eUBm/QlAMLY7GJ1wth44oeQPSj3eMpJaXKHEYYtn
|
||||
fqMngciTrq4ZP2SS7KizxuBjcHChWGmcp+t0zn7+fTbp5sL8HfF3AfOwcyZxwj8n2S7E6Eee7zeC
|
||||
cjZpKKZ1QIEwASwpuMCs7vU9IuXsUguHAaN55Jpx3N5u7PlSo/NZE0TJZ+zNWP8m9H5shPDY272D
|
||||
Vnp3MGfoD+Dj6T4H8OVF6bMp6czbHsEHTthwPh+pBTzR8ppkyxPKWLkC7OWiOtZBKqLSMTchQyqn
|
||||
GNJdl72FBXHS8WXGtJjbwL+MKf+WujhqwdRbXw==</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIIDxTCCAq2gAwIBAgIJAMYXe1r3pfByMA0GCSqGSIb3DQEBCwUAMIGqMQswCQYDVQQDDAJDQTEX
|
||||
MBUGCgmSJomT8ixkARkWB3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZFgVsb2NhbDELMAkGA1UEBhMC
|
||||
VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExLDAqBgNVBAoMI29mZmljZTEtc2ZvMi1kaGNwMjIxLmVu
|
||||
Zy52bXdhcmUuY29tMRswGQYDVQQLDBJWTXdhcmUgRW5naW5lZXJpbmcwHhcNMTgwMTExMjE1MjQ3
|
||||
WhcNMjgwMTA2MjIwMjMxWjAYMRYwFAYDVQQDDA1zc29zZXJ2ZXJTaWduMIIBIjANBgkqhkiG9w0B
|
||||
AQEFAAOCAQ8AMIIBCgKCAQEAohfKdXEpiCB+EewJJKk98he/KeAK/1bZ2MjnLspwt3Nvv2uh2xoa
|
||||
1asP/TMAhxcztPxhqEZmi0W+nihF/yffY/AhQrGx9XynaOMUNarCNGVI2qBovi8gohT2pXlbKxgZ
|
||||
b8VZkVl41WYkDBfQrzoP0XU/sFeOoNIHcFQX/82NFAYtN/4aBZ9gDqhyPihv2RSNG4MnvxxgxtZI
|
||||
FPb3eyDt8poKOMjt8zG2JkJRQYiEOCLo/sKJEKXLZeWiqYsbk391/vIk2vaX3L3pgu8yYx/dLfxv
|
||||
X/mRYIOcVzpXWQCEPdCejQBwrmVeRaepW5cMhOVlMAAw+mEXYVVTaIi1pfN53wIDAQABo38wfTAL
|
||||
BgNVHQ8EBAMCBeAwLgYDVR0RBCcwJYIjb2ZmaWNlMS1zZm8yLWRoY3AyMjEuZW5nLnZtd2FyZS5j
|
||||
b20wHQYDVR0OBBYEFAtGcFg9jVO3aBjgd2K0iBFTAPNSMB8GA1UdIwQYMBaAFLpyqy2v1I7a3URK
|
||||
ohtSLAtqve5qMA0GCSqGSIb3DQEBCwUAA4IBAQB91dZHRFunBs+YvuOYFRlwJTZOPXzlSYurxC7h
|
||||
VeYv6LUGZnuTkp0KfVMsfHyaeDslM8+5F9Iug1jxmEmpeyoaY12zQmxQB6P8lN4jj1Aazj8qmDH6
|
||||
ClaSY4Pp0lOSp9ROVlnLi6sRsRphOg+4MS4UeXGgSFlMN1BWJmXcwCazbii8l/EzGx2QhlVjWMAz
|
||||
lPFQlWQ4FvV5vUCf8iE+UTin+6oJSXmFzip1NOBOGiIbClmpergZUchNiqTYTrpqblD/Qex5Bv9e
|
||||
+xAwuw8e0Lm0XICOcFmKvpotLKKiqMMsRqPoeTqnoSyKqvCGRo2hUs4Y4O6SqEd80+E5lbXImrSt</ds:X509Certificate><ds:X509Certificate>MIIEPzCCAyegAwIBAgIJANS+QleTVJNbMA0GCSqGSIb3DQEBCwUAMIGqMQswCQYDVQQDDAJDQTEX
|
||||
MBUGCgmSJomT8ixkARkWB3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZFgVsb2NhbDELMAkGA1UEBhMC
|
||||
VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExLDAqBgNVBAoMI29mZmljZTEtc2ZvMi1kaGNwMjIxLmVu
|
||||
Zy52bXdhcmUuY29tMRswGQYDVQQLDBJWTXdhcmUgRW5naW5lZXJpbmcwHhcNMTgwMTA4MjIwMjMx
|
||||
WhcNMjgwMTA2MjIwMjMxWjCBqjELMAkGA1UEAwwCQ0ExFzAVBgoJkiaJk/IsZAEZFgd2c3BoZXJl
|
||||
MRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
|
||||
MSwwKgYDVQQKDCNvZmZpY2UxLXNmbzItZGhjcDIyMS5lbmcudm13YXJlLmNvbTEbMBkGA1UECwwS
|
||||
Vk13YXJlIEVuZ2luZWVyaW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcN7rsoK
|
||||
CIapsEOYejPK38Qk7CUSPFcOmT7iF15UFlZDogHe1G/ZkYvcP0IvLvpemRiYuRpVGVuUZ9XOgeW6
|
||||
J5xpSuNRXMHSMDTUwLM9t/4NMAQxgWVlJjFmPVBIZiWaQgdCzEbCDcv/XaZeb6uJYlbmLKvopmwy
|
||||
oDfncGXRUuQIZFsVIUhUgOtbbp9UmvXyjo9ukWdVcTkKlKK7NZGaVa4JYy7q4cc6g5eRmD9qp16o
|
||||
vx8DageNAasTP6arnb5CyoGI4KPqJjaI7V4Z1KiOUs+Zj+VtC3XdpVthNtiJ+vgXccO8e7zYfP0y
|
||||
d1PCQ/GEZAlRabus5Iplu4/xC23NywIDAQABo2YwZDAdBgNVHQ4EFgQUunKrLa/UjtrdREqiG1Is
|
||||
C2q97mowHwYDVR0RBBgwFoEOZW1haWxAYWNtZS5jb22HBH8AAAEwDgYDVR0PAQH/BAQDAgEGMBIG
|
||||
A1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBAC8bMIhFtlXnCF2fUixTXJ5HZFNY
|
||||
vbxa1eFjLFYuBsGBqhPEHkHkdKwgpfo1sd4t0L7JaGS9wsH6zyRUQs97subV5YUI6rvAPOBGDQTm
|
||||
RmCeqz3ODZq6JwZEnTTqZjvUVckmt/L/QaRUHAW27MU+SuN8rP0Nghf/gkOabsaWfyT2ADquko4e
|
||||
b7seYIlR5mJs+pxVBBsBB2nzxuaV5EjkgestxBqpGkxMnKEDhG6+VjqVxsZoEiNzdBNU7eM67Jc2
|
||||
2KU85jHKAao9LfMbwbHOA//1RStXXElyzPQvecq17ATvpw8AxCRu2KeKRwp3Pm2RiquDQFx8aiCe
|
||||
2Re4gkrEemA=</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature><saml2:Subject><saml2:NameID Format="http://schemas.xmlsoap.org/claims/UPN">Administrator@VSPHERE.LOCAL</saml2:NameID><saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml2:SubjectConfirmationData NotOnOrAfter="2018-03-04T00:27:01.401Z"/></saml2:SubjectConfirmation></saml2:Subject><saml2:Conditions NotBefore="2018-03-04T00:22:01.401Z" NotOnOrAfter="2018-03-04T00:27:01.401Z"><saml2:ProxyRestriction Count="10"/></saml2:Conditions><saml2:AuthnStatement AuthnInstant="2018-03-04T00:27:56.402Z"><saml2:AuthnContext><saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef></saml2:AuthnContext></saml2:AuthnStatement><saml2:AttributeStatement><saml2:Attribute FriendlyName="Groups" Name="http://rsa.com/schemas/attr-names/2009/01/GroupIdentity" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml2:AttributeValue xsi:type="xs:string">vsphere.local\Users</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\Administrators</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\CAAdmins</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\ComponentManager.Administrators</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\SystemConfiguration.BashShellAdministrators</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\SystemConfiguration.Administrators</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\LicenseService.Administrators</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\ActAsUsers</saml2:AttributeValue><saml2:AttributeValue xsi:type="xs:string">vsphere.local\Everyone</saml2:AttributeValue></saml2:Attribute><saml2:Attribute FriendlyName="givenName" Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml2:AttributeValue xsi:type="xs:string">Administrator</saml2:AttributeValue></saml2:Attribute><saml2:Attribute FriendlyName="surname" Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml2:AttributeValue xsi:type="xs:string">vsphere.local</saml2:AttributeValue></saml2:Attribute><saml2:Attribute FriendlyName="Subject Type" Name="http://vmware.com/schemas/attr-names/2011/07/isSolution" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml2:AttributeValue xsi:type="xs:string">false</saml2:AttributeValue></saml2:Attribute></saml2:AttributeStatement></saml2:Assertion>`
|
37
vendor/github.com/vmware/govmomi/vim25/client.go
generated
vendored
37
vendor/github.com/vmware/govmomi/vim25/client.go
generated
vendored
@ -19,12 +19,26 @@ package vim25
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
const (
|
||||
Namespace = "vim25"
|
||||
Version = "6.5"
|
||||
Path = "/sdk"
|
||||
)
|
||||
|
||||
var (
|
||||
ServiceInstance = types.ManagedObjectReference{
|
||||
Type: "ServiceInstance",
|
||||
Value: "ServiceInstance",
|
||||
}
|
||||
)
|
||||
|
||||
// Client is a tiny wrapper around the vim25/soap Client that stores session
|
||||
// specific state (i.e. state that only needs to be retrieved once after the
|
||||
// client has been created). This means the client can be reused after
|
||||
@ -43,19 +57,28 @@ type Client struct {
|
||||
// NewClient creates and returns a new client wirh the ServiceContent field
|
||||
// filled in.
|
||||
func NewClient(ctx context.Context, rt soap.RoundTripper) (*Client, error) {
|
||||
serviceContent, err := methods.GetServiceContent(ctx, rt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c := Client{
|
||||
ServiceContent: serviceContent,
|
||||
RoundTripper: rt,
|
||||
RoundTripper: rt,
|
||||
}
|
||||
|
||||
// Set client if it happens to be a soap.Client
|
||||
if sc, ok := rt.(*soap.Client); ok {
|
||||
c.Client = sc
|
||||
|
||||
if c.Namespace == "" {
|
||||
c.Namespace = "urn:" + Namespace
|
||||
} else if strings.Index(c.Namespace, ":") < 0 {
|
||||
c.Namespace = "urn:" + c.Namespace // ensure valid URI format
|
||||
}
|
||||
if c.Version == "" {
|
||||
c.Version = Version
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
c.ServiceContent, err = methods.GetServiceContent(ctx, rt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &c, nil
|
||||
|
1142
vendor/github.com/vmware/govmomi/vim25/methods/methods.go
generated
vendored
1142
vendor/github.com/vmware/govmomi/vim25/methods/methods.go
generated
vendored
File diff suppressed because it is too large
Load Diff
7
vendor/github.com/vmware/govmomi/vim25/methods/service_content.go
generated
vendored
7
vendor/github.com/vmware/govmomi/vim25/methods/service_content.go
generated
vendored
@ -24,14 +24,15 @@ import (
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
var ServiceInstance = types.ManagedObjectReference{
|
||||
// copy of vim25.ServiceInstance to avoid import cycle
|
||||
var serviceInstance = types.ManagedObjectReference{
|
||||
Type: "ServiceInstance",
|
||||
Value: "ServiceInstance",
|
||||
}
|
||||
|
||||
func GetServiceContent(ctx context.Context, r soap.RoundTripper) (types.ServiceContent, error) {
|
||||
req := types.RetrieveServiceContent{
|
||||
This: ServiceInstance,
|
||||
This: serviceInstance,
|
||||
}
|
||||
|
||||
res, err := RetrieveServiceContent(ctx, r, &req)
|
||||
@ -44,7 +45,7 @@ func GetServiceContent(ctx context.Context, r soap.RoundTripper) (types.ServiceC
|
||||
|
||||
func GetCurrentTime(ctx context.Context, r soap.RoundTripper) (*time.Time, error) {
|
||||
req := types.CurrentTime{
|
||||
This: ServiceInstance,
|
||||
This: serviceInstance,
|
||||
}
|
||||
|
||||
res, err := CurrentTime(ctx, r, &req)
|
||||
|
86
vendor/github.com/vmware/govmomi/vim25/mo/mo.go
generated
vendored
86
vendor/github.com/vmware/govmomi/vim25/mo/mo.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -164,6 +164,22 @@ func init() {
|
||||
t["CryptoManager"] = reflect.TypeOf((*CryptoManager)(nil)).Elem()
|
||||
}
|
||||
|
||||
type CryptoManagerHost struct {
|
||||
CryptoManager
|
||||
}
|
||||
|
||||
func init() {
|
||||
t["CryptoManagerHost"] = reflect.TypeOf((*CryptoManagerHost)(nil)).Elem()
|
||||
}
|
||||
|
||||
type CryptoManagerHostKMS struct {
|
||||
CryptoManagerHost
|
||||
}
|
||||
|
||||
func init() {
|
||||
t["CryptoManagerHostKMS"] = reflect.TypeOf((*CryptoManagerHostKMS)(nil)).Elem()
|
||||
}
|
||||
|
||||
type CryptoManagerKmip struct {
|
||||
CryptoManager
|
||||
|
||||
@ -759,9 +775,10 @@ func init() {
|
||||
type HostGraphicsManager struct {
|
||||
ExtensibleManagedObject
|
||||
|
||||
GraphicsInfo []types.HostGraphicsInfo `mo:"graphicsInfo"`
|
||||
GraphicsConfig *types.HostGraphicsConfig `mo:"graphicsConfig"`
|
||||
SharedPassthruGpuTypes []string `mo:"sharedPassthruGpuTypes"`
|
||||
GraphicsInfo []types.HostGraphicsInfo `mo:"graphicsInfo"`
|
||||
GraphicsConfig *types.HostGraphicsConfig `mo:"graphicsConfig"`
|
||||
SharedPassthruGpuTypes []string `mo:"sharedPassthruGpuTypes"`
|
||||
SharedGpuCapabilities []types.HostSharedGpuCapabilities `mo:"sharedGpuCapabilities"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
@ -853,6 +870,20 @@ func init() {
|
||||
t["HostNetworkSystem"] = reflect.TypeOf((*HostNetworkSystem)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostNvdimmSystem struct {
|
||||
Self types.ManagedObjectReference
|
||||
|
||||
NvdimmSystemInfo types.NvdimmSystemInfo `mo:"nvdimmSystemInfo"`
|
||||
}
|
||||
|
||||
func (m HostNvdimmSystem) Reference() types.ManagedObjectReference {
|
||||
return m.Self
|
||||
}
|
||||
|
||||
func init() {
|
||||
t["HostNvdimmSystem"] = reflect.TypeOf((*HostNvdimmSystem)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostPatchManager struct {
|
||||
Self types.ManagedObjectReference
|
||||
}
|
||||
@ -894,7 +925,10 @@ func init() {
|
||||
type HostProfile struct {
|
||||
Profile
|
||||
|
||||
ReferenceHost *types.ManagedObjectReference `mo:"referenceHost"`
|
||||
ValidationState *string `mo:"validationState"`
|
||||
ValidationStateUpdateTime *time.Time `mo:"validationStateUpdateTime"`
|
||||
ValidationFailureInfo *types.HostProfileValidationFailureInfo `mo:"validationFailureInfo"`
|
||||
ReferenceHost *types.ManagedObjectReference `mo:"referenceHost"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
@ -962,18 +996,25 @@ func init() {
|
||||
type HostSystem struct {
|
||||
ManagedEntity
|
||||
|
||||
Runtime types.HostRuntimeInfo `mo:"runtime"`
|
||||
Summary types.HostListSummary `mo:"summary"`
|
||||
Hardware *types.HostHardwareInfo `mo:"hardware"`
|
||||
Capability *types.HostCapability `mo:"capability"`
|
||||
LicensableResource types.HostLicensableResourceInfo `mo:"licensableResource"`
|
||||
ConfigManager types.HostConfigManager `mo:"configManager"`
|
||||
Config *types.HostConfigInfo `mo:"config"`
|
||||
Vm []types.ManagedObjectReference `mo:"vm"`
|
||||
Datastore []types.ManagedObjectReference `mo:"datastore"`
|
||||
Network []types.ManagedObjectReference `mo:"network"`
|
||||
DatastoreBrowser types.ManagedObjectReference `mo:"datastoreBrowser"`
|
||||
SystemResources *types.HostSystemResourceInfo `mo:"systemResources"`
|
||||
Runtime types.HostRuntimeInfo `mo:"runtime"`
|
||||
Summary types.HostListSummary `mo:"summary"`
|
||||
Hardware *types.HostHardwareInfo `mo:"hardware"`
|
||||
Capability *types.HostCapability `mo:"capability"`
|
||||
LicensableResource types.HostLicensableResourceInfo `mo:"licensableResource"`
|
||||
RemediationState *types.HostSystemRemediationState `mo:"remediationState"`
|
||||
PrecheckRemediationResult *types.ApplyHostProfileConfigurationSpec `mo:"precheckRemediationResult"`
|
||||
RemediationResult *types.ApplyHostProfileConfigurationResult `mo:"remediationResult"`
|
||||
ComplianceCheckState *types.HostSystemComplianceCheckState `mo:"complianceCheckState"`
|
||||
ComplianceCheckResult *types.ComplianceResult `mo:"complianceCheckResult"`
|
||||
ConfigManager types.HostConfigManager `mo:"configManager"`
|
||||
Config *types.HostConfigInfo `mo:"config"`
|
||||
Vm []types.ManagedObjectReference `mo:"vm"`
|
||||
Datastore []types.ManagedObjectReference `mo:"datastore"`
|
||||
Network []types.ManagedObjectReference `mo:"network"`
|
||||
DatastoreBrowser types.ManagedObjectReference `mo:"datastoreBrowser"`
|
||||
SystemResources *types.HostSystemResourceInfo `mo:"systemResources"`
|
||||
AnswerFileValidationState *types.AnswerFileStatusResult `mo:"answerFileValidationState"`
|
||||
AnswerFileValidationResult *types.AnswerFileStatusResult `mo:"answerFileValidationResult"`
|
||||
}
|
||||
|
||||
func (m *HostSystem) Entity() *ManagedEntity {
|
||||
@ -1056,10 +1097,13 @@ func init() {
|
||||
type HttpNfcLease struct {
|
||||
Self types.ManagedObjectReference
|
||||
|
||||
InitializeProgress int32 `mo:"initializeProgress"`
|
||||
Info *types.HttpNfcLeaseInfo `mo:"info"`
|
||||
State types.HttpNfcLeaseState `mo:"state"`
|
||||
Error *types.LocalizedMethodFault `mo:"error"`
|
||||
InitializeProgress int32 `mo:"initializeProgress"`
|
||||
TransferProgress int32 `mo:"transferProgress"`
|
||||
Mode string `mo:"mode"`
|
||||
Capabilities types.HttpNfcLeaseCapabilities `mo:"capabilities"`
|
||||
Info *types.HttpNfcLeaseInfo `mo:"info"`
|
||||
State types.HttpNfcLeaseState `mo:"state"`
|
||||
Error *types.LocalizedMethodFault `mo:"error"`
|
||||
}
|
||||
|
||||
func (m HttpNfcLease) Reference() types.ManagedObjectReference {
|
||||
|
5
vendor/github.com/vmware/govmomi/vim25/progress/reader.go
generated
vendored
5
vendor/github.com/vmware/govmomi/vim25/progress/reader.go
generated
vendored
@ -100,11 +100,12 @@ func NewReader(ctx context.Context, s Sinker, r io.Reader, size int64) *reader {
|
||||
// underlying channel.
|
||||
func (r *reader) Read(b []byte) (int, error) {
|
||||
n, err := r.r.Read(b)
|
||||
if err != nil {
|
||||
r.pos += int64(n)
|
||||
|
||||
if err != nil && err != io.EOF {
|
||||
return n, err
|
||||
}
|
||||
|
||||
r.pos += int64(n)
|
||||
q := readerReport{
|
||||
t: time.Now(),
|
||||
pos: r.pos,
|
||||
|
124
vendor/github.com/vmware/govmomi/vim25/soap/client.go
generated
vendored
124
vendor/github.com/vmware/govmomi/vim25/soap/client.go
generated
vendored
@ -28,6 +28,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/cookiejar"
|
||||
@ -53,17 +54,9 @@ type RoundTripper interface {
|
||||
}
|
||||
|
||||
const (
|
||||
DefaultVimNamespace = "urn:vim25"
|
||||
DefaultVimVersion = "6.5"
|
||||
DefaultMinVimVersion = "5.5"
|
||||
SessionCookieName = "vmware_soap_session"
|
||||
SessionCookieName = "vmware_soap_session"
|
||||
)
|
||||
|
||||
type header struct {
|
||||
Cookie string `xml:"vcSessionCookie,omitempty"`
|
||||
ID string `xml:"operationID,omitempty"`
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
http.Client
|
||||
|
||||
@ -71,7 +64,6 @@ type Client struct {
|
||||
k bool // Named after curl's -k flag
|
||||
d *debugContainer
|
||||
t *http.Transport
|
||||
p *url.URL
|
||||
|
||||
hostsMu sync.Mutex
|
||||
hosts map[string]string
|
||||
@ -149,20 +141,33 @@ func NewClient(u *url.URL, insecure bool) *Client {
|
||||
c.u = c.URL()
|
||||
c.u.User = nil
|
||||
|
||||
c.Namespace = DefaultVimNamespace
|
||||
c.Version = DefaultVimVersion
|
||||
|
||||
return &c
|
||||
}
|
||||
|
||||
// NewServiceClient creates a NewClient with the given URL.Path and namespace.
|
||||
func (c *Client) NewServiceClient(path string, namespace string) *Client {
|
||||
u := c.URL()
|
||||
u.Path = path
|
||||
vc := c.URL()
|
||||
u, err := url.Parse(path)
|
||||
if err != nil {
|
||||
log.Panicf("url.Parse(%q): %s", path, err)
|
||||
}
|
||||
if u.Host == "" {
|
||||
u.Scheme = vc.Scheme
|
||||
u.Host = vc.Host
|
||||
}
|
||||
|
||||
client := NewClient(u, c.k)
|
||||
client.Namespace = "urn:" + namespace
|
||||
if cert := c.Certificate(); cert != nil {
|
||||
client.SetCertificate(*cert)
|
||||
}
|
||||
|
||||
client.Namespace = namespace
|
||||
// Copy the trusted thumbprints
|
||||
c.hostsMu.Lock()
|
||||
for k, v := range c.hosts {
|
||||
client.hosts[k] = v
|
||||
}
|
||||
c.hostsMu.Unlock()
|
||||
|
||||
// Copy the cookies
|
||||
client.Client.Jar.SetCookies(u, c.Client.Jar.Cookies(u))
|
||||
@ -175,6 +180,9 @@ func (c *Client) NewServiceClient(path string, namespace string) *Client {
|
||||
}
|
||||
}
|
||||
|
||||
// Copy any query params (e.g. GOVMOMI_TUNNEL_PROXY_PORT used in testing)
|
||||
client.u.RawQuery = vc.RawQuery
|
||||
|
||||
return client
|
||||
}
|
||||
|
||||
@ -346,19 +354,33 @@ func splitHostPort(host string) (string, string) {
|
||||
|
||||
const sdkTunnel = "sdkTunnel:8089"
|
||||
|
||||
func (c *Client) Certificate() *tls.Certificate {
|
||||
certs := c.t.TLSClientConfig.Certificates
|
||||
if len(certs) == 0 {
|
||||
return nil
|
||||
}
|
||||
return &certs[0]
|
||||
}
|
||||
|
||||
func (c *Client) SetCertificate(cert tls.Certificate) {
|
||||
t := c.Client.Transport.(*http.Transport)
|
||||
|
||||
// Extension certificate
|
||||
// Extension or HoK certificate
|
||||
t.TLSClientConfig.Certificates = []tls.Certificate{cert}
|
||||
}
|
||||
|
||||
// Tunnel returns a Client configured to proxy requests through vCenter's http port 80,
|
||||
// to the SDK tunnel virtual host. Use of the SDK tunnel is required by LoginExtensionByCertificate()
|
||||
// and optional for other methods.
|
||||
func (c *Client) Tunnel() *Client {
|
||||
tunnel := c.NewServiceClient(c.u.Path, c.Namespace)
|
||||
t := tunnel.Client.Transport.(*http.Transport)
|
||||
// Proxy to vCenter host on port 80
|
||||
host, _ := splitHostPort(c.u.Host)
|
||||
|
||||
host := tunnel.u.Hostname()
|
||||
// Should be no reason to change the default port other than testing
|
||||
key := "GOVMOMI_TUNNEL_PROXY_PORT"
|
||||
|
||||
port := c.URL().Query().Get(key)
|
||||
port := tunnel.URL().Query().Get(key)
|
||||
if port == "" {
|
||||
port = os.Getenv(key)
|
||||
}
|
||||
@ -367,20 +389,14 @@ func (c *Client) SetCertificate(cert tls.Certificate) {
|
||||
host += ":" + port
|
||||
}
|
||||
|
||||
c.p = &url.URL{
|
||||
t.Proxy = http.ProxyURL(&url.URL{
|
||||
Scheme: "http",
|
||||
Host: host,
|
||||
}
|
||||
t.Proxy = func(r *http.Request) (*url.URL, error) {
|
||||
// Only sdk requests should be proxied
|
||||
if r.URL.Path == "/sdk" {
|
||||
return c.p, nil
|
||||
}
|
||||
return http.ProxyFromEnvironment(r)
|
||||
}
|
||||
})
|
||||
|
||||
// Rewrite url Host to use the sdk tunnel, required for a certificate request.
|
||||
c.u.Host = sdkTunnel
|
||||
tunnel.u.Host = sdkTunnel
|
||||
return tunnel
|
||||
}
|
||||
|
||||
func (c *Client) URL() *url.URL {
|
||||
@ -426,21 +442,41 @@ func (c *Client) do(ctx context.Context, req *http.Request) (*http.Response, err
|
||||
return c.Client.Do(req.WithContext(ctx))
|
||||
}
|
||||
|
||||
// Signer can be implemented by soap.Header.Security to sign requests.
|
||||
// If the soap.Header.Security field is set to an implementation of Signer via WithHeader(),
|
||||
// then Client.RoundTrip will call Sign() to marshal the SOAP request.
|
||||
type Signer interface {
|
||||
Sign(Envelope) ([]byte, error)
|
||||
}
|
||||
|
||||
type headerContext struct{}
|
||||
|
||||
// WithHeader can be used to modify the outgoing request soap.Header fields.
|
||||
func (c *Client) WithHeader(ctx context.Context, header Header) context.Context {
|
||||
return context.WithValue(ctx, headerContext{}, header)
|
||||
}
|
||||
|
||||
func (c *Client) RoundTrip(ctx context.Context, reqBody, resBody HasFault) error {
|
||||
var err error
|
||||
var b []byte
|
||||
|
||||
reqEnv := Envelope{Body: reqBody}
|
||||
resEnv := Envelope{Body: resBody}
|
||||
|
||||
h := &header{
|
||||
Cookie: c.cookie,
|
||||
h, ok := ctx.Value(headerContext{}).(Header)
|
||||
if !ok {
|
||||
h = Header{}
|
||||
}
|
||||
|
||||
// We added support for OperationID before soap.Header was exported.
|
||||
if id, ok := ctx.Value(types.ID{}).(string); ok {
|
||||
h.ID = id
|
||||
}
|
||||
|
||||
reqEnv.Header = h
|
||||
h.Cookie = c.cookie
|
||||
if h.Cookie != "" || h.ID != "" || h.Security != nil {
|
||||
reqEnv.Header = &h // XML marshal header only if a field is set
|
||||
}
|
||||
|
||||
// Create debugging context for this round trip
|
||||
d := c.d.newRoundTrip()
|
||||
@ -448,9 +484,16 @@ func (c *Client) RoundTrip(ctx context.Context, reqBody, resBody HasFault) error
|
||||
defer d.done()
|
||||
}
|
||||
|
||||
b, err := xml.Marshal(reqEnv)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
if signer, ok := h.Security.(Signer); ok {
|
||||
b, err = signer.Sign(reqEnv)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
b, err = xml.Marshal(reqEnv)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
rawReqBody := io.MultiReader(strings.NewReader(xml.Header), bytes.NewReader(b))
|
||||
@ -462,8 +505,13 @@ func (c *Client) RoundTrip(ctx context.Context, reqBody, resBody HasFault) error
|
||||
req = req.WithContext(ctx)
|
||||
|
||||
req.Header.Set(`Content-Type`, `text/xml; charset="utf-8"`)
|
||||
soapAction := fmt.Sprintf("%s/%s", c.Namespace, c.Version)
|
||||
req.Header.Set(`SOAPAction`, soapAction)
|
||||
|
||||
action := h.Action
|
||||
if action == "" {
|
||||
action = fmt.Sprintf("%s/%s", c.Namespace, c.Version)
|
||||
}
|
||||
req.Header.Set(`SOAPAction`, action)
|
||||
|
||||
if c.UserAgent != "" {
|
||||
req.Header.Set(`User-Agent`, c.UserAgent)
|
||||
}
|
||||
|
14
vendor/github.com/vmware/govmomi/vim25/soap/soap.go
generated
vendored
14
vendor/github.com/vmware/govmomi/vim25/soap/soap.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -21,9 +21,17 @@ import (
|
||||
"github.com/vmware/govmomi/vim25/xml"
|
||||
)
|
||||
|
||||
// Header includes optional soap Header fields.
|
||||
type Header struct {
|
||||
Action string `xml:"-"` // Action is the 'SOAPAction' HTTP header value. Defaults to "Client.Namespace/Client.Version".
|
||||
Cookie string `xml:"vcSessionCookie,omitempty"` // Cookie is a vCenter session cookie that can be used with other SDK endpoints (e.g. pbm).
|
||||
ID string `xml:"operationID,omitempty"` // ID is the operationID used by ESX/vCenter logging for correlation.
|
||||
Security interface{} `xml:",omitempty"` // Security is used for SAML token authentication and request signing.
|
||||
}
|
||||
|
||||
type Envelope struct {
|
||||
XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"`
|
||||
Header interface{} `xml:",omitempty"`
|
||||
XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"`
|
||||
Header *Header `xml:"http://schemas.xmlsoap.org/soap/envelope/ Header,omitempty"`
|
||||
Body interface{}
|
||||
}
|
||||
|
||||
|
380
vendor/github.com/vmware/govmomi/vim25/types/enum.go
generated
vendored
380
vendor/github.com/vmware/govmomi/vim25/types/enum.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -82,6 +82,59 @@ func init() {
|
||||
t["AgentInstallFailedReason"] = reflect.TypeOf((*AgentInstallFailedReason)(nil)).Elem()
|
||||
}
|
||||
|
||||
type AlarmFilterSpecAlarmTypeByEntity string
|
||||
|
||||
const (
|
||||
AlarmFilterSpecAlarmTypeByEntityEntityTypeAll = AlarmFilterSpecAlarmTypeByEntity("entityTypeAll")
|
||||
AlarmFilterSpecAlarmTypeByEntityEntityTypeHost = AlarmFilterSpecAlarmTypeByEntity("entityTypeHost")
|
||||
AlarmFilterSpecAlarmTypeByEntityEntityTypeVm = AlarmFilterSpecAlarmTypeByEntity("entityTypeVm")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["AlarmFilterSpecAlarmTypeByEntity"] = reflect.TypeOf((*AlarmFilterSpecAlarmTypeByEntity)(nil)).Elem()
|
||||
}
|
||||
|
||||
type AlarmFilterSpecAlarmTypeByTrigger string
|
||||
|
||||
const (
|
||||
AlarmFilterSpecAlarmTypeByTriggerTriggerTypeAll = AlarmFilterSpecAlarmTypeByTrigger("triggerTypeAll")
|
||||
AlarmFilterSpecAlarmTypeByTriggerTriggerTypeEvent = AlarmFilterSpecAlarmTypeByTrigger("triggerTypeEvent")
|
||||
AlarmFilterSpecAlarmTypeByTriggerTriggerTypeMetric = AlarmFilterSpecAlarmTypeByTrigger("triggerTypeMetric")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["AlarmFilterSpecAlarmTypeByTrigger"] = reflect.TypeOf((*AlarmFilterSpecAlarmTypeByTrigger)(nil)).Elem()
|
||||
}
|
||||
|
||||
type AnswerFileValidationInfoStatus string
|
||||
|
||||
const (
|
||||
AnswerFileValidationInfoStatusSuccess = AnswerFileValidationInfoStatus("success")
|
||||
AnswerFileValidationInfoStatusFailed = AnswerFileValidationInfoStatus("failed")
|
||||
AnswerFileValidationInfoStatusFailed_defaults = AnswerFileValidationInfoStatus("failed_defaults")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["AnswerFileValidationInfoStatus"] = reflect.TypeOf((*AnswerFileValidationInfoStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type ApplyHostProfileConfigurationResultStatus string
|
||||
|
||||
const (
|
||||
ApplyHostProfileConfigurationResultStatusSuccess = ApplyHostProfileConfigurationResultStatus("success")
|
||||
ApplyHostProfileConfigurationResultStatusFailed = ApplyHostProfileConfigurationResultStatus("failed")
|
||||
ApplyHostProfileConfigurationResultStatusReboot_failed = ApplyHostProfileConfigurationResultStatus("reboot_failed")
|
||||
ApplyHostProfileConfigurationResultStatusStateless_reboot_failed = ApplyHostProfileConfigurationResultStatus("stateless_reboot_failed")
|
||||
ApplyHostProfileConfigurationResultStatusCheck_compliance_failed = ApplyHostProfileConfigurationResultStatus("check_compliance_failed")
|
||||
ApplyHostProfileConfigurationResultStatusState_not_satisfied = ApplyHostProfileConfigurationResultStatus("state_not_satisfied")
|
||||
ApplyHostProfileConfigurationResultStatusExit_maintenancemode_failed = ApplyHostProfileConfigurationResultStatus("exit_maintenancemode_failed")
|
||||
ApplyHostProfileConfigurationResultStatusCanceled = ApplyHostProfileConfigurationResultStatus("canceled")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["ApplyHostProfileConfigurationResultStatus"] = reflect.TypeOf((*ApplyHostProfileConfigurationResultStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type ArrayUpdateOperation string
|
||||
|
||||
const (
|
||||
@ -410,6 +463,7 @@ const (
|
||||
ComplianceResultStatusCompliant = ComplianceResultStatus("compliant")
|
||||
ComplianceResultStatusNonCompliant = ComplianceResultStatus("nonCompliant")
|
||||
ComplianceResultStatusUnknown = ComplianceResultStatus("unknown")
|
||||
ComplianceResultStatusRunning = ComplianceResultStatus("running")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -499,6 +553,17 @@ func init() {
|
||||
t["DVPortStatusVmDirectPathGen2InactiveReasonOther"] = reflect.TypeOf((*DVPortStatusVmDirectPathGen2InactiveReasonOther)(nil)).Elem()
|
||||
}
|
||||
|
||||
type DVSMacLimitPolicyType string
|
||||
|
||||
const (
|
||||
DVSMacLimitPolicyTypeAllow = DVSMacLimitPolicyType("allow")
|
||||
DVSMacLimitPolicyTypeDrop = DVSMacLimitPolicyType("drop")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["DVSMacLimitPolicyType"] = reflect.TypeOf((*DVSMacLimitPolicyType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type DasConfigFaultDasConfigFaultReason string
|
||||
|
||||
const (
|
||||
@ -1079,6 +1144,18 @@ func init() {
|
||||
t["HostCapabilityFtUnsupportedReason"] = reflect.TypeOf((*HostCapabilityFtUnsupportedReason)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostCapabilityUnmapMethodSupported string
|
||||
|
||||
const (
|
||||
HostCapabilityUnmapMethodSupportedPriority = HostCapabilityUnmapMethodSupported("priority")
|
||||
HostCapabilityUnmapMethodSupportedFixed = HostCapabilityUnmapMethodSupported("fixed")
|
||||
HostCapabilityUnmapMethodSupportedDynamic = HostCapabilityUnmapMethodSupported("dynamic")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostCapabilityUnmapMethodSupported"] = reflect.TypeOf((*HostCapabilityUnmapMethodSupported)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostCapabilityVmDirectPathGen2UnsupportedReason string
|
||||
|
||||
const (
|
||||
@ -1186,8 +1263,12 @@ func init() {
|
||||
type HostDigestInfoDigestMethodType string
|
||||
|
||||
const (
|
||||
HostDigestInfoDigestMethodTypeSHA1 = HostDigestInfoDigestMethodType("SHA1")
|
||||
HostDigestInfoDigestMethodTypeMD5 = HostDigestInfoDigestMethodType("MD5")
|
||||
HostDigestInfoDigestMethodTypeSHA1 = HostDigestInfoDigestMethodType("SHA1")
|
||||
HostDigestInfoDigestMethodTypeMD5 = HostDigestInfoDigestMethodType("MD5")
|
||||
HostDigestInfoDigestMethodTypeSHA256 = HostDigestInfoDigestMethodType("SHA256")
|
||||
HostDigestInfoDigestMethodTypeSHA384 = HostDigestInfoDigestMethodType("SHA384")
|
||||
HostDigestInfoDigestMethodTypeSHA512 = HostDigestInfoDigestMethodType("SHA512")
|
||||
HostDigestInfoDigestMethodTypeSM3_256 = HostDigestInfoDigestMethodType("SM3_256")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -1261,6 +1342,7 @@ const (
|
||||
HostFileSystemVolumeFileSystemTypeVsan = HostFileSystemVolumeFileSystemType("vsan")
|
||||
HostFileSystemVolumeFileSystemTypeVFFS = HostFileSystemVolumeFileSystemType("VFFS")
|
||||
HostFileSystemVolumeFileSystemTypeVVOL = HostFileSystemVolumeFileSystemType("VVOL")
|
||||
HostFileSystemVolumeFileSystemTypePMEM = HostFileSystemVolumeFileSystemType("PMEM")
|
||||
HostFileSystemVolumeFileSystemTypeOTHER = HostFileSystemVolumeFileSystemType("OTHER")
|
||||
)
|
||||
|
||||
@ -1720,6 +1802,28 @@ func init() {
|
||||
t["HostProfileManagerAnswerFileStatus"] = reflect.TypeOf((*HostProfileManagerAnswerFileStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostProfileManagerCompositionResultResultElementStatus string
|
||||
|
||||
const (
|
||||
HostProfileManagerCompositionResultResultElementStatusSuccess = HostProfileManagerCompositionResultResultElementStatus("success")
|
||||
HostProfileManagerCompositionResultResultElementStatusError = HostProfileManagerCompositionResultResultElementStatus("error")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostProfileManagerCompositionResultResultElementStatus"] = reflect.TypeOf((*HostProfileManagerCompositionResultResultElementStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostProfileManagerCompositionValidationResultResultElementStatus string
|
||||
|
||||
const (
|
||||
HostProfileManagerCompositionValidationResultResultElementStatusSuccess = HostProfileManagerCompositionValidationResultResultElementStatus("success")
|
||||
HostProfileManagerCompositionValidationResultResultElementStatusError = HostProfileManagerCompositionValidationResultResultElementStatus("error")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostProfileManagerCompositionValidationResultResultElementStatus"] = reflect.TypeOf((*HostProfileManagerCompositionValidationResultResultElementStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostProfileManagerTaskListRequirement string
|
||||
|
||||
const (
|
||||
@ -1731,6 +1835,31 @@ func init() {
|
||||
t["HostProfileManagerTaskListRequirement"] = reflect.TypeOf((*HostProfileManagerTaskListRequirement)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostProfileValidationFailureInfoUpdateType string
|
||||
|
||||
const (
|
||||
HostProfileValidationFailureInfoUpdateTypeHostBased = HostProfileValidationFailureInfoUpdateType("HostBased")
|
||||
HostProfileValidationFailureInfoUpdateTypeImport = HostProfileValidationFailureInfoUpdateType("Import")
|
||||
HostProfileValidationFailureInfoUpdateTypeEdit = HostProfileValidationFailureInfoUpdateType("Edit")
|
||||
HostProfileValidationFailureInfoUpdateTypeCompose = HostProfileValidationFailureInfoUpdateType("Compose")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostProfileValidationFailureInfoUpdateType"] = reflect.TypeOf((*HostProfileValidationFailureInfoUpdateType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostProfileValidationState string
|
||||
|
||||
const (
|
||||
HostProfileValidationStateReady = HostProfileValidationState("Ready")
|
||||
HostProfileValidationStateRunning = HostProfileValidationState("Running")
|
||||
HostProfileValidationStateFailed = HostProfileValidationState("Failed")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostProfileValidationState"] = reflect.TypeOf((*HostProfileValidationState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostProtocolEndpointPEType string
|
||||
|
||||
const (
|
||||
@ -1856,6 +1985,32 @@ func init() {
|
||||
t["HostSystemPowerState"] = reflect.TypeOf((*HostSystemPowerState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostSystemRemediationStateState string
|
||||
|
||||
const (
|
||||
HostSystemRemediationStateStateRemediationReady = HostSystemRemediationStateState("remediationReady")
|
||||
HostSystemRemediationStateStatePrecheckRemediationRunning = HostSystemRemediationStateState("precheckRemediationRunning")
|
||||
HostSystemRemediationStateStatePrecheckRemediationComplete = HostSystemRemediationStateState("precheckRemediationComplete")
|
||||
HostSystemRemediationStateStatePrecheckRemediationFailed = HostSystemRemediationStateState("precheckRemediationFailed")
|
||||
HostSystemRemediationStateStateRemediationRunning = HostSystemRemediationStateState("remediationRunning")
|
||||
HostSystemRemediationStateStateRemediationFailed = HostSystemRemediationStateState("remediationFailed")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostSystemRemediationStateState"] = reflect.TypeOf((*HostSystemRemediationStateState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostTpmAttestationInfoAcceptanceStatus string
|
||||
|
||||
const (
|
||||
HostTpmAttestationInfoAcceptanceStatusNotAccepted = HostTpmAttestationInfoAcceptanceStatus("notAccepted")
|
||||
HostTpmAttestationInfoAcceptanceStatusAccepted = HostTpmAttestationInfoAcceptanceStatus("accepted")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostTpmAttestationInfoAcceptanceStatus"] = reflect.TypeOf((*HostTpmAttestationInfoAcceptanceStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostUnresolvedVmfsExtentUnresolvedReason string
|
||||
|
||||
const (
|
||||
@ -1907,6 +2062,17 @@ func init() {
|
||||
t["HostVmciAccessManagerMode"] = reflect.TypeOf((*HostVmciAccessManagerMode)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostVmfsVolumeUnmapBandwidthPolicy string
|
||||
|
||||
const (
|
||||
HostVmfsVolumeUnmapBandwidthPolicyFixed = HostVmfsVolumeUnmapBandwidthPolicy("fixed")
|
||||
HostVmfsVolumeUnmapBandwidthPolicyDynamic = HostVmfsVolumeUnmapBandwidthPolicy("dynamic")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HostVmfsVolumeUnmapBandwidthPolicy"] = reflect.TypeOf((*HostVmfsVolumeUnmapBandwidthPolicy)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HostVmfsVolumeUnmapPriority string
|
||||
|
||||
const (
|
||||
@ -1918,6 +2084,28 @@ func init() {
|
||||
t["HostVmfsVolumeUnmapPriority"] = reflect.TypeOf((*HostVmfsVolumeUnmapPriority)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HttpNfcLeaseManifestEntryChecksumType string
|
||||
|
||||
const (
|
||||
HttpNfcLeaseManifestEntryChecksumTypeSha1 = HttpNfcLeaseManifestEntryChecksumType("sha1")
|
||||
HttpNfcLeaseManifestEntryChecksumTypeSha256 = HttpNfcLeaseManifestEntryChecksumType("sha256")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HttpNfcLeaseManifestEntryChecksumType"] = reflect.TypeOf((*HttpNfcLeaseManifestEntryChecksumType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HttpNfcLeaseMode string
|
||||
|
||||
const (
|
||||
HttpNfcLeaseModePushOrGet = HttpNfcLeaseMode("pushOrGet")
|
||||
HttpNfcLeaseModePull = HttpNfcLeaseMode("pull")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["HttpNfcLeaseMode"] = reflect.TypeOf((*HttpNfcLeaseMode)(nil)).Elem()
|
||||
}
|
||||
|
||||
type HttpNfcLeaseState string
|
||||
|
||||
const (
|
||||
@ -2288,6 +2476,84 @@ func init() {
|
||||
t["NumVirtualCpusIncompatibleReason"] = reflect.TypeOf((*NumVirtualCpusIncompatibleReason)(nil)).Elem()
|
||||
}
|
||||
|
||||
type NvdimmInterleaveSetState string
|
||||
|
||||
const (
|
||||
NvdimmInterleaveSetStateInvalid = NvdimmInterleaveSetState("invalid")
|
||||
NvdimmInterleaveSetStateActive = NvdimmInterleaveSetState("active")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["NvdimmInterleaveSetState"] = reflect.TypeOf((*NvdimmInterleaveSetState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type NvdimmNamespaceHealthStatus string
|
||||
|
||||
const (
|
||||
NvdimmNamespaceHealthStatusNormal = NvdimmNamespaceHealthStatus("normal")
|
||||
NvdimmNamespaceHealthStatusMissing = NvdimmNamespaceHealthStatus("missing")
|
||||
NvdimmNamespaceHealthStatusLabelMissing = NvdimmNamespaceHealthStatus("labelMissing")
|
||||
NvdimmNamespaceHealthStatusInterleaveBroken = NvdimmNamespaceHealthStatus("interleaveBroken")
|
||||
NvdimmNamespaceHealthStatusLabelInconsistent = NvdimmNamespaceHealthStatus("labelInconsistent")
|
||||
NvdimmNamespaceHealthStatusBttCorrupt = NvdimmNamespaceHealthStatus("bttCorrupt")
|
||||
NvdimmNamespaceHealthStatusBadBlockSize = NvdimmNamespaceHealthStatus("badBlockSize")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["NvdimmNamespaceHealthStatus"] = reflect.TypeOf((*NvdimmNamespaceHealthStatus)(nil)).Elem()
|
||||
}
|
||||
|
||||
type NvdimmNamespaceState string
|
||||
|
||||
const (
|
||||
NvdimmNamespaceStateInvalid = NvdimmNamespaceState("invalid")
|
||||
NvdimmNamespaceStateNotInUse = NvdimmNamespaceState("notInUse")
|
||||
NvdimmNamespaceStateInUse = NvdimmNamespaceState("inUse")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["NvdimmNamespaceState"] = reflect.TypeOf((*NvdimmNamespaceState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type NvdimmNamespaceType string
|
||||
|
||||
const (
|
||||
NvdimmNamespaceTypeBlockNamespace = NvdimmNamespaceType("blockNamespace")
|
||||
NvdimmNamespaceTypePersistentNamespace = NvdimmNamespaceType("persistentNamespace")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["NvdimmNamespaceType"] = reflect.TypeOf((*NvdimmNamespaceType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type NvdimmNvdimmHealthInfoState string
|
||||
|
||||
const (
|
||||
NvdimmNvdimmHealthInfoStateNormal = NvdimmNvdimmHealthInfoState("normal")
|
||||
NvdimmNvdimmHealthInfoStateError = NvdimmNvdimmHealthInfoState("error")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["NvdimmNvdimmHealthInfoState"] = reflect.TypeOf((*NvdimmNvdimmHealthInfoState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type NvdimmRangeType string
|
||||
|
||||
const (
|
||||
NvdimmRangeTypeVolatileRange = NvdimmRangeType("volatileRange")
|
||||
NvdimmRangeTypePersistentRange = NvdimmRangeType("persistentRange")
|
||||
NvdimmRangeTypeControlRange = NvdimmRangeType("controlRange")
|
||||
NvdimmRangeTypeBlockRange = NvdimmRangeType("blockRange")
|
||||
NvdimmRangeTypeVolatileVirtualDiskRange = NvdimmRangeType("volatileVirtualDiskRange")
|
||||
NvdimmRangeTypeVolatileVirtualCDRange = NvdimmRangeType("volatileVirtualCDRange")
|
||||
NvdimmRangeTypePersistentVirtualDiskRange = NvdimmRangeType("persistentVirtualDiskRange")
|
||||
NvdimmRangeTypePersistentVirtualCDRange = NvdimmRangeType("persistentVirtualCDRange")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["NvdimmRangeType"] = reflect.TypeOf((*NvdimmRangeType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type ObjectUpdateKind string
|
||||
|
||||
const (
|
||||
@ -2491,6 +2757,20 @@ func init() {
|
||||
t["ProfileNumericComparator"] = reflect.TypeOf((*ProfileNumericComparator)(nil)).Elem()
|
||||
}
|
||||
|
||||
type ProfileParameterMetadataRelationType string
|
||||
|
||||
const (
|
||||
ProfileParameterMetadataRelationTypeDynamic_relation = ProfileParameterMetadataRelationType("dynamic_relation")
|
||||
ProfileParameterMetadataRelationTypeExtensible_relation = ProfileParameterMetadataRelationType("extensible_relation")
|
||||
ProfileParameterMetadataRelationTypeLocalizable_relation = ProfileParameterMetadataRelationType("localizable_relation")
|
||||
ProfileParameterMetadataRelationTypeStatic_relation = ProfileParameterMetadataRelationType("static_relation")
|
||||
ProfileParameterMetadataRelationTypeValidation_relation = ProfileParameterMetadataRelationType("validation_relation")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["ProfileParameterMetadataRelationType"] = reflect.TypeOf((*ProfileParameterMetadataRelationType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type PropertyChangeOp string
|
||||
|
||||
const (
|
||||
@ -2611,6 +2891,8 @@ const (
|
||||
ReplicationVmConfigFaultReasonForFaultReplicationNotEnabled = ReplicationVmConfigFaultReasonForFault("replicationNotEnabled")
|
||||
ReplicationVmConfigFaultReasonForFaultReplicationConfigurationFailed = ReplicationVmConfigFaultReasonForFault("replicationConfigurationFailed")
|
||||
ReplicationVmConfigFaultReasonForFaultEncryptedVm = ReplicationVmConfigFaultReasonForFault("encryptedVm")
|
||||
ReplicationVmConfigFaultReasonForFaultInvalidThumbprint = ReplicationVmConfigFaultReasonForFault("invalidThumbprint")
|
||||
ReplicationVmConfigFaultReasonForFaultIncompatibleDevice = ReplicationVmConfigFaultReasonForFault("incompatibleDevice")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -2628,6 +2910,7 @@ const (
|
||||
ReplicationVmFaultReasonForFaultInvalidState = ReplicationVmFaultReasonForFault("invalidState")
|
||||
ReplicationVmFaultReasonForFaultInvalidInstanceId = ReplicationVmFaultReasonForFault("invalidInstanceId")
|
||||
ReplicationVmFaultReasonForFaultCloseDiskError = ReplicationVmFaultReasonForFault("closeDiskError")
|
||||
ReplicationVmFaultReasonForFaultGroupExist = ReplicationVmFaultReasonForFault("groupExist")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -2688,10 +2971,11 @@ func init() {
|
||||
type ScsiDiskType string
|
||||
|
||||
const (
|
||||
ScsiDiskTypeNative512 = ScsiDiskType("native512")
|
||||
ScsiDiskTypeEmulated512 = ScsiDiskType("emulated512")
|
||||
ScsiDiskTypeNative4k = ScsiDiskType("native4k")
|
||||
ScsiDiskTypeUnknown = ScsiDiskType("unknown")
|
||||
ScsiDiskTypeNative512 = ScsiDiskType("native512")
|
||||
ScsiDiskTypeEmulated512 = ScsiDiskType("emulated512")
|
||||
ScsiDiskTypeNative4k = ScsiDiskType("native4k")
|
||||
ScsiDiskTypeSoftwareEmulated4k = ScsiDiskType("SoftwareEmulated4k")
|
||||
ScsiDiskTypeUnknown = ScsiDiskType("unknown")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -3266,6 +3550,18 @@ func init() {
|
||||
t["VirtualDeviceConfigSpecOperation"] = reflect.TypeOf((*VirtualDeviceConfigSpecOperation)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualDeviceConnectInfoMigrateConnectOp string
|
||||
|
||||
const (
|
||||
VirtualDeviceConnectInfoMigrateConnectOpConnect = VirtualDeviceConnectInfoMigrateConnectOp("connect")
|
||||
VirtualDeviceConnectInfoMigrateConnectOpDisconnect = VirtualDeviceConnectInfoMigrateConnectOp("disconnect")
|
||||
VirtualDeviceConnectInfoMigrateConnectOpUnset = VirtualDeviceConnectInfoMigrateConnectOp("unset")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["VirtualDeviceConnectInfoMigrateConnectOp"] = reflect.TypeOf((*VirtualDeviceConnectInfoMigrateConnectOp)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualDeviceConnectInfoStatus string
|
||||
|
||||
const (
|
||||
@ -3365,6 +3661,18 @@ func init() {
|
||||
t["VirtualDiskMode"] = reflect.TypeOf((*VirtualDiskMode)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualDiskRuleSpecRuleType string
|
||||
|
||||
const (
|
||||
VirtualDiskRuleSpecRuleTypeAffinity = VirtualDiskRuleSpecRuleType("affinity")
|
||||
VirtualDiskRuleSpecRuleTypeAntiAffinity = VirtualDiskRuleSpecRuleType("antiAffinity")
|
||||
VirtualDiskRuleSpecRuleTypeDisabled = VirtualDiskRuleSpecRuleType("disabled")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["VirtualDiskRuleSpecRuleType"] = reflect.TypeOf((*VirtualDiskRuleSpecRuleType)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualDiskSharing string
|
||||
|
||||
const (
|
||||
@ -3530,6 +3838,17 @@ func init() {
|
||||
t["VirtualMachineConnectionState"] = reflect.TypeOf((*VirtualMachineConnectionState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualMachineCryptoState string
|
||||
|
||||
const (
|
||||
VirtualMachineCryptoStateUnlocked = VirtualMachineCryptoState("unlocked")
|
||||
VirtualMachineCryptoStateLocked = VirtualMachineCryptoState("locked")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["VirtualMachineCryptoState"] = reflect.TypeOf((*VirtualMachineCryptoState)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualMachineDeviceRuntimeInfoVirtualEthernetCardRuntimeStateVmDirectPathGen2InactiveReasonOther string
|
||||
|
||||
const (
|
||||
@ -3725,6 +4044,10 @@ const (
|
||||
VirtualMachineGuestOsIdentifierWindowsHyperVGuest = VirtualMachineGuestOsIdentifier("windowsHyperVGuest")
|
||||
VirtualMachineGuestOsIdentifierFreebsdGuest = VirtualMachineGuestOsIdentifier("freebsdGuest")
|
||||
VirtualMachineGuestOsIdentifierFreebsd64Guest = VirtualMachineGuestOsIdentifier("freebsd64Guest")
|
||||
VirtualMachineGuestOsIdentifierFreebsd11Guest = VirtualMachineGuestOsIdentifier("freebsd11Guest")
|
||||
VirtualMachineGuestOsIdentifierFreebsd11_64Guest = VirtualMachineGuestOsIdentifier("freebsd11_64Guest")
|
||||
VirtualMachineGuestOsIdentifierFreebsd12Guest = VirtualMachineGuestOsIdentifier("freebsd12Guest")
|
||||
VirtualMachineGuestOsIdentifierFreebsd12_64Guest = VirtualMachineGuestOsIdentifier("freebsd12_64Guest")
|
||||
VirtualMachineGuestOsIdentifierRedhatGuest = VirtualMachineGuestOsIdentifier("redhatGuest")
|
||||
VirtualMachineGuestOsIdentifierRhel2Guest = VirtualMachineGuestOsIdentifier("rhel2Guest")
|
||||
VirtualMachineGuestOsIdentifierRhel3Guest = VirtualMachineGuestOsIdentifier("rhel3Guest")
|
||||
@ -3737,18 +4060,21 @@ const (
|
||||
VirtualMachineGuestOsIdentifierRhel6_64Guest = VirtualMachineGuestOsIdentifier("rhel6_64Guest")
|
||||
VirtualMachineGuestOsIdentifierRhel7Guest = VirtualMachineGuestOsIdentifier("rhel7Guest")
|
||||
VirtualMachineGuestOsIdentifierRhel7_64Guest = VirtualMachineGuestOsIdentifier("rhel7_64Guest")
|
||||
VirtualMachineGuestOsIdentifierRhel8_64Guest = VirtualMachineGuestOsIdentifier("rhel8_64Guest")
|
||||
VirtualMachineGuestOsIdentifierCentosGuest = VirtualMachineGuestOsIdentifier("centosGuest")
|
||||
VirtualMachineGuestOsIdentifierCentos64Guest = VirtualMachineGuestOsIdentifier("centos64Guest")
|
||||
VirtualMachineGuestOsIdentifierCentos6Guest = VirtualMachineGuestOsIdentifier("centos6Guest")
|
||||
VirtualMachineGuestOsIdentifierCentos6_64Guest = VirtualMachineGuestOsIdentifier("centos6_64Guest")
|
||||
VirtualMachineGuestOsIdentifierCentos7Guest = VirtualMachineGuestOsIdentifier("centos7Guest")
|
||||
VirtualMachineGuestOsIdentifierCentos7_64Guest = VirtualMachineGuestOsIdentifier("centos7_64Guest")
|
||||
VirtualMachineGuestOsIdentifierCentos8_64Guest = VirtualMachineGuestOsIdentifier("centos8_64Guest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinuxGuest = VirtualMachineGuestOsIdentifier("oracleLinuxGuest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinux64Guest = VirtualMachineGuestOsIdentifier("oracleLinux64Guest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinux6Guest = VirtualMachineGuestOsIdentifier("oracleLinux6Guest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinux6_64Guest = VirtualMachineGuestOsIdentifier("oracleLinux6_64Guest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinux7Guest = VirtualMachineGuestOsIdentifier("oracleLinux7Guest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinux7_64Guest = VirtualMachineGuestOsIdentifier("oracleLinux7_64Guest")
|
||||
VirtualMachineGuestOsIdentifierOracleLinux8_64Guest = VirtualMachineGuestOsIdentifier("oracleLinux8_64Guest")
|
||||
VirtualMachineGuestOsIdentifierSuseGuest = VirtualMachineGuestOsIdentifier("suseGuest")
|
||||
VirtualMachineGuestOsIdentifierSuse64Guest = VirtualMachineGuestOsIdentifier("suse64Guest")
|
||||
VirtualMachineGuestOsIdentifierSlesGuest = VirtualMachineGuestOsIdentifier("slesGuest")
|
||||
@ -3759,6 +4085,7 @@ const (
|
||||
VirtualMachineGuestOsIdentifierSles11_64Guest = VirtualMachineGuestOsIdentifier("sles11_64Guest")
|
||||
VirtualMachineGuestOsIdentifierSles12Guest = VirtualMachineGuestOsIdentifier("sles12Guest")
|
||||
VirtualMachineGuestOsIdentifierSles12_64Guest = VirtualMachineGuestOsIdentifier("sles12_64Guest")
|
||||
VirtualMachineGuestOsIdentifierSles15_64Guest = VirtualMachineGuestOsIdentifier("sles15_64Guest")
|
||||
VirtualMachineGuestOsIdentifierNld9Guest = VirtualMachineGuestOsIdentifier("nld9Guest")
|
||||
VirtualMachineGuestOsIdentifierOesGuest = VirtualMachineGuestOsIdentifier("oesGuest")
|
||||
VirtualMachineGuestOsIdentifierSjdsGuest = VirtualMachineGuestOsIdentifier("sjdsGuest")
|
||||
@ -3789,6 +4116,7 @@ const (
|
||||
VirtualMachineGuestOsIdentifierAsianux4_64Guest = VirtualMachineGuestOsIdentifier("asianux4_64Guest")
|
||||
VirtualMachineGuestOsIdentifierAsianux5_64Guest = VirtualMachineGuestOsIdentifier("asianux5_64Guest")
|
||||
VirtualMachineGuestOsIdentifierAsianux7_64Guest = VirtualMachineGuestOsIdentifier("asianux7_64Guest")
|
||||
VirtualMachineGuestOsIdentifierAsianux8_64Guest = VirtualMachineGuestOsIdentifier("asianux8_64Guest")
|
||||
VirtualMachineGuestOsIdentifierOpensuseGuest = VirtualMachineGuestOsIdentifier("opensuseGuest")
|
||||
VirtualMachineGuestOsIdentifierOpensuse64Guest = VirtualMachineGuestOsIdentifier("opensuse64Guest")
|
||||
VirtualMachineGuestOsIdentifierFedoraGuest = VirtualMachineGuestOsIdentifier("fedoraGuest")
|
||||
@ -3799,10 +4127,12 @@ const (
|
||||
VirtualMachineGuestOsIdentifierOther26xLinuxGuest = VirtualMachineGuestOsIdentifier("other26xLinuxGuest")
|
||||
VirtualMachineGuestOsIdentifierOtherLinuxGuest = VirtualMachineGuestOsIdentifier("otherLinuxGuest")
|
||||
VirtualMachineGuestOsIdentifierOther3xLinuxGuest = VirtualMachineGuestOsIdentifier("other3xLinuxGuest")
|
||||
VirtualMachineGuestOsIdentifierOther4xLinuxGuest = VirtualMachineGuestOsIdentifier("other4xLinuxGuest")
|
||||
VirtualMachineGuestOsIdentifierGenericLinuxGuest = VirtualMachineGuestOsIdentifier("genericLinuxGuest")
|
||||
VirtualMachineGuestOsIdentifierOther24xLinux64Guest = VirtualMachineGuestOsIdentifier("other24xLinux64Guest")
|
||||
VirtualMachineGuestOsIdentifierOther26xLinux64Guest = VirtualMachineGuestOsIdentifier("other26xLinux64Guest")
|
||||
VirtualMachineGuestOsIdentifierOther3xLinux64Guest = VirtualMachineGuestOsIdentifier("other3xLinux64Guest")
|
||||
VirtualMachineGuestOsIdentifierOther4xLinux64Guest = VirtualMachineGuestOsIdentifier("other4xLinux64Guest")
|
||||
VirtualMachineGuestOsIdentifierOtherLinux64Guest = VirtualMachineGuestOsIdentifier("otherLinux64Guest")
|
||||
VirtualMachineGuestOsIdentifierSolaris6Guest = VirtualMachineGuestOsIdentifier("solaris6Guest")
|
||||
VirtualMachineGuestOsIdentifierSolaris7Guest = VirtualMachineGuestOsIdentifier("solaris7Guest")
|
||||
@ -3831,6 +4161,8 @@ const (
|
||||
VirtualMachineGuestOsIdentifierDarwin14_64Guest = VirtualMachineGuestOsIdentifier("darwin14_64Guest")
|
||||
VirtualMachineGuestOsIdentifierDarwin15_64Guest = VirtualMachineGuestOsIdentifier("darwin15_64Guest")
|
||||
VirtualMachineGuestOsIdentifierDarwin16_64Guest = VirtualMachineGuestOsIdentifier("darwin16_64Guest")
|
||||
VirtualMachineGuestOsIdentifierDarwin17_64Guest = VirtualMachineGuestOsIdentifier("darwin17_64Guest")
|
||||
VirtualMachineGuestOsIdentifierDarwin18_64Guest = VirtualMachineGuestOsIdentifier("darwin18_64Guest")
|
||||
VirtualMachineGuestOsIdentifierVmkernelGuest = VirtualMachineGuestOsIdentifier("vmkernelGuest")
|
||||
VirtualMachineGuestOsIdentifierVmkernel5Guest = VirtualMachineGuestOsIdentifier("vmkernel5Guest")
|
||||
VirtualMachineGuestOsIdentifierVmkernel6Guest = VirtualMachineGuestOsIdentifier("vmkernel6Guest")
|
||||
@ -4051,10 +4383,11 @@ func init() {
|
||||
type VirtualMachineTicketType string
|
||||
|
||||
const (
|
||||
VirtualMachineTicketTypeMks = VirtualMachineTicketType("mks")
|
||||
VirtualMachineTicketTypeDevice = VirtualMachineTicketType("device")
|
||||
VirtualMachineTicketTypeGuestControl = VirtualMachineTicketType("guestControl")
|
||||
VirtualMachineTicketTypeWebmks = VirtualMachineTicketType("webmks")
|
||||
VirtualMachineTicketTypeMks = VirtualMachineTicketType("mks")
|
||||
VirtualMachineTicketTypeDevice = VirtualMachineTicketType("device")
|
||||
VirtualMachineTicketTypeGuestControl = VirtualMachineTicketType("guestControl")
|
||||
VirtualMachineTicketTypeWebmks = VirtualMachineTicketType("webmks")
|
||||
VirtualMachineTicketTypeGuestIntegrity = VirtualMachineTicketType("guestIntegrity")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -4262,6 +4595,17 @@ func init() {
|
||||
t["VirtualSerialPortEndPoint"] = reflect.TypeOf((*VirtualSerialPortEndPoint)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VirtualVmxnet3VrdmaOptionDeviceProtocols string
|
||||
|
||||
const (
|
||||
VirtualVmxnet3VrdmaOptionDeviceProtocolsRocev1 = VirtualVmxnet3VrdmaOptionDeviceProtocols("rocev1")
|
||||
VirtualVmxnet3VrdmaOptionDeviceProtocolsRocev2 = VirtualVmxnet3VrdmaOptionDeviceProtocols("rocev2")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["VirtualVmxnet3VrdmaOptionDeviceProtocols"] = reflect.TypeOf((*VirtualVmxnet3VrdmaOptionDeviceProtocols)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VmDasBeingResetEventReasonCode string
|
||||
|
||||
const (
|
||||
@ -4319,6 +4663,8 @@ const (
|
||||
VmFaultToleranceConfigIssueReasonForIssueCpuHwmmuUnsupported = VmFaultToleranceConfigIssueReasonForIssue("cpuHwmmuUnsupported")
|
||||
VmFaultToleranceConfigIssueReasonForIssueCpuHvDisabled = VmFaultToleranceConfigIssueReasonForIssue("cpuHvDisabled")
|
||||
VmFaultToleranceConfigIssueReasonForIssueHasEFIFirmware = VmFaultToleranceConfigIssueReasonForIssue("hasEFIFirmware")
|
||||
VmFaultToleranceConfigIssueReasonForIssueTooManyVCPUs = VmFaultToleranceConfigIssueReasonForIssue("tooManyVCPUs")
|
||||
VmFaultToleranceConfigIssueReasonForIssueTooMuchMemory = VmFaultToleranceConfigIssueReasonForIssue("tooMuchMemory")
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -4464,3 +4810,15 @@ const (
|
||||
func init() {
|
||||
t["WillLoseHAProtectionResolution"] = reflect.TypeOf((*WillLoseHAProtectionResolution)(nil)).Elem()
|
||||
}
|
||||
|
||||
type VslmVStorageObjectControlFlag string
|
||||
|
||||
const (
|
||||
VslmVStorageObjectControlFlagKeepAfterDeleteVm = VslmVStorageObjectControlFlag("keepAfterDeleteVm")
|
||||
VslmVStorageObjectControlFlagDisableRelocation = VslmVStorageObjectControlFlag("disableRelocation")
|
||||
VslmVStorageObjectControlFlagEnableChangedBlockTracking = VslmVStorageObjectControlFlag("enableChangedBlockTracking")
|
||||
)
|
||||
|
||||
func init() {
|
||||
t["vslmVStorageObjectControlFlag"] = reflect.TypeOf((*VslmVStorageObjectControlFlag)(nil)).Elem()
|
||||
}
|
||||
|
2
vendor/github.com/vmware/govmomi/vim25/types/if.go
generated
vendored
2
vendor/github.com/vmware/govmomi/vim25/types/if.go
generated
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
|
||||
Copyright (c) 2014-2018 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
2741
vendor/github.com/vmware/govmomi/vim25/types/types.go
generated
vendored
2741
vendor/github.com/vmware/govmomi/vim25/types/types.go
generated
vendored
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user