github.com/dctrud/umoci@v0.4.3-0.20191016193643-05a1d37de015/oci/casext/json.go (about) 1 /* 2 * umoci: Umoci Modifies Open Containers' Images 3 * Copyright (C) 2017, 2018 SUSE LLC. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package casext 19 20 import ( 21 "bytes" 22 "encoding/json" 23 24 "github.com/opencontainers/go-digest" 25 "github.com/pkg/errors" 26 "golang.org/x/net/context" 27 ) 28 29 // PutBlobJSON adds a new JSON blob to the image (marshalled from the given 30 // interface). This is equivalent to calling PutBlob() with a JSON payload 31 // as the reader. Note that due to intricacies in the Go JSON 32 // implementation, we cannot guarantee that two calls to PutBlobJSON() will 33 // return the same digest. 34 // 35 // TODO: Use a proper JSON serialisation library, which actually guarantees 36 // consistent output. Go's JSON library doesn't even attempt to sort 37 // map[...]... objects (which have their iteration order randomised in 38 // Go). 39 func (e Engine) PutBlobJSON(ctx context.Context, data interface{}) (digest.Digest, int64, error) { 40 var buffer bytes.Buffer 41 if err := json.NewEncoder(&buffer).Encode(data); err != nil { 42 return "", -1, errors.Wrap(err, "encode JSON") 43 } 44 return e.PutBlob(ctx, &buffer) 45 }