@@ -17,16 +17,19 @@ limitations under the License.
17
17
package plank
18
18
19
19
import (
20
+ "encoding/json"
20
21
"fmt"
21
22
"sort"
22
23
"strings"
23
24
"sync"
24
25
"time"
25
26
27
+ jsonpatch "github.com/evanphx/json-patch"
26
28
"github.com/sirupsen/logrus"
27
29
coreapi "k8s.io/api/core/v1"
28
30
v1 "k8s.io/api/core/v1"
29
31
kerrors "k8s.io/apimachinery/pkg/api/errors"
32
+ ktypes "k8s.io/apimachinery/pkg/types"
30
33
31
34
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
35
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
@@ -51,6 +54,7 @@ type prowJobClient interface {
51
54
Update (* prowapi.ProwJob ) (* prowapi.ProwJob , error )
52
55
Get (name string , options metav1.GetOptions ) (* prowapi.ProwJob , error )
53
56
List (opts metav1.ListOptions ) (* prowapi.ProwJobList , error )
57
+ Patch (name string , pt ktypes.PatchType , data []byte , subresources ... string ) (result * prowapi.ProwJob , err error )
54
58
}
55
59
56
60
// GitHubClient contains the methods used by plank on k8s.io/test-infra/prow/github.Client
@@ -349,6 +353,7 @@ func syncProwJobs(
349
353
func (c * Controller ) syncPendingJob (pj prowapi.ProwJob , pm map [string ]coreapi.Pod , reports chan <- prowapi.ProwJob ) error {
350
354
// Record last known state so we can log state transitions.
351
355
prevState := pj .Status .State
356
+ prevPJ := pj
352
357
353
358
pod , podExists := pm [pj .ObjectMeta .Name ]
354
359
if ! podExists {
@@ -474,14 +479,14 @@ func (c *Controller) syncPendingJob(pj prowapi.ProwJob, pm map[string]coreapi.Po
474
479
WithField ("from" , prevState ).
475
480
WithField ("to" , pj .Status .State ).Info ("Transitioning states." )
476
481
}
477
- _ , err := c .prowJobClient .Update (& pj )
478
- c .log .WithFields (pjutil .ProwJobFields (& pj )).Debug ("Update ProwJob." )
479
- return err
482
+
483
+ return c .patchProwjob (prevPJ , pj )
480
484
}
481
485
482
486
func (c * Controller ) syncTriggeredJob (pj prowapi.ProwJob , pm map [string ]coreapi.Pod , reports chan <- prowapi.ProwJob ) error {
483
487
// Record last known state so we can log state transitions.
484
488
prevState := pj .Status .State
489
+ prevPJ := pj
485
490
486
491
var id , pn string
487
492
pod , podExists := pm [pj .ObjectMeta .Name ]
@@ -525,9 +530,7 @@ func (c *Controller) syncTriggeredJob(pj prowapi.ProwJob, pm map[string]coreapi.
525
530
WithField ("from" , prevState ).
526
531
WithField ("to" , pj .Status .State ).Info ("Transitioning states." )
527
532
}
528
- _ , err := c .prowJobClient .Update (& pj )
529
- c .log .WithFields (pjutil .ProwJobFields (& pj )).Debug ("Update ProwJob." )
530
- return err
533
+ return c .patchProwjob (prevPJ , pj )
531
534
}
532
535
533
536
// TODO: No need to return the pod name since we already have the
@@ -568,3 +571,24 @@ func getPodBuildID(pod *coreapi.Pod) string {
568
571
logrus .Warningf ("BUILD_ID was not found in pod %q: streaming logs from deck will not work" , pod .ObjectMeta .Name )
569
572
return ""
570
573
}
574
+
575
+ func (c * Controller ) patchProwjob (srcPJ prowapi.ProwJob , destPJ prowapi.ProwJob ) error {
576
+ srcPJData , err := json .Marshal (srcPJ )
577
+ if err != nil {
578
+ return fmt .Errorf ("marshal source prow job: %v" , err )
579
+ }
580
+
581
+ destPJData , err := json .Marshal (destPJ )
582
+ if err != nil {
583
+ return fmt .Errorf ("marshal dest prow job: %v" , err )
584
+ }
585
+
586
+ patch , err := jsonpatch .CreateMergePatch (srcPJData , destPJData )
587
+ if err != nil {
588
+ return fmt .Errorf ("cannot create JSON patch: %v" , err )
589
+ }
590
+
591
+ _ , err = c .prowJobClient .Patch (srcPJ .Name , ktypes .MergePatchType , patch )
592
+ c .log .WithFields (pjutil .ProwJobFields (& destPJ )).Debug ("Patched ProwJob." )
593
+ return err
594
+ }
0 commit comments