@@ -3,7 +3,9 @@ package ovs
3
3
import (
4
4
"fmt"
5
5
"net"
6
+ "os/exec"
6
7
"strconv"
8
+ "strings"
7
9
8
10
"github.com/golang/glog"
9
11
@@ -14,7 +16,6 @@ import (
14
16
"k8s.io/kubernetes/pkg/api/resource"
15
17
kubeletTypes "k8s.io/kubernetes/pkg/kubelet/container"
16
18
knetwork "k8s.io/kubernetes/pkg/kubelet/network"
17
- utilexec "k8s.io/kubernetes/pkg/util/exec"
18
19
)
19
20
20
21
type ovsPlugin struct {
@@ -175,6 +176,22 @@ func wantsMacvlan(pod *kapi.Pod) (bool, error) {
175
176
return false , fmt .Errorf ("Pod has 'pod.network.openshift.io/assign-macvlan' annotation but is not privileged" )
176
177
}
177
178
179
+ func isScriptError (err error ) bool {
180
+ _ , ok := err .(* exec.ExitError )
181
+ return ok
182
+ }
183
+
184
+ // Get the last command (which is prefixed with "+" because of "set -x") and its output
185
+ func getScriptError (output []byte ) string {
186
+ lines := strings .Split (string (output ), "\n " )
187
+ for n := len (lines ) - 1 ; n >= 0 ; n -- {
188
+ if strings .HasPrefix (lines [n ], "+" ) {
189
+ return strings .Join (lines [n :], "\n " )
190
+ }
191
+ }
192
+ return string (output )
193
+ }
194
+
178
195
func (plugin * ovsPlugin ) SetUpPod (namespace string , name string , id kubeletTypes.DockerID ) error {
179
196
err := plugin .WaitForPodNetworkReady ()
180
197
if err != nil {
@@ -210,16 +227,26 @@ func (plugin *ovsPlugin) SetUpPod(namespace string, name string, id kubeletTypes
210
227
return err
211
228
}
212
229
213
- out , err := utilexec . New () .Command (plugin .getExecutable (), setUpCmd , string (id ), vnidstr , ingressStr , egressStr , fmt .Sprintf ("%t" , macvlan )).CombinedOutput ()
230
+ out , err := exec .Command (plugin .getExecutable (), setUpCmd , string (id ), vnidstr , ingressStr , egressStr , fmt .Sprintf ("%t" , macvlan )).CombinedOutput ()
214
231
glog .V (5 ).Infof ("SetUpPod network plugin output: %s, %v" , string (out ), err )
215
- return err
232
+
233
+ if isScriptError (err ) {
234
+ return fmt .Errorf ("Error running network setup script: %s" , getScriptError (out ))
235
+ } else {
236
+ return err
237
+ }
216
238
}
217
239
218
240
func (plugin * ovsPlugin ) TearDownPod (namespace string , name string , id kubeletTypes.DockerID ) error {
219
241
// The script's teardown functionality doesn't need the VNID
220
- out , err := utilexec . New () .Command (plugin .getExecutable (), tearDownCmd , string (id ), "-1" , "-1" , "-1" ).CombinedOutput ()
242
+ out , err := exec .Command (plugin .getExecutable (), tearDownCmd , string (id ), "-1" , "-1" , "-1" ).CombinedOutput ()
221
243
glog .V (5 ).Infof ("TearDownPod network plugin output: %s, %v" , string (out ), err )
222
- return err
244
+
245
+ if isScriptError (err ) {
246
+ return fmt .Errorf ("Error running network teardown script: %s" , getScriptError (out ))
247
+ } else {
248
+ return err
249
+ }
223
250
}
224
251
225
252
func (plugin * ovsPlugin ) Status (namespace string , name string , id kubeletTypes.DockerID ) (* knetwork.PodNetworkStatus , error ) {
@@ -232,9 +259,14 @@ func (plugin *ovsPlugin) UpdatePod(namespace string, name string, id kubeletType
232
259
return err
233
260
}
234
261
235
- out , err := utilexec . New () .Command (plugin .getExecutable (), updateCmd , string (id ), vnidstr ).CombinedOutput ()
262
+ out , err := exec .Command (plugin .getExecutable (), updateCmd , string (id ), vnidstr ).CombinedOutput ()
236
263
glog .V (5 ).Infof ("UpdatePod network plugin output: %s, %v" , string (out ), err )
237
- return err
264
+
265
+ if isScriptError (err ) {
266
+ return fmt .Errorf ("Error running network update script: %s" , getScriptError (out ))
267
+ } else {
268
+ return err
269
+ }
238
270
}
239
271
240
272
func (plugin * ovsPlugin ) Event (name string , details map [string ]interface {}) {
0 commit comments