@@ -799,6 +799,79 @@ def put(request, context):
799799 return request .json ()
800800
801801
802+ def patch (request , context ):
803+ """Process a PATCH request to the kubernetes API"""
804+ url = cache_key (request .url )
805+ # type is the second last element
806+ resource_type = get_type (request .url )
807+ # check if the namespace being posted to exists
808+ if resource_type != 'namespaces' :
809+ namespace = get_namespace (url , resource_type )
810+ if cache .get (namespace ) is None :
811+ context .status_code = 404
812+ context .reason = 'Not Found'
813+ return {}
814+
815+ # figure out main resource if in subresource
816+ original_url = url
817+ subresource , resource_type , url = is_subresource (resource_type , url )
818+ if subresource != resource_type :
819+ cache .set (original_url , request .json (), None )
820+
821+ item = cache .get (url )
822+ if item is None :
823+ context .status_code = 404
824+ context .reason = 'Not Found'
825+ return {}
826+ # raise a 503 when we want to intentionally test for it
827+ elif item ['metadata' ]['name' ] == 'image-pull-failed-test' :
828+ context .status_code = 503
829+ context .reason = 'Network Unreachable'
830+ return {}
831+
832+ data = request .json ()
833+
834+ # merge new data into old but keep labels separate in case they changed
835+ if 'labels' in data ['metadata' ]:
836+ labels = data ['metadata' ].pop ('labels' )
837+ item ['metadata' ].update (data ['metadata' ])
838+ data ['metadata' ] = item ['metadata' ]
839+ # make sure only new labels are used
840+ data ['metadata' ]['labels' ] = labels
841+
842+ # split out deployments and replicasets? due to upsert_pods
843+ if resource_type in ['replicationcontrollers' , 'replicasets' , 'deployments' ]:
844+ if subresource == 'scale' :
845+ # has minimal info so need to copy data
846+ replicas = data ['spec' ]['replicas' ]
847+ data = copy .deepcopy (item ) # full copy
848+ data ['spec' ]['replicas' ] = replicas
849+
850+ if 'status' not in data :
851+ # just use what was set last time
852+ data ['status' ] = {'observedGeneration' : item ['status' ]['observedGeneration' ]}
853+
854+ data ['metadata' ]['resourceVersion' ] += 1
855+ data ['metadata' ]['generation' ] += 1
856+ data ['status' ]['observedGeneration' ] += 1
857+
858+ # Update the individual resource
859+ cache .set (url , data , None )
860+
861+ if resource_type in ['replicationcontrollers' , 'replicasets' ]:
862+ upsert_pods (data , url )
863+ elif resource_type == 'deployments' :
864+ manage_replicasets (data , url )
865+ else :
866+ # Update the individual resource
867+ cache .set (url , data , None )
868+
869+ context .status_code = 200
870+ context .reason = 'OK'
871+
872+ return request .json ()
873+
874+
802875def delete (request , context ):
803876 """Process a DELETE request to the kubernetes API"""
804877 url = cache_key (request .url )
@@ -892,6 +965,8 @@ def mock_kubernetes(request, context):
892965 response = get (request , context )
893966 elif request .method == 'PUT' :
894967 response = put (request , context )
968+ elif request .method == 'PATCH' :
969+ response = patch (request , context )
895970 elif request .method == 'DELETE' :
896971 response = delete (request , context )
897972
0 commit comments