docker_build: fix JSON rewriting when some fields are null

Image generated by docker build might put "null" as entry
value in the JSON metadata. Ignore those value when doing
the deep copy to avoid error on assigning to "NoneType".

--
MOS_MIGRATED_REVID=100145909
diff --git a/tools/build_defs/docker/rewrite_json.py b/tools/build_defs/docker/rewrite_json.py
index 846bf5c..850e321 100644
--- a/tools/build_defs/docker/rewrite_json.py
+++ b/tools/build_defs/docker/rewrite_json.py
@@ -91,6 +91,14 @@
     os.environ = outer_env
 
 
+def DeepCopySkipNull(data):
+  """Do a deep copy, skipping null entry."""
+  if type(data) == type(dict()):
+    return dict((DeepCopySkipNull(k), DeepCopySkipNull(v))
+                for k, v in data.iteritems() if v is not None)
+  return copy.deepcopy(data)
+
+
 def RewriteMetadata(data, options):
   """Rewrite and return a copy of the input data according to options.
 
@@ -106,7 +114,7 @@
   Raises:
     Exception: a required option was missing.
   """
-  output = copy.deepcopy(data)
+  output = DeepCopySkipNull(data)
 
   if not options.name:
     raise Exception('Missing required option: name')
diff --git a/tools/build_defs/docker/rewrite_json_test.py b/tools/build_defs/docker/rewrite_json_test.py
index 8bb711d..10c4238 100644
--- a/tools/build_defs/docker/rewrite_json_test.py
+++ b/tools/build_defs/docker/rewrite_json_test.py
@@ -616,6 +616,35 @@
         name=name, env=env, parent=parent))
     self.assertEquals(expected, actual)
 
+  def testAugmentVolumeWithNullInput(self):
+    in_data = {
+        'config': {
+            'User': 'mattmoor',
+            'WorkingDir': '/usr/home/mattmoor',
+            'Volumes': None,
+        }
+    }
+    name = 'deadbeef'
+    parent = 'blah'
+    volume = '/data'
+    expected = {
+        'id': name,
+        'parent': parent,
+        'config': {
+            'User': 'mattmoor',
+            'WorkingDir': '/usr/home/mattmoor',
+            'Volumes': {
+                volume: {}
+            }
+        },
+        'docker_version': _DOCKER_VERSION,
+        'architecture': _PROCESSOR_ARCHITECTURE,
+        'os': _OPERATING_SYSTEM,
+    }
+
+    actual = RewriteMetadata(in_data, MetadataOptions(
+        name=name, parent=parent, volumes=[volume]))
+    self.assertEquals(expected, actual)
 
 if __name__ == '__main__':
   unittest.main()