diff --git a/go.mod b/go.mod
index ccedc5d85..dd27a8837 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index e10c4899a..df7841c59 100644
--- a/go.sum
+++ b/go.sum
@@ -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=
diff --git a/pkg/remote/redfish/client.go b/pkg/remote/redfish/client.go
index 21684d7a7..1507cbd7d 100644
--- a/pkg/remote/redfish/client.go
+++ b/pkg/remote/redfish/client.go
@@ -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
diff --git a/pkg/remote/redfish/client_test.go b/pkg/remote/redfish/client_test.go
index 31ec0114b..18a97234d 100644
--- a/pkg/remote/redfish/client_test.go
+++ b/pkg/remote/redfish/client_test.go
@@ -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)
diff --git a/pkg/remote/redfish/utils.go b/pkg/remote/redfish/utils.go
index 8e05f7421..52ade521d 100644
--- a/pkg/remote/redfish/utils.go
+++ b/pkg/remote/redfish/utils.go
@@ -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
 		}
diff --git a/pkg/remote/redfish/utils_test.go b/pkg/remote/redfish/utils_test.go
index 95efe0632..54dde0b9a 100644
--- a/pkg/remote/redfish/utils_test.go
+++ b/pkg/remote/redfish/utils_test.go
@@ -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)
diff --git a/pkg/remote/redfish/vendors/dell/client.go b/pkg/remote/redfish/vendors/dell/client.go
index 8248089ff..c9f7b8648 100644
--- a/pkg/remote/redfish/vendors/dell/client.go
+++ b/pkg/remote/redfish/vendors/dell/client.go
@@ -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
diff --git a/pkg/remote/redfish/vendors/dell/client_test.go b/pkg/remote/redfish/vendors/dell/client_test.go
index 032b0506b..79ddacbda 100644
--- a/pkg/remote/redfish/vendors/dell/client_test.go
+++ b/pkg/remote/redfish/vendors/dell/client_test.go
@@ -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
diff --git a/testutil/redfishutils/helpers/helpers.go b/testutil/redfishutils/helpers/helpers.go
index c51ecec93..3c787bfc6 100644
--- a/testutil/redfishutils/helpers/helpers.go
+++ b/testutil/redfishutils/helpers/helpers.go
@@ -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)
+}