From 7a5741ce1b59049ac238f9433d092ba7e2684900 Mon Sep 17 00:00:00 2001 From: Gianluca Borello Date: Mon, 11 Jun 2018 16:50:45 -0700 Subject: [PATCH] Workaround for sanitizing JSON coming from MySQL Shell, which can include invalid \' sequences. Signed-off-by: Gianluca Borello --- pkg/util/mysqlsh/mysqlsh.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/util/mysqlsh/mysqlsh.go b/pkg/util/mysqlsh/mysqlsh.go index c96853f2e..e3bfd1e91 100644 --- a/pkg/util/mysqlsh/mysqlsh.go +++ b/pkg/util/mysqlsh/mysqlsh.go @@ -60,6 +60,10 @@ type Interface interface { // errorRegex is used to parse Python tracebacks generated by mysql-shell. var errorRegex = regexp.MustCompile(`Traceback.*\n(?: (.*)\n){1,}(?P[\w\.]+)\: (?P.*)`) +func sanitizeJSON(json []byte) []byte { + return bytes.Replace(json, []byte("\\'"), []byte("'"), -1) +} + // New creates a new MySQL Shell Interface. func New(exec utilexec.Interface, uri string) Interface { return &runner{exec: exec, uri: uri} @@ -101,7 +105,7 @@ func (r *runner) CreateCluster(ctx context.Context, opts Options) (*innodb.Clust } status := &innodb.ClusterStatus{} - err = json.Unmarshal([]byte(jsonData), status) + err = json.Unmarshal(sanitizeJSON([]byte(jsonData)), status) if err != nil { return nil, errors.Wrapf(err, "decoding cluster status output: %q", output) } @@ -116,7 +120,7 @@ func (r *runner) GetClusterStatus(ctx context.Context) (*innodb.ClusterStatus, e } status := &innodb.ClusterStatus{} - err = json.Unmarshal(output, status) + err = json.Unmarshal(sanitizeJSON(output), status) if err != nil { return nil, errors.Wrapf(err, "decoding cluster status output: %q", output) } @@ -132,7 +136,7 @@ func (r *runner) CheckInstanceState(ctx context.Context, uri string) (*innodb.In } state := &innodb.InstanceState{} - err = json.Unmarshal(output, state) + err = json.Unmarshal(sanitizeJSON(output), state) if err != nil { return nil, fmt.Errorf("decoding instance state: %v", err) }