Uplift go-redfish version

Newer version has the redfish client support required for ilo5

Change-Id: Ia601f008c192f39abe14cf4100420937b2c32691
Signed-off-by: James Gu <james.gu@microsoft.com>
This commit is contained in:
James Gu 2021-08-04 22:13:53 +00:00 committed by James Gu
parent cde9648718
commit 1b93c84e54
9 changed files with 551 additions and 349 deletions

6
go.mod
View File

@ -22,7 +22,7 @@ require (
github.com/opencontainers/image-spec v1.0.1
github.com/spf13/cobra v1.1.1
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.6.1
github.com/stretchr/testify v1.7.0
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
@ -32,8 +32,8 @@ require (
k8s.io/cli-runtime v0.21.1
k8s.io/client-go v0.21.1
k8s.io/kubectl v0.21.1
opendev.org/airship/go-redfish v0.0.0-20200318103738-db034d1d753a
opendev.org/airship/go-redfish/client v0.0.0-20200318103738-db034d1d753a
opendev.org/airship/go-redfish v0.0.0-20211004183611-3c3d7c6ba009
opendev.org/airship/go-redfish/client v0.0.0-20211004183611-3c3d7c6ba009
sigs.k8s.io/cli-utils v0.21.1
sigs.k8s.io/controller-runtime v0.8.3
sigs.k8s.io/kustomize/api v0.8.11

94
go.sum
View File

@ -8,20 +8,30 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
@ -88,7 +98,6 @@ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@ -114,6 +123,7 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/containerd/containerd v1.4.1 h1:pASeJT3R3YyVn+94qEPk0SnU1OQ20Jd/T+SPKy9xehY=
github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
@ -165,7 +175,9 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
@ -283,12 +295,15 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@ -308,18 +323,23 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
@ -414,10 +434,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb h1:w1g9wNDIE/pHSTmAaUhv4TZQuPBS6GV3mMz5hkgziIU=
github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4=
@ -588,8 +605,9 @@ github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnR
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@ -605,7 +623,9 @@ github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSf
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI=
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@ -619,6 +639,7 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
@ -706,6 +727,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@ -717,8 +739,14 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@ -728,14 +756,17 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99 h1:5vD4XjIc0X5+kHZjx4UecYdjA6mJo+XXNoaW0EjU5Os=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -777,9 +808,15 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -850,10 +887,20 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -872,7 +919,13 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@ -897,8 +950,18 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8=
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@ -907,10 +970,15 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@ -966,6 +1034,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
k8s.io/api v0.18.10/go.mod h1:xWtwPX1v47j5RTncmlMFGCx8b0avh+nP8OgZZ9hjo3M=
k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
@ -1036,10 +1105,11 @@ k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ=
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
opendev.org/airship/go-redfish v0.0.0-20200318103738-db034d1d753a h1:4ggAMTwpfu/w3ZXOIJ9tfYF37JIYn+eNCA4O10NduZ0=
opendev.org/airship/go-redfish v0.0.0-20200318103738-db034d1d753a/go.mod h1:FEjYcb3bYBWGpQIqtvVM0NrT5eyjlCOCj5JNf4lI+6s=
opendev.org/airship/go-redfish/client v0.0.0-20200318103738-db034d1d753a h1:S1dmsP5Cc6OQjAd6OgIKMcNPBiGjh5TDbijVjNE/VGU=
opendev.org/airship/go-redfish/client v0.0.0-20200318103738-db034d1d753a/go.mod h1:s0hwuUpBsRXOrhN0NR+fNVivXGyWgHKpqtyq7qYjpew=
opendev.org/airship/go-redfish v0.0.0-20211004183611-3c3d7c6ba009 h1:7hSqsvwAjZYc7LTQCR6RCr9XIxIFNUeblqL9zOdpB1s=
opendev.org/airship/go-redfish v0.0.0-20211004183611-3c3d7c6ba009/go.mod h1:wS1HCbABvNuM6MUiEFsX+vp+GOR8D2/lcq2PaKYear0=
opendev.org/airship/go-redfish/client v0.0.0-20210505141832-c442eb5bcb3e/go.mod h1:I3eEaz4jvG/tlmHdk3dBiZ1HhBxpj+qL3k9Ey1C4BW4=
opendev.org/airship/go-redfish/client v0.0.0-20211004183611-3c3d7c6ba009 h1:WCEaHgxrJmq2yjcIC6KNUihmHXNRXWcZwchQGm+oCn0=
opendev.org/airship/go-redfish/client v0.0.0-20211004183611-3c3d7c6ba009/go.mod h1:Ljb94G9G5gP6nHAzYIrZfQOiHNSczfWpgJ9D8jLNWO4=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

View File

@ -68,12 +68,13 @@ func (c *Client) EjectVirtualMedia(ctx context.Context) error {
ctx = SetAuth(ctx, c.username, c.password)
waitForEjectMedia := func(managerID string, mediaID string) error {
for retry := 0; retry < c.systemActionRetries; retry++ {
vMediaMgr, httpResp, err := c.RedfishAPI.GetManagerVirtualMedia(ctx, managerID, mediaID)
getMediaReq := c.RedfishAPI.GetManagerVirtualMedia(ctx, managerID, mediaID)
vMediaMgr, httpResp, err := c.RedfishAPI.GetManagerVirtualMediaExecute(getMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
if *vMediaMgr.Inserted == false {
if !vMediaMgr.GetInserted() {
log.Debugf("Successfully ejected virtual media.")
return nil
}
@ -87,25 +88,28 @@ func (c *Client) EjectVirtualMedia(ctx context.Context) error {
return err
}
mediaCollection, httpResp, err := c.RedfishAPI.ListManagerVirtualMedia(ctx, managerID)
listMediaReq := c.RedfishAPI.ListManagerVirtualMedia(ctx, managerID)
mediaCollection, httpResp, err := c.RedfishAPI.ListManagerVirtualMediaExecute(listMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
// Walk all virtual media devices and eject if inserted
for _, mediaURI := range mediaCollection.Members {
mediaID := GetResourceIDFromURL(mediaURI.OdataId)
mediaID := GetResourceIDFromURL(*mediaURI.OdataId)
vMediaMgr, httpResp, err := c.RedfishAPI.GetManagerVirtualMedia(ctx, managerID, mediaID)
getMediaReq := c.RedfishAPI.GetManagerVirtualMedia(ctx, managerID, mediaID)
vMediaMgr, httpResp, err := c.RedfishAPI.GetManagerVirtualMediaExecute(getMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
if *vMediaMgr.Inserted == true {
if vMediaMgr.GetInserted() {
log.Debugf("'%s' has virtual media inserted. Attempting to eject.", vMediaMgr.Name)
var emptyBody map[string]interface{}
_, httpResp, err = c.RedfishAPI.EjectVirtualMedia(ctx, managerID, mediaID, emptyBody)
ejectMediaReq := c.RedfishAPI.EjectVirtualMedia(ctx, managerID, mediaID).Body(emptyBody)
_, httpResp, err = c.RedfishAPI.EjectVirtualMediaExecute(ejectMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
@ -123,11 +127,12 @@ func (c *Client) EjectVirtualMedia(ctx context.Context) error {
func (c *Client) RebootSystem(ctx context.Context) error {
log.Debugf("Rebooting node '%s': powering off.", c.nodeID)
ctx = SetAuth(ctx, c.username, c.password)
resetReq := redfishClient.ResetRequestBody{}
resetReq := redfishClient.NewResetRequestBodyWithDefaults()
// Send PowerOff request
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
_, httpResp, err := c.RedfishAPI.ResetSystem(ctx, c.nodeID, resetReq)
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
resetSystemReq := c.RedfishAPI.ResetSystem(ctx, c.nodeID).ResetRequestBody(*resetReq)
_, httpResp, err := c.RedfishAPI.ResetSystemExecute(resetSystemReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
log.Debugf("Failed to reboot node '%s': shutdown failure.", c.nodeID)
return err
@ -141,8 +146,9 @@ func (c *Client) RebootSystem(ctx context.Context) error {
log.Debugf("Rebooting node '%s': powering on.", c.nodeID)
// Send PowerOn request
resetReq.ResetType = redfishClient.RESETTYPE_ON
_, httpResp, err = c.RedfishAPI.ResetSystem(ctx, c.nodeID, resetReq)
resetReq.ResetType = redfishClient.RESETTYPE_ON.Ptr()
resetSystemReq = c.RedfishAPI.ResetSystem(ctx, c.nodeID).ResetRequestBody(*resetReq)
_, httpResp, err = c.RedfishAPI.ResetSystemExecute(resetSystemReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
log.Debugf("Failed to reboot node '%s': startup failure.", c.nodeID)
return err
@ -164,18 +170,23 @@ func (c *Client) SetBootSourceByType(ctx context.Context) error {
log.Debugf("Setting boot device to '%s'.", vMediaType)
// Retrieve system information, containing available boot sources
system, _, err := c.RedfishAPI.GetSystem(ctx, c.nodeID)
systemReq := c.RedfishAPI.GetSystem(ctx, c.nodeID)
system, _, err := c.RedfishAPI.GetSystemExecute(systemReq)
if err != nil {
return ErrRedfishClient{Message: fmt.Sprintf("Get System[%s] failed with err: %v", c.nodeID, err)}
}
allowableValues := system.Boot.BootSourceOverrideTargetRedfishAllowableValues
for _, bootSource := range allowableValues {
if strings.EqualFold(string(bootSource), vMediaType) {
boot := system.GetBoot()
allowableValues := boot.GetBootSourceOverrideTargetRedfishAllowableValues()
for i := range allowableValues {
if strings.EqualFold(string(allowableValues[i]), vMediaType) {
/* set boot source */
systemReq := redfishClient.ComputerSystem{}
systemReq.Boot.BootSourceOverrideTarget = bootSource
_, httpResp, err := c.RedfishAPI.SetSystem(ctx, c.nodeID, systemReq)
systemReq.SetBoot(redfishClient.Boot{
BootSourceOverrideTarget: &allowableValues[i],
})
setSystemReq := c.RedfishAPI.SetSystem(ctx, c.nodeID).ComputerSystem(systemReq)
_, httpResp, err := c.RedfishAPI.SetSystemExecute(setSystemReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
@ -212,8 +223,10 @@ func (c *Client) SetVirtualMedia(ctx context.Context, isoPath string) error {
// Insert media
vMediaReq := redfishClient.InsertMediaRequestBody{}
vMediaReq.Image = isoPath
vMediaReq.Inserted = true
_, httpResp, err := c.RedfishAPI.InsertVirtualMedia(ctx, managerID, vMediaID, vMediaReq)
vMediaReq.SetInserted(true)
insertMediaReq := c.RedfishAPI.InsertVirtualMedia(ctx, managerID, vMediaID).InsertMediaRequestBody(vMediaReq)
_, httpResp, err := c.RedfishAPI.InsertVirtualMediaExecute(insertMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
@ -227,9 +240,16 @@ func (c *Client) SetVirtualMedia(ctx context.Context, isoPath string) error {
func (c *Client) SystemPowerOff(ctx context.Context) error {
ctx = SetAuth(ctx, c.username, c.password)
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF.Ptr()
_, httpResp, err := c.RedfishAPI.ResetSystem(ctx, c.nodeID, resetReq)
resetSystemReq := c.RedfishAPI.ResetSystem(ctx, c.nodeID).ResetRequestBody(resetReq)
_, httpResp, err := c.RedfishAPI.ResetSystemExecute(resetSystemReq)
// if already powered off, a status conflict message is returned but we are good to go
if httpResp != nil && httpResp.StatusCode == http.StatusConflict {
return nil
}
//screen for any errors
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
@ -240,10 +260,15 @@ func (c *Client) SystemPowerOff(ctx context.Context) error {
// SystemPowerOn powers on a host.
func (c *Client) SystemPowerOn(ctx context.Context) error {
ctx = SetAuth(ctx, c.username, c.password)
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_ON
resetReq := redfishClient.NewResetRequestBodyWithDefaults()
resetReq.SetResetType(redfishClient.RESETTYPE_ON)
resetSystemReq := c.RedfishAPI.ResetSystem(ctx, c.nodeID).ResetRequestBody(*resetReq)
log.Printf("reset system request: %+v", resetSystemReq)
_, httpResp, err := c.RedfishAPI.ResetSystemExecute(resetSystemReq)
_, httpResp, err := c.RedfishAPI.ResetSystem(ctx, c.nodeID, resetReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
@ -254,12 +279,19 @@ func (c *Client) SystemPowerOn(ctx context.Context) error {
// SystemPowerStatus retrieves the power status of a host as a human-readable string.
func (c *Client) SystemPowerStatus(ctx context.Context) (power.Status, error) {
ctx = SetAuth(ctx, c.username, c.password)
computerSystem, httpResp, err := c.RedfishAPI.GetSystem(ctx, c.nodeID)
systemReq := c.RedfishAPI.GetSystem(ctx, c.nodeID)
computerSystem, httpResp, err := c.RedfishAPI.GetSystemExecute(systemReq)
if screenErr := ScreenRedfishError(httpResp, err); screenErr != nil {
return power.StatusUnknown, screenErr
}
switch computerSystem.PowerState {
if computerSystem.PowerState == nil {
log.Printf("csystem power: %+v", computerSystem)
return power.StatusUnknown, nil
}
switch *computerSystem.PowerState {
case redfishClient.POWERSTATE_ON:
return power.StatusOn, nil
case redfishClient.POWERSTATE_OFF:
@ -269,6 +301,7 @@ func (c *Client) SystemPowerStatus(ctx context.Context) (power.Status, error) {
case redfishClient.POWERSTATE_POWERING_OFF:
return power.StatusPoweringOff, nil
default:
log.Printf("csystem power: %+v", computerSystem.PowerState)
return power.StatusUnknown, nil
}
}
@ -288,10 +321,10 @@ func RemoteDirect(ctx context.Context, isoURL, redfishURL string, c ifc.Client)
return err
}
// Power on node if it is off
if powerStatus != power.StatusOn {
log.Debugf("Ephemeral node has power status '%s'. Attempting to power on.", powerStatus.String())
if err = c.SystemPowerOn(ctx); err != nil {
// Power off node if it is on
if powerStatus != power.StatusOff {
log.Debugf("Ephemeral node has power status '%s'. Attempting to power off.", powerStatus.String())
if err = c.SystemPowerOff(ctx); err != nil {
return err
}
}
@ -311,7 +344,7 @@ func RemoteDirect(ctx context.Context, isoURL, redfishURL string, c ifc.Client)
return err
}
err = c.RebootSystem(ctx)
err = c.SystemPowerOn(ctx)
if err != nil {
return err
}
@ -339,7 +372,11 @@ func NewClient(redfishURL string,
}
cfg := &redfishClient.Configuration{
BasePath: basePath,
Servers: redfishClient.ServerConfigurations{
{
URL: basePath,
},
},
DefaultHeader: make(map[string]string),
UserAgent: headerUserAgent,
}
@ -350,7 +387,7 @@ func NewClient(redfishURL string,
// normally get when not overriding the transport
defaultTransportCopy := http.DefaultTransport.(*http.Transport) //nolint:errcheck
transport := defaultTransportCopy.Clone()
transport.DisableKeepAlives = true
if insecure {
transport.TLSClientConfig = &tls.Config{
InsecureSkipVerify: true, //nolint:gosec

View File

@ -21,7 +21,6 @@ import (
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
redfishMocks "opendev.org/airship/go-redfish/api/mocks"
@ -88,42 +87,45 @@ func TestEjectVirtualMedia(t *testing.T) {
assert.NoError(t, err)
client.nodeID = nodeID
client.RedfishAPI = m
ctx := SetAuth(context.Background(), "", "")
// Mark CD and DVD test media as inserted
inserted := true
testMediaCD := testutil.GetVirtualMedia([]string{"CD"})
testMediaCD.Inserted = &inserted
testMediaCD.SetInserted(inserted)
testMediaDVD := testutil.GetVirtualMedia([]string{"DVD"})
testMediaDVD.Inserted = &inserted
testMediaDVD.SetInserted(inserted)
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(testutil.GetTestSystem(), httpResp, nil).Times(1)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd", "DVD", "Floppy"}), httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, testutil.GetTestSystem(), httpResp, nil, 1)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd", "DVD", "Floppy"}), httpResp, nil, 1)
// Eject CD
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMediaCD, httpResp, nil)
m.On("EjectVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Times(1).
Return(redfishClient.RedfishError{}, httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"Cd"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID,
"Cd", testMediaCD, httpResp, nil)
testutil.MockOnEjectVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"Cd"}), httpResp, nil)
// Eject DVD and simulate two retries
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "DVD").Times(1).
Return(testMediaDVD, httpResp, nil)
m.On("EjectVirtualMedia", ctx, testutil.ManagerID, "DVD", mock.Anything).Times(1).
Return(redfishClient.RedfishError{}, httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "DVD").Times(1).
Return(testMediaDVD, httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "DVD").Times(1).
Return(testutil.GetVirtualMedia([]string{"DVD"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID,
"DVD", testMediaDVD, httpResp, nil)
testutil.MockOnEjectVirtualMedia(ctx, m, testutil.ManagerID, "DVD",
redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID,
"DVD", testMediaDVD, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID,
"DVD", testutil.GetVirtualMedia([]string{"DVD"}), httpResp, nil)
// Floppy is not inserted, so it is not ejected
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Floppy").Times(1).
Return(testutil.GetVirtualMedia([]string{"Floppy"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID,
"Floppy", testutil.GetVirtualMedia([]string{"Floppy"}), httpResp, nil)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -148,22 +150,21 @@ func TestEjectVirtualMediaRetriesExceeded(t *testing.T) {
// Mark test media as inserted
inserted := true
testMedia := testutil.GetVirtualMedia([]string{"CD"})
testMedia.Inserted = &inserted
testMedia.SetInserted(inserted)
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(testutil.GetTestSystem(), httpResp, nil)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").
Return(testMedia, httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, testutil.GetTestSystem(), httpResp, nil, 1)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd", testMedia, httpResp, nil)
// Verify retry logic
m.On("EjectVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).
Return(redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnEjectVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, nil)
// Media still inserted on retry. Since retries are 1, this causes failure.
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").
Return(testMedia, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd", testMedia, httpResp, nil)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -186,19 +187,20 @@ func TestRebootSystem(t *testing.T) {
// Mock redfish shutdown and status requests
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
httpResp := &http.Response{StatusCode: 200}
m.On("ResetSystem", ctx, client.nodeID, resetReq).Times(1).Return(redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &resetReq, redfishClient.RedfishError{}, httpResp, nil)
m.On("GetSystem", ctx, client.nodeID).Times(1).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_OFF}, httpResp, nil)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem, httpResp, nil, 1)
// Mock redfish startup and status requests
resetReq.ResetType = redfishClient.RESETTYPE_ON
m.On("ResetSystem", ctx, client.nodeID, resetReq).Times(1).Return(redfishClient.RedfishError{}, httpResp, nil)
m.On("GetSystem", ctx, client.nodeID).Times(1).
Return(redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_ON}, httpResp, nil)
resetReq.SetResetType(redfishClient.RESETTYPE_ON)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &resetReq, redfishClient.RedfishError{}, httpResp, nil)
computerSystem = redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem, httpResp, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -220,10 +222,10 @@ func TestRebootSystemShutdownError(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
// Mock redfish shutdown request for failure
m.On("ResetSystem", ctx, client.nodeID, resetReq).Times(1).Return(redfishClient.RedfishError{},
testutil.MockOnResetSystem(ctx, m, client.nodeID, &resetReq, redfishClient.RedfishError{},
&http.Response{StatusCode: 401}, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client
@ -247,21 +249,23 @@ func TestRebootSystemStartupError(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
// Mock redfish shutdown request
m.On("ResetSystem", ctx, client.nodeID, resetReq).Times(1).Return(redfishClient.RedfishError{},
testutil.MockOnResetSystem(ctx, m, client.nodeID, &resetReq, redfishClient.RedfishError{},
&http.Response{StatusCode: 200}, nil)
m.On("GetSystem", ctx, client.nodeID).Times(1).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_OFF},
&http.Response{StatusCode: 200}, nil)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, nil, 1)
resetOnReq := redfishClient.ResetRequestBody{}
resetOnReq.ResetType = redfishClient.RESETTYPE_ON
resetOnReq.SetResetType(redfishClient.RESETTYPE_ON)
// Mock redfish startup request for failure
m.On("ResetSystem", ctx, client.nodeID, resetOnReq).Times(1).Return(redfishClient.RedfishError{},
testutil.MockOnResetSystem(ctx, m, client.nodeID, &resetOnReq, redfishClient.RedfishError{},
&http.Response{StatusCode: 401}, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client
@ -285,14 +289,13 @@ func TestRebootSystemTimeout(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
m.On("ResetSystem", ctx, client.nodeID, resetReq).
Times(1).
Return(redfishClient.RedfishError{}, &http.Response{StatusCode: 200}, nil)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &resetReq, redfishClient.RedfishError{},
&http.Response{StatusCode: 200}, nil)
m.On("GetSystem", ctx, client.nodeID).
Return(redfishClient.ComputerSystem{}, &http.Response{StatusCode: 200}, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, redfishClient.ComputerSystem{},
&http.Response{StatusCode: 200}, nil, -1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -314,8 +317,8 @@ func TestSetBootSourceByTypeGetSystemError(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
// Mock redfish get system request
m.On("GetSystem", ctx, client.NodeID()).Times(1).Return(redfishClient.ComputerSystem{},
&http.Response{StatusCode: 500}, redfishClient.GenericOpenAPIError{})
testutil.MockOnGetSystem(ctx, m, client.nodeID, redfishClient.ComputerSystem{},
&http.Response{StatusCode: 500}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -337,13 +340,18 @@ func TestSetBootSourceByTypeSetSystemError(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(testutil.GetTestSystem(), httpResp, nil)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
m.On("SetSystem", ctx, client.nodeID, mock.Anything).Times(1).Return(
redfishClient.ComputerSystem{}, &http.Response{StatusCode: 401}, redfishClient.GenericOpenAPIError{})
testutil.MockOnGetSystem(ctx, m, client.nodeID, testutil.GetTestSystem(),
httpResp, nil, -1)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
system := redfishClient.ComputerSystem{}
boot := redfishClient.NewBoot()
boot.SetBootSourceOverrideTarget(redfishClient.BOOTSOURCE_CD)
system.SetBoot(*boot)
testutil.MockOnSetSystem(ctx, m, client.nodeID, system,
&http.Response{StatusCode: 401}, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -365,17 +373,22 @@ func TestSetBootSourceByTypeBootSourceUnavailable(t *testing.T) {
client.nodeID = nodeID
invalidSystem := testutil.GetTestSystem()
invalidSystem.Boot.BootSourceOverrideTargetRedfishAllowableValues = []redfishClient.BootSource{
boot := invalidSystem.GetBoot()
boot.SetBootSourceOverrideTargetRedfishAllowableValues([]redfishClient.BootSource{
redfishClient.BOOTSOURCE_HDD,
redfishClient.BOOTSOURCE_PXE,
}
})
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(invalidSystem, httpResp, nil)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, invalidSystem,
httpResp, nil, 2)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
system := redfishClient.ComputerSystem{}
testutil.MockOnSetSystem(ctx, m, client.nodeID, system,
&http.Response{StatusCode: 401}, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -399,29 +412,29 @@ func TestSetVirtualMediaEjectExistingMedia(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
// Mark test media as inserted
inserted := true
testMedia := testutil.GetVirtualMedia([]string{"CD"})
testMedia.Inserted = &inserted
testMedia.SetInserted(true)
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(testutil.GetTestSystem(), httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, testutil.GetTestSystem(),
httpResp, nil, -1)
// Eject Media calls
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMedia, httpResp, nil)
m.On("EjectVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Times(1).
Return(redfishClient.RedfishError{}, httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd", testMedia, httpResp, nil)
testutil.MockOnEjectVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
// Insert media calls
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
m.On("InsertVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Return(
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
testutil.MockOnInsertVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client
@ -447,20 +460,19 @@ func TestSetVirtualMediaEjectExistingMediaFailure(t *testing.T) {
// Mark test media as inserted
inserted := true
testMedia := testutil.GetVirtualMedia([]string{"CD"})
testMedia.Inserted = &inserted
testMedia.SetInserted(inserted)
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(testutil.GetTestSystem(), httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, testutil.GetTestSystem(),
httpResp, nil, 1)
// Eject Media calls
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMedia, httpResp, nil)
m.On("EjectVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Times(1).
Return(redfishClient.RedfishError{}, httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMedia, httpResp, nil)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd", testMedia, httpResp, nil)
testutil.MockOnEjectVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd", testMedia, httpResp, nil)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -481,8 +493,8 @@ func TestSetVirtualMediaGetSystemError(t *testing.T) {
client.nodeID = nodeID
// Mock redfish get system request
m.On("GetSystem", ctx, client.nodeID).Times(1).Return(redfishClient.ComputerSystem{},
nil, redfishClient.GenericOpenAPIError{})
testutil.MockOnGetSystem(ctx, m, client.nodeID, redfishClient.ComputerSystem{},
nil, redfishClient.GenericOpenAPIError{}, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -504,18 +516,19 @@ func TestSetVirtualMediaInsertVirtualMediaError(t *testing.T) {
client.nodeID = nodeID
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, client.nodeID).Return(testutil.GetTestSystem(), httpResp, nil)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, testutil.GetTestSystem(),
httpResp, nil, 3)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
// Insert media calls
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
m.On("InsertVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Return(
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
testutil.MockOnInsertVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, &http.Response{StatusCode: 500}, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client
@ -538,17 +551,17 @@ func TestSystemPowerOff(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("ResetSystem", ctx, client.nodeID, mock.Anything).Return(
redfishClient.RedfishError{},
&http.Response{StatusCode: 200}, nil)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &redfishClient.ResetRequestBody{},
redfishClient.RedfishError{}, &http.Response{StatusCode: 200}, nil)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_ON},
&http.Response{StatusCode: 200}, nil).Times(1)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, nil, 1)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_OFF},
&http.Response{StatusCode: 200}, nil).Times(1)
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -570,9 +583,8 @@ func TestSystemPowerOffResetSystemError(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("ResetSystem", ctx, client.nodeID, mock.Anything).Return(
redfishClient.RedfishError{},
&http.Response{StatusCode: 500}, nil)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &redfishClient.ResetRequestBody{},
redfishClient.RedfishError{}, &http.Response{StatusCode: 500}, nil)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -594,17 +606,18 @@ func TestSystemPowerOn(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("ResetSystem", ctx, client.nodeID, mock.Anything).Return(
redfishClient.RedfishError{},
&http.Response{StatusCode: 200}, nil)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &redfishClient.ResetRequestBody{},
redfishClient.RedfishError{}, &http.Response{StatusCode: 200}, nil)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_OFF},
&http.Response{StatusCode: 200}, nil).Times(1)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, nil, 1)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_ON},
&http.Response{StatusCode: 200}, nil).Times(1)
computerSystem = redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -626,9 +639,8 @@ func TestSystemPowerOnResetSystemError(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("ResetSystem", ctx, client.nodeID, mock.Anything).Return(
redfishClient.RedfishError{},
&http.Response{StatusCode: 500}, nil)
testutil.MockOnResetSystem(ctx, m, client.nodeID, &redfishClient.ResetRequestBody{},
redfishClient.RedfishError{}, &http.Response{StatusCode: 500}, nil)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -650,11 +662,9 @@ func TestSystemPowerStatusUnknown(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
var unknownState redfishClient.PowerState = "unknown"
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: unknownState},
&http.Response{StatusCode: 200},
redfishClient.GenericOpenAPIError{})
computerSystem := redfishClient.NewComputerSystemWithDefaults()
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, redfishClient.GenericOpenAPIError{}, 1)
client.RedfishAPI = m
@ -674,10 +684,10 @@ func TestSystemPowerStatusOn(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
client.nodeID = nodeID
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_ON},
&http.Response{StatusCode: 200},
redfishClient.GenericOpenAPIError{})
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, redfishClient.GenericOpenAPIError{}, 1)
client.RedfishAPI = m
@ -697,10 +707,10 @@ func TestSystemPowerStatusOff(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_OFF},
&http.Response{StatusCode: 200},
redfishClient.GenericOpenAPIError{})
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, redfishClient.GenericOpenAPIError{}, 1)
client.RedfishAPI = m
@ -720,10 +730,10 @@ func TestSystemPowerStatusPoweringOn(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_POWERING_ON},
&http.Response{StatusCode: 200},
redfishClient.GenericOpenAPIError{})
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_POWERING_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, redfishClient.GenericOpenAPIError{}, 1)
client.RedfishAPI = m
@ -743,10 +753,10 @@ func TestSystemPowerStatusPoweringOff(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{PowerState: redfishClient.POWERSTATE_POWERING_OFF},
&http.Response{StatusCode: 200},
redfishClient.GenericOpenAPIError{})
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_POWERING_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, redfishClient.GenericOpenAPIError{}, 1)
client.RedfishAPI = m
@ -765,11 +775,8 @@ func TestSystemPowerStatusGetSystemError(t *testing.T) {
client.nodeID = nodeID
ctx := SetAuth(context.Background(), "", "")
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{},
&http.Response{StatusCode: 500},
redfishClient.GenericOpenAPIError{})
testutil.MockOnGetSystem(ctx, m, client.nodeID, redfishClient.ComputerSystem{},
&http.Response{StatusCode: 500}, redfishClient.GenericOpenAPIError{}, 1)
client.RedfishAPI = m
@ -786,10 +793,9 @@ func TestWaitForPowerStateGetSystemFailed(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{}, &http.Response{StatusCode: 500}, nil)
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, redfishClient.ComputerSystem{},
&http.Response{StatusCode: 500}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -810,12 +816,12 @@ func TestWaitForPowerStateNoRetries(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_OFF,
}, &http.Response{StatusCode: 200}, nil)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *computerSystem,
&http.Response{StatusCode: 200}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -836,17 +842,16 @@ func TestWaitForPowerStateWithRetries(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_ON,
}, &http.Response{StatusCode: 200}, nil).Times(1)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID,
*computerSystem, &http.Response{StatusCode: 200}, nil, 1)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_OFF,
}, &http.Response{StatusCode: 200}, nil).Times(1)
computerSystem.SetPowerState(redfishClient.POWERSTATE_OFF)
testutil.MockOnGetSystem(ctx, m, client.nodeID,
*computerSystem, &http.Response{StatusCode: 200}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -867,17 +872,17 @@ func TestWaitForPowerStateRetriesExceeded(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_OFF
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_OFF)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_ON,
}, &http.Response{StatusCode: 200}, nil)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID,
*computerSystem, &http.Response{StatusCode: 200}, nil, 1)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_ON,
}, &http.Response{StatusCode: 200}, nil)
computerSystem = redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID,
*computerSystem, &http.Response{StatusCode: 200}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -898,12 +903,12 @@ func TestWaitForPowerStateDifferentPowerState(t *testing.T) {
ctx := SetAuth(context.Background(), "", "")
resetReq := redfishClient.ResetRequestBody{}
resetReq.ResetType = redfishClient.RESETTYPE_FORCE_ON
resetReq.SetResetType(redfishClient.RESETTYPE_FORCE_ON)
m.On("GetSystem", ctx, client.nodeID).Return(
redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_ON,
}, &http.Response{StatusCode: 200}, nil)
computerSystem := redfishClient.NewComputerSystemWithDefaults()
computerSystem.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID,
*computerSystem, &http.Response{StatusCode: 200}, nil, 1)
// Replace normal API client with mocked API client
client.RedfishAPI = m
@ -925,62 +930,57 @@ func TestRemoteDirect(t *testing.T) {
inserted := true
testMediaCD := testutil.GetVirtualMedia([]string{"CD"})
testMediaCD.Inserted = &inserted
resetReq := redfishClient.ResetRequestBody{
ResetType: redfishClient.RESETTYPE_FORCE_OFF,
}
testMediaCD.SetInserted(inserted)
httpResp := &http.Response{StatusCode: 200}
system := redfishClient.ComputerSystem{
PowerState: redfishClient.POWERSTATE_ON,
Links: redfishClient.SystemLinks{
ManagedBy: []redfishClient.IdRef{
{OdataId: testutil.ManagerID},
},
system := redfishClient.NewComputerSystemWithDefaults()
system.SetPowerState(redfishClient.POWERSTATE_OFF)
links := redfishClient.NewSystemLinksWithDefaults()
idRef := redfishClient.NewIdRefWithDefaults()
idRef.SetOdataId(testutil.ManagerID)
links.SetManagedBy([]redfishClient.IdRef{*idRef})
system.SetLinks(*links)
system.SetBoot(redfishClient.Boot{
BootSourceOverrideTargetRedfishAllowableValues: &[]redfishClient.BootSource{
redfishClient.BOOTSOURCE_CD,
},
Boot: redfishClient.Boot{
BootSourceOverrideTargetRedfishAllowableValues: []redfishClient.BootSource{
redfishClient.BOOTSOURCE_CD,
},
}}
})
ctx := SetAuth(context.Background(), "", "")
testutil.MockOnGetSystem(ctx, m, client.nodeID, *system, httpResp, nil, 7)
m.On("GetSystem", ctx, client.nodeID).Return(system, httpResp, nil).Times(6)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).
Return(testutil.GetMediaCollection([]string{"Cd", "DVD", "Floppy"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMediaCD, httpResp, nil)
m.On("EjectVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Times(1).
Return(redfishClient.RedfishError{}, httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"Cd"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "DVD").Times(1).
Return(testutil.GetVirtualMedia([]string{"DVD"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Floppy").Times(1).
Return(testutil.GetVirtualMedia([]string{"Floppy"}), httpResp, nil)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Cd", "DVD", "Floppy"}), httpResp, nil, -1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd", testMediaCD, httpResp, nil)
testutil.MockOnEjectVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"Cd"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "DVD",
testutil.GetVirtualMedia([]string{"DVD"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Floppy",
testutil.GetVirtualMedia([]string{"Floppy"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMediaCD, httpResp, nil)
m.On("InsertVirtualMedia", ctx, testutil.ManagerID, "Cd", mock.Anything).Return(
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testMediaCD, httpResp, nil)
testutil.MockOnInsertVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
redfishClient.RedfishError{}, httpResp, redfishClient.GenericOpenAPIError{})
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testMediaCD, httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testMediaCD, httpResp, nil)
m.On("SetSystem", ctx, client.nodeID, mock.Anything).Times(1).Return(
redfishClient.ComputerSystem{}, httpResp, nil)
testutil.MockOnSetSystem(ctx, m, client.nodeID, redfishClient.ComputerSystem{},
httpResp, nil)
m.On("ResetSystem", ctx, client.nodeID, resetReq).Times(1).Return(redfishClient.RedfishError{}, httpResp, nil)
offSystem := system
offSystem.PowerState = redfishClient.POWERSTATE_OFF
m.On("GetSystem", ctx, client.nodeID).Return(offSystem, httpResp, nil).Times(1)
system.SetPowerState(redfishClient.POWERSTATE_ON)
m.On("ResetSystem", ctx, client.nodeID, redfishClient.ResetRequestBody{
ResetType: redfishClient.RESETTYPE_ON,
}).Times(1).Return(redfishClient.RedfishError{}, httpResp, nil)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *system, httpResp, nil, 1)
m.On("GetSystem", ctx, client.nodeID).Return(system, httpResp, nil).Times(1)
resetReq := redfishClient.NewResetRequestBodyWithDefaults()
resetReq.SetResetType(redfishClient.RESETTYPE_ON)
testutil.MockOnResetSystem(ctx, m, client.nodeID, resetReq,
redfishClient.RedfishError{}, httpResp, nil)
system.SetPowerState(redfishClient.POWERSTATE_ON)
testutil.MockOnGetSystem(ctx, m, client.nodeID, *system, httpResp, nil, 2)
err = client.RemoteDirect(ctx, "http://some-url")
assert.NoError(t, err)

View File

@ -113,13 +113,14 @@ func DecodeRawError(rawResponse []byte) (string, error) {
// GetManagerID retrieves the manager ID for a redfish system.
func GetManagerID(ctx context.Context, api redfishAPI.RedfishAPI, systemID string) (string, error) {
system, httpResp, err := api.GetSystem(ctx, systemID)
systemReq := api.GetSystem(ctx, systemID)
system, httpResp, err := api.GetSystemExecute(systemReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
log.Debugf("Unable to find manager for node '%s'.", systemID)
return "", err
}
return GetResourceIDFromURL(system.Links.ManagedBy[0].OdataId), nil
return GetResourceIDFromURL(*(*system.Links.ManagedBy)[0].OdataId), nil
}
// GetResourceIDFromURL returns a parsed Redfish resource ID
@ -140,7 +141,7 @@ func GetResourceIDFromURL(refURL string) string {
// IsIDInList checks whether an ID exists in Redfish IDref collection
func IsIDInList(idRefList []redfishClient.IdRef, id string) bool {
for _, r := range idRefList {
rID := GetResourceIDFromURL(r.OdataId)
rID := GetResourceIDFromURL(*r.OdataId)
if rID == id {
return true
}
@ -156,21 +157,22 @@ func GetVirtualMediaID(ctx context.Context, api redfishAPI.RedfishAPI, systemID
return "", "", err
}
mediaCollection, httpResp, err := api.ListManagerVirtualMedia(ctx, managerID)
listMediaReq := api.ListManagerVirtualMedia(ctx, managerID)
mediaCollection, httpResp, err := api.ListManagerVirtualMediaExecute(listMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return "", "", err
}
for _, mediaURI := range mediaCollection.Members {
// Retrieve the virtual media ID from the request URI
mediaID := GetResourceIDFromURL(mediaURI.OdataId)
vMedia, httpResp, err := api.GetManagerVirtualMedia(ctx, managerID, mediaID)
mediaID := GetResourceIDFromURL(*mediaURI.OdataId)
getMediaReq := api.GetManagerVirtualMedia(ctx, managerID, mediaID)
vMedia, httpResp, err := api.GetManagerVirtualMediaExecute(getMediaReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return "", "", err
}
for _, mediaType := range vMedia.MediaTypes {
for _, mediaType := range *vMedia.MediaTypes {
if mediaType == "CD" || mediaType == "DVD" {
log.Debugf("Found virtual media type '%s' with ID '%s' on manager '%s'.", mediaType,
mediaID, managerID)
@ -250,12 +252,13 @@ func SetAuth(ctx context.Context, username string, password string) context.Cont
}
func getManagerID(ctx context.Context, api redfishAPI.RedfishAPI, systemID string) (string, error) {
system, _, err := api.GetSystem(ctx, systemID)
systemReq := api.GetSystem(ctx, systemID)
system, _, err := api.GetSystemExecute(systemReq)
if err != nil {
return "", err
}
return GetResourceIDFromURL(system.Links.ManagedBy[0].OdataId), nil
return GetResourceIDFromURL(*(*system.Links.ManagedBy)[0].OdataId), nil
}
func getBasePath(redfishURL string) (string, error) {
@ -277,12 +280,13 @@ func (c Client) waitForPowerState(ctx context.Context, desiredState redfishClien
log.Debugf("Waiting for node '%s' to reach power state '%s'.", c.nodeID, desiredState)
for retry := 0; retry <= c.systemActionRetries; retry++ {
system, httpResp, err := c.RedfishAPI.GetSystem(ctx, c.NodeID())
systemReq := c.RedfishAPI.GetSystem(ctx, c.NodeID())
system, httpResp, err := c.RedfishAPI.GetSystemExecute(systemReq)
if err = ScreenRedfishError(httpResp, err); err != nil {
return err
}
if system.PowerState == desiredState {
if system.PowerState != nil && *system.PowerState == desiredState {
log.Debugf("Node '%s' reached power state '%s'.", c.nodeID, desiredState)
return nil
}

View File

@ -158,11 +158,16 @@ func TestRedfishUtilGetResIDFromURL(t *testing.T) {
}
func TestRedfishUtilIsIdInList(t *testing.T) {
path1 := "/path/to/id/1"
path2 := "/path/to/id/2"
path3 := "/path/to/id/3"
path4 := "/path/to/id/4"
idList := []redfishClient.IdRef{
{OdataId: "/path/to/id/1"},
{OdataId: "/path/to/id/2"},
{OdataId: "/path/to/id/3"},
{OdataId: "/path/to/id/4"},
{OdataId: &path1},
{OdataId: &path2},
{OdataId: &path3},
{OdataId: &path4},
}
var emptyList []redfishClient.IdRef
@ -183,17 +188,16 @@ func TestGetVirtualMediaID(t *testing.T) {
ctx := context.Background()
httpResp := &http.Response{StatusCode: 200}
m.On("GetSystem", ctx, mock.Anything).
Return(testutil.GetTestSystem(), &http.Response{StatusCode: 200}, nil)
testutil.MockOnGetSystem(ctx, m, mock.Anything, testutil.GetTestSystem(), httpResp, nil, -1)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Floppy", "Cd"}), httpResp, nil)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Floppy", "Cd"}), httpResp, nil, 1)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Floppy").Times(1).
Return(testutil.GetVirtualMedia([]string{"Floppy", "USBStick"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Floppy",
testutil.GetVirtualMedia([]string{"Floppy", "USBStick"}), httpResp, nil)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Cd").Times(1).
Return(testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Cd",
testutil.GetVirtualMedia([]string{"CD"}), httpResp, nil)
mediaID, mediaType, err := redfish.GetVirtualMediaID(ctx, m, testutil.ManagerID)
assert.Equal(t, mediaID, "Cd")
@ -210,12 +214,13 @@ func TestGetVirtualMediaIDNoMedia(t *testing.T) {
// Remove available media types from test system
system := testutil.GetTestSystem()
system.Boot.BootSourceOverrideTargetRedfishAllowableValues = []redfishClient.BootSource{}
m.On("GetSystem", ctx, mock.Anything).
Return(system, &http.Response{StatusCode: 200}, nil)
boot := system.GetBoot()
boot.SetBootSourceOverrideTargetRedfishAllowableValues([]redfishClient.BootSource{})
testutil.MockOnGetSystem(ctx, m, mock.Anything, system,
&http.Response{StatusCode: 200}, nil, -1)
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(redfishClient.Collection{}, httpResp, nil)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
redfishClient.Collection{}, httpResp, nil, 1)
mediaID, mediaType, err := redfish.GetVirtualMediaID(ctx, m, testutil.ManagerID)
assert.Empty(t, mediaID)
@ -231,17 +236,18 @@ func TestGetVirtualMediaIDUnacceptableMediaTypes(t *testing.T) {
httpResp := &http.Response{StatusCode: 200}
system := testutil.GetTestSystem()
system.Boot.BootSourceOverrideTargetRedfishAllowableValues = []redfishClient.BootSource{
boot := system.GetBoot()
boot.SetBootSourceOverrideTargetRedfishAllowableValues([]redfishClient.BootSource{
redfishClient.BOOTSOURCE_PXE,
}
m.On("GetSystem", ctx, mock.Anything).
Return(system, &http.Response{StatusCode: 200}, nil)
})
m.On("ListManagerVirtualMedia", ctx, testutil.ManagerID).Times(1).
Return(testutil.GetMediaCollection([]string{"Floppy"}), httpResp, nil)
testutil.MockOnGetSystem(ctx, m, mock.Anything, system,
&http.Response{StatusCode: 200}, nil, -1)
m.On("GetManagerVirtualMedia", ctx, testutil.ManagerID, "Floppy").Times(1).
Return(testutil.GetVirtualMedia([]string{"Floppy", "USBStick"}), httpResp, nil)
testutil.MockOnListManagerVirtualMedia(ctx, m, testutil.ManagerID,
testutil.GetMediaCollection([]string{"Floppy"}), httpResp, nil, 1)
testutil.MockOnGetManagerVirtualMedia(ctx, m, testutil.ManagerID, "Floppy",
testutil.GetVirtualMedia([]string{"Floppy", "USBStick"}), httpResp, nil)
mediaID, mediaType, err := redfish.GetVirtualMediaID(ctx, m, testutil.ManagerID)
assert.Empty(t, mediaID)

View File

@ -88,7 +88,8 @@ func (c *Client) SetBootSourceByType(ctx context.Context) error {
// NOTE(drewwalters96): Setting the boot device to a virtual media type requires an API request to the iDRAC
// actions API. The request is made below using the same HTTP client used by the Redfish API and exposed by the
// standard airshipctl Redfish client. Only iDRAC 9 >= 3.3 is supports this endpoint.
url := fmt.Sprintf(endpointImportSysCFG, c.RedfishCFG.BasePath, managerID)
url := fmt.Sprintf(endpointImportSysCFG, c.RedfishCFG.Servers[0].URL, managerID)
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBufferString(vCDBootRequestBody))
if err != nil {
return err

View File

@ -62,7 +62,9 @@ func TestSetBootSourceByTypeGetSystemError(t *testing.T) {
ctx := redfish.SetAuth(context.Background(), "", "")
// Mock redfish get system request
m.On("GetSystem", ctx, client.NodeID()).Times(1).Return(redfishClient.ComputerSystem{},
testSystemRequest := redfishClient.ApiGetSystemRequest{}
m.On("GetSystem", ctx, client.NodeID()).Return(testSystemRequest).Times(1)
m.On("GetSystemExecute", testSystemRequest).Times(1).Return(redfishClient.ComputerSystem{},
&http.Response{StatusCode: 500}, redfishClient.GenericOpenAPIError{})
// Replace normal API client with mocked API client

View File

@ -13,8 +13,13 @@
package redfishutils
import (
"context"
"fmt"
"net/http"
"github.com/stretchr/testify/mock"
redfishMocks "opendev.org/airship/go-redfish/api/mocks"
redfishClient "opendev.org/airship/go-redfish/client"
)
@ -30,7 +35,7 @@ func GetMediaCollection(refs []string) redfishClient.Collection {
for _, r := range refs {
id := redfishClient.IdRef{}
id.OdataId = fmt.Sprintf("%s/%s", uri, r)
id.SetOdataId(fmt.Sprintf("%s/%s", uri, r))
ids = append(ids, id)
}
@ -50,36 +55,113 @@ func GetVirtualMedia(types []string) redfishClient.VirtualMedia {
inserted := false
vMedia.MediaTypes = mediaTypes
vMedia.Inserted = &inserted
vMedia.SetMediaTypes(mediaTypes)
vMedia.SetInserted(inserted)
return vMedia
}
// GetTestSystem builds a test computer system.
func GetTestSystem() redfishClient.ComputerSystem {
return redfishClient.ComputerSystem{
Id: "serverid-00",
Name: "server-100",
UUID: "58893887-8974-2487-2389-841168418919",
Status: redfishClient.Status{
State: "Enabled",
Health: "OK",
},
Links: redfishClient.SystemLinks{
ManagedBy: []redfishClient.IdRef{
{OdataId: fmt.Sprintf("/redfish/v1/Managers/%s", ManagerID)},
},
},
Boot: redfishClient.Boot{
BootSourceOverrideTarget: redfishClient.BOOTSOURCE_CD,
BootSourceOverrideEnabled: redfishClient.BOOTSOURCEOVERRIDEENABLED_CONTINUOUS,
BootSourceOverrideTargetRedfishAllowableValues: []redfishClient.BootSource{
redfishClient.BOOTSOURCE_CD,
redfishClient.BOOTSOURCE_FLOPPY,
redfishClient.BOOTSOURCE_HDD,
redfishClient.BOOTSOURCE_PXE,
},
computerSystem := redfishClient.NewComputerSystem()
computerSystem.SetId("serverid-00")
computerSystem.SetName("server-100")
computerSystem.SetUUID("58893887-8974-2487-2389-841168418919")
status := redfishClient.NewStatusWithDefaults()
status.SetState(redfishClient.STATE_ENABLED)
status.SetHealth(redfishClient.HEALTH_OK)
computerSystem.SetStatus(*status)
sysLinks := redfishClient.NewSystemLinksWithDefaults()
sysLinks.SetManagedBy([]redfishClient.IdRef{
{
OdataId: redfishClient.PtrString(fmt.Sprintf("/redfish/v1/Managers/%s", ManagerID)),
},
})
computerSystem.SetLinks(*sysLinks)
boot := redfishClient.NewBoot()
boot.SetBootSourceOverrideTarget(redfishClient.BOOTSOURCE_CD)
boot.SetBootSourceOverrideEnabled(redfishClient.BOOTSOURCEOVERRIDEENABLED_CONTINUOUS)
boot.SetBootSourceOverrideTargetRedfishAllowableValues([]redfishClient.BootSource{
redfishClient.BOOTSOURCE_CD,
redfishClient.BOOTSOURCE_FLOPPY,
redfishClient.BOOTSOURCE_HDD,
redfishClient.BOOTSOURCE_PXE,
})
computerSystem.SetBoot(*boot)
return *computerSystem
}
// MockOnGetSystem creates mock On calls for GetSystem and GetSystemExecute
func MockOnGetSystem(ctx context.Context, mockAPI *redfishMocks.RedfishAPI,
systemID string, computerSystem redfishClient.ComputerSystem,
httpResponse *http.Response, err error, times int) {
testSystemRequest := redfishClient.ApiGetSystemRequest{}
call := mockAPI.On("GetSystem", ctx, systemID).Return(testSystemRequest)
if times > 0 {
call.Times(times)
}
call = mockAPI.On("GetSystemExecute", testSystemRequest).Return(computerSystem, httpResponse, err)
if times > 0 {
call.Times(times)
}
}
// MockOnResetSystem creates mock On calls for ResetSystem and ResetSystemExecute
func MockOnResetSystem(ctx context.Context, mockAPI *redfishMocks.RedfishAPI,
systemID string, requestBody *redfishClient.ResetRequestBody, redfishErr redfishClient.RedfishError,
httpResponse *http.Response, err error) {
request := redfishClient.ApiResetSystemRequest{}.ResetRequestBody(*requestBody)
mockAPI.On("ResetSystem", ctx, systemID).Return(request).Times(1)
mockAPI.On("ResetSystemExecute", mock.Anything).Return(redfishErr, httpResponse, err).Times(1)
}
// MockOnSetSystem creates mock On calls for SetSystem and SetSystemExecute
func MockOnSetSystem(ctx context.Context, mockAPI *redfishMocks.RedfishAPI, systemID string,
computerSystem redfishClient.ComputerSystem, httpResponse *http.Response, err error) {
request := redfishClient.ApiSetSystemRequest{}.ComputerSystem(computerSystem)
mockAPI.On("SetSystem", ctx, systemID).Return(request).Times(1)
mockAPI.On("SetSystemExecute", mock.Anything).Return(computerSystem, httpResponse, err).Times(1)
}
// MockOnGetManagerVirtualMedia creates mock On calls for GetManagerVirtualMedia and GetManagerVirtualMediaExecute
func MockOnGetManagerVirtualMedia(ctx context.Context, mockAPI *redfishMocks.RedfishAPI,
managerID string, virtualMediaID string, virtualMedia redfishClient.VirtualMedia,
httpResponse *http.Response, err error) {
mediaRequest := redfishClient.ApiGetManagerVirtualMediaRequest{}
mockAPI.On("GetManagerVirtualMedia", ctx, managerID, virtualMediaID).Return(mediaRequest).Times(1)
mockAPI.On("GetManagerVirtualMediaExecute", mock.Anything).Return(virtualMedia, httpResponse, err).Times(1)
}
// MockOnListManagerVirtualMedia creates mock On calls for ListManagerVirtualMedia and ListtManagerVirtualMediaExecute
func MockOnListManagerVirtualMedia(ctx context.Context, mockAPI *redfishMocks.RedfishAPI,
managerID string, collection redfishClient.Collection, httpResponse *http.Response, err error, times int) {
mediaRequest := redfishClient.ApiListManagerVirtualMediaRequest{}
called := mockAPI.On("ListManagerVirtualMedia", ctx, managerID).Return(mediaRequest)
if times > 0 {
called.Times(times)
}
called = mockAPI.On("ListManagerVirtualMediaExecute", mock.Anything).Return(collection, httpResponse, err)
if times > 0 {
called.Times(1)
}
}
// MockOnEjectVirtualMedia creates mock On calls for EjectVirtualMedia and EjectVirtualMediaExecute
func MockOnEjectVirtualMedia(ctx context.Context, mockAPI *redfishMocks.RedfishAPI,
managerID string, virtualMediaID string, redfishErr redfishClient.RedfishError,
httpResponse *http.Response, err error) {
mediaRequest := redfishClient.ApiEjectVirtualMediaRequest{}
mockAPI.On("EjectVirtualMedia", ctx, managerID, virtualMediaID).Return(mediaRequest).Times(1)
mockAPI.On("EjectVirtualMediaExecute", mock.Anything).Return(redfishErr, httpResponse, err).Times(1)
}
// MockOnInsertVirtualMedia creates mock On calls for InsertVirtualMedia and InsertVirtualMediaExecute
func MockOnInsertVirtualMedia(ctx context.Context, mockAPI *redfishMocks.RedfishAPI,
managerID string, virtualMediaID string, redfishErr redfishClient.RedfishError,
httpResponse *http.Response, err error) {
mediaRequest := redfishClient.ApiInsertVirtualMediaRequest{}
mockAPI.On("InsertVirtualMedia", ctx, managerID, virtualMediaID).Return(mediaRequest).Times(1)
mockAPI.On("InsertVirtualMediaExecute", mock.Anything).Return(redfishErr, httpResponse, err).Times(1)
}