github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/logging/kafka/kafka_test.go (about)

     1  package kafka_test
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/fastly/go-fastly/v9/fastly"
     8  
     9  	"github.com/fastly/cli/pkg/argparser"
    10  	"github.com/fastly/cli/pkg/commands/logging/kafka"
    11  	"github.com/fastly/cli/pkg/config"
    12  	"github.com/fastly/cli/pkg/errors"
    13  	"github.com/fastly/cli/pkg/global"
    14  	"github.com/fastly/cli/pkg/manifest"
    15  	"github.com/fastly/cli/pkg/mock"
    16  	"github.com/fastly/cli/pkg/testutil"
    17  )
    18  
    19  func TestCreateKafkaInput(t *testing.T) {
    20  	for _, testcase := range []struct {
    21  		name      string
    22  		cmd       *kafka.CreateCommand
    23  		want      *fastly.CreateKafkaInput
    24  		wantError string
    25  	}{
    26  		{
    27  			name: "required values set flag serviceID",
    28  			cmd:  createCommandRequired(),
    29  			want: &fastly.CreateKafkaInput{
    30  				ServiceID:      "123",
    31  				ServiceVersion: 4,
    32  				Name:           fastly.ToPointer("log"),
    33  				Topic:          fastly.ToPointer("logs"),
    34  				Brokers:        fastly.ToPointer("127.0.0.1,127.0.0.2"),
    35  			},
    36  		},
    37  		{
    38  			name: "all values set flag serviceID",
    39  			cmd:  createCommandAll(),
    40  			want: &fastly.CreateKafkaInput{
    41  				ServiceID:         "123",
    42  				ServiceVersion:    4,
    43  				Name:              fastly.ToPointer("logs"),
    44  				Brokers:           fastly.ToPointer("127.0.0.1,127.0.0.2"),
    45  				Topic:             fastly.ToPointer("logs"),
    46  				RequiredACKs:      fastly.ToPointer("-1"),
    47  				UseTLS:            fastly.ToPointer(fastly.Compatibool(true)),
    48  				CompressionCodec:  fastly.ToPointer("zippy"),
    49  				Format:            fastly.ToPointer(`%h %l %u %t "%r" %>s %b`),
    50  				FormatVersion:     fastly.ToPointer(2),
    51  				ResponseCondition: fastly.ToPointer("Prevent default logging"),
    52  				Placement:         fastly.ToPointer("none"),
    53  				TLSCACert:         fastly.ToPointer("-----BEGIN CERTIFICATE-----foo"),
    54  				TLSHostname:       fastly.ToPointer("example.com"),
    55  				TLSClientCert:     fastly.ToPointer("-----BEGIN CERTIFICATE-----bar"),
    56  				TLSClientKey:      fastly.ToPointer("-----BEGIN PRIVATE KEY-----bar"),
    57  			},
    58  		},
    59  		{
    60  			name:      "error missing serviceID",
    61  			cmd:       createCommandMissingServiceID(),
    62  			wantError: errors.ErrNoServiceID.Error(),
    63  		},
    64  		{
    65  			name: "verify SASL fields",
    66  			cmd:  createCommandSASL("scram-sha-512", "user1", "12345"),
    67  			want: &fastly.CreateKafkaInput{
    68  				ServiceID:       "123",
    69  				ServiceVersion:  4,
    70  				Name:            fastly.ToPointer("log"),
    71  				Topic:           fastly.ToPointer("logs"),
    72  				Brokers:         fastly.ToPointer("127.0.0.1,127.0.0.2"),
    73  				ParseLogKeyvals: fastly.ToPointer(fastly.Compatibool(true)),
    74  				RequestMaxBytes: fastly.ToPointer(11111),
    75  				AuthMethod:      fastly.ToPointer("scram-sha-512"),
    76  				User:            fastly.ToPointer("user1"),
    77  				Password:        fastly.ToPointer("12345"),
    78  			},
    79  		},
    80  	} {
    81  		t.Run(testcase.name, func(t *testing.T) {
    82  			var bs []byte
    83  			out := bytes.NewBuffer(bs)
    84  			verboseMode := true
    85  
    86  			serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{
    87  				AutoCloneFlag:      testcase.cmd.AutoClone,
    88  				APIClient:          testcase.cmd.Globals.APIClient,
    89  				Manifest:           testcase.cmd.Manifest,
    90  				Out:                out,
    91  				ServiceVersionFlag: testcase.cmd.ServiceVersion,
    92  				VerboseMode:        verboseMode,
    93  			})
    94  
    95  			switch {
    96  			case err != nil && testcase.wantError == "":
    97  				t.Fatalf("unexpected error getting service details: %v", err)
    98  				return
    99  			case err != nil && testcase.wantError != "":
   100  				testutil.AssertErrorContains(t, err, testcase.wantError)
   101  				return
   102  			case err == nil && testcase.wantError != "":
   103  				t.Fatalf("expected error, have nil (service details: %s, %d)", serviceID, serviceVersion.Number)
   104  			case err == nil && testcase.wantError == "":
   105  				have, err := testcase.cmd.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number))
   106  				testutil.AssertErrorContains(t, err, testcase.wantError)
   107  				testutil.AssertEqual(t, testcase.want, have)
   108  			}
   109  		})
   110  	}
   111  }
   112  
   113  func TestUpdateKafkaInput(t *testing.T) {
   114  	scenarios := []struct {
   115  		name      string
   116  		cmd       *kafka.UpdateCommand
   117  		api       mock.API
   118  		want      *fastly.UpdateKafkaInput
   119  		wantError string
   120  	}{
   121  		{
   122  			name: "all values set flag serviceID",
   123  			cmd:  updateCommandAll(),
   124  			api: mock.API{
   125  				ListVersionsFn: testutil.ListVersions,
   126  				CloneVersionFn: testutil.CloneVersionResult(4),
   127  				GetKafkaFn:     getKafkaOK,
   128  			},
   129  			want: &fastly.UpdateKafkaInput{
   130  				ServiceID:         "123",
   131  				ServiceVersion:    4,
   132  				Name:              "log",
   133  				NewName:           fastly.ToPointer("new1"),
   134  				Topic:             fastly.ToPointer("new2"),
   135  				Brokers:           fastly.ToPointer("new3"),
   136  				RequiredACKs:      fastly.ToPointer("new4"),
   137  				UseTLS:            fastly.ToPointer(fastly.Compatibool(false)),
   138  				CompressionCodec:  fastly.ToPointer("new5"),
   139  				Placement:         fastly.ToPointer("new6"),
   140  				Format:            fastly.ToPointer("new7"),
   141  				FormatVersion:     fastly.ToPointer(3),
   142  				ResponseCondition: fastly.ToPointer("new8"),
   143  				TLSCACert:         fastly.ToPointer("new9"),
   144  				TLSClientCert:     fastly.ToPointer("new10"),
   145  				TLSClientKey:      fastly.ToPointer("new11"),
   146  				TLSHostname:       fastly.ToPointer("new12"),
   147  				ParseLogKeyvals:   fastly.ToPointer(fastly.Compatibool(false)),
   148  				RequestMaxBytes:   fastly.ToPointer(22222),
   149  				AuthMethod:        fastly.ToPointer("plain"),
   150  				User:              fastly.ToPointer("new13"),
   151  				Password:          fastly.ToPointer("new14"),
   152  			},
   153  		},
   154  		{
   155  			name: "no updates",
   156  			cmd:  updateCommandNoUpdates(),
   157  			api: mock.API{
   158  				ListVersionsFn: testutil.ListVersions,
   159  				CloneVersionFn: testutil.CloneVersionResult(4),
   160  				GetKafkaFn:     getKafkaOK,
   161  			},
   162  			want: &fastly.UpdateKafkaInput{
   163  				ServiceID:      "123",
   164  				ServiceVersion: 4,
   165  				Name:           "log",
   166  			},
   167  		},
   168  		{
   169  			name:      "error missing serviceID",
   170  			cmd:       updateCommandMissingServiceID(),
   171  			want:      nil,
   172  			wantError: errors.ErrNoServiceID.Error(),
   173  		},
   174  		{
   175  			name: "verify SASL fields",
   176  			api: mock.API{
   177  				ListVersionsFn: testutil.ListVersions,
   178  				CloneVersionFn: testutil.CloneVersionResult(4),
   179  				GetKafkaFn:     getKafkaOK,
   180  			},
   181  			cmd: updateCommandSASL("scram-sha-512", "user1", "12345"),
   182  			want: &fastly.UpdateKafkaInput{
   183  				ServiceID:       "123",
   184  				ServiceVersion:  4,
   185  				Name:            "log",
   186  				Topic:           fastly.ToPointer("logs"),
   187  				Brokers:         fastly.ToPointer("127.0.0.1,127.0.0.2"),
   188  				ParseLogKeyvals: fastly.ToPointer(fastly.Compatibool(true)),
   189  				RequestMaxBytes: fastly.ToPointer(11111),
   190  				AuthMethod:      fastly.ToPointer("scram-sha-512"),
   191  				User:            fastly.ToPointer("user1"),
   192  				Password:        fastly.ToPointer("12345"),
   193  			},
   194  		},
   195  		{
   196  			name: "verify disabling SASL",
   197  			api: mock.API{
   198  				ListVersionsFn: testutil.ListVersions,
   199  				CloneVersionFn: testutil.CloneVersionResult(4),
   200  				GetKafkaFn:     getKafkaSASL,
   201  			},
   202  			cmd: updateCommandNoSASL(),
   203  			want: &fastly.UpdateKafkaInput{
   204  				ServiceID:       "123",
   205  				ServiceVersion:  4,
   206  				Name:            "log",
   207  				Topic:           fastly.ToPointer("logs"),
   208  				Brokers:         fastly.ToPointer("127.0.0.1,127.0.0.2"),
   209  				ParseLogKeyvals: fastly.ToPointer(fastly.Compatibool(true)),
   210  				RequestMaxBytes: fastly.ToPointer(11111),
   211  				AuthMethod:      fastly.ToPointer(""),
   212  				User:            fastly.ToPointer(""),
   213  				Password:        fastly.ToPointer(""),
   214  			},
   215  		},
   216  	}
   217  	for testcaseIdx := range scenarios {
   218  		testcase := &scenarios[testcaseIdx]
   219  		t.Run(testcase.name, func(t *testing.T) {
   220  			testcase.cmd.Globals.APIClient = testcase.api
   221  
   222  			var bs []byte
   223  			out := bytes.NewBuffer(bs)
   224  			verboseMode := true
   225  
   226  			serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{
   227  				AutoCloneFlag:      testcase.cmd.AutoClone,
   228  				APIClient:          testcase.api,
   229  				Manifest:           testcase.cmd.Manifest,
   230  				Out:                out,
   231  				ServiceVersionFlag: testcase.cmd.ServiceVersion,
   232  				VerboseMode:        verboseMode,
   233  			})
   234  
   235  			switch {
   236  			case err != nil && testcase.wantError == "":
   237  				t.Fatalf("unexpected error getting service details: %v", err)
   238  				return
   239  			case err != nil && testcase.wantError != "":
   240  				testutil.AssertErrorContains(t, err, testcase.wantError)
   241  				return
   242  			case err == nil && testcase.wantError != "":
   243  				t.Fatalf("expected error, have nil (service details: %s, %d)", serviceID, serviceVersion.Number)
   244  			case err == nil && testcase.wantError == "":
   245  				have, err := testcase.cmd.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number))
   246  				testutil.AssertErrorContains(t, err, testcase.wantError)
   247  				testutil.AssertEqual(t, testcase.want, have)
   248  			}
   249  		})
   250  	}
   251  }
   252  
   253  func createCommandRequired() *kafka.CreateCommand {
   254  	var b bytes.Buffer
   255  
   256  	g := global.Data{
   257  		Config: config.File{},
   258  		Env:    config.Environment{},
   259  		Output: &b,
   260  	}
   261  	g.APIClient, _ = mock.APIClient(mock.API{
   262  		ListVersionsFn: testutil.ListVersions,
   263  		CloneVersionFn: testutil.CloneVersionResult(4),
   264  	})("token", "endpoint", false)
   265  
   266  	return &kafka.CreateCommand{
   267  		Base: argparser.Base{
   268  			Globals: &g,
   269  		},
   270  		Manifest: manifest.Data{
   271  			Flag: manifest.Flag{
   272  				ServiceID: "123",
   273  			},
   274  		},
   275  		ServiceVersion: argparser.OptionalServiceVersion{
   276  			OptionalString: argparser.OptionalString{Value: "1"},
   277  		},
   278  		AutoClone: argparser.OptionalAutoClone{
   279  			OptionalBool: argparser.OptionalBool{
   280  				Optional: argparser.Optional{
   281  					WasSet: true,
   282  				},
   283  				Value: true,
   284  			},
   285  		},
   286  		EndpointName: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "log"},
   287  		Topic:        argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "logs"},
   288  		Brokers:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "127.0.0.1,127.0.0.2"},
   289  	}
   290  }
   291  
   292  func createCommandAll() *kafka.CreateCommand {
   293  	var b bytes.Buffer
   294  
   295  	g := global.Data{
   296  		Config: config.File{},
   297  		Env:    config.Environment{},
   298  		Output: &b,
   299  	}
   300  	g.APIClient, _ = mock.APIClient(mock.API{
   301  		ListVersionsFn: testutil.ListVersions,
   302  		CloneVersionFn: testutil.CloneVersionResult(4),
   303  	})("token", "endpoint", false)
   304  
   305  	return &kafka.CreateCommand{
   306  		Base: argparser.Base{
   307  			Globals: &g,
   308  		},
   309  		Manifest: manifest.Data{
   310  			Flag: manifest.Flag{
   311  				ServiceID: "123",
   312  			},
   313  		},
   314  		ServiceVersion: argparser.OptionalServiceVersion{
   315  			OptionalString: argparser.OptionalString{Value: "1"},
   316  		},
   317  		AutoClone: argparser.OptionalAutoClone{
   318  			OptionalBool: argparser.OptionalBool{
   319  				Optional: argparser.Optional{
   320  					WasSet: true,
   321  				},
   322  				Value: true,
   323  			},
   324  		},
   325  		EndpointName:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "logs"},
   326  		Topic:             argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "logs"},
   327  		Brokers:           argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "127.0.0.1,127.0.0.2"},
   328  		UseTLS:            argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   329  		RequiredACKs:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "-1"},
   330  		CompressionCodec:  argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "zippy"},
   331  		Format:            argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: `%h %l %u %t "%r" %>s %b`},
   332  		FormatVersion:     argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 2},
   333  		ResponseCondition: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "Prevent default logging"},
   334  		Placement:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "none"},
   335  		TLSCACert:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "-----BEGIN CERTIFICATE-----foo"},
   336  		TLSHostname:       argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "example.com"},
   337  		TLSClientCert:     argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "-----BEGIN CERTIFICATE-----bar"},
   338  		TLSClientKey:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "-----BEGIN PRIVATE KEY-----bar"},
   339  	}
   340  }
   341  
   342  func createCommandSASL(authMethod, user, password string) *kafka.CreateCommand {
   343  	var b bytes.Buffer
   344  
   345  	g := global.Data{
   346  		Config: config.File{},
   347  		Env:    config.Environment{},
   348  		Output: &b,
   349  	}
   350  	g.APIClient, _ = mock.APIClient(mock.API{
   351  		ListVersionsFn: testutil.ListVersions,
   352  		CloneVersionFn: testutil.CloneVersionResult(4),
   353  	})("token", "endpoint", false)
   354  
   355  	return &kafka.CreateCommand{
   356  		Base: argparser.Base{
   357  			Globals: &g,
   358  		},
   359  		Manifest: manifest.Data{
   360  			Flag: manifest.Flag{
   361  				ServiceID: "123",
   362  			},
   363  		},
   364  		ServiceVersion: argparser.OptionalServiceVersion{
   365  			OptionalString: argparser.OptionalString{Value: "1"},
   366  		},
   367  		AutoClone: argparser.OptionalAutoClone{
   368  			OptionalBool: argparser.OptionalBool{
   369  				Optional: argparser.Optional{
   370  					WasSet: true,
   371  				},
   372  				Value: true,
   373  			},
   374  		},
   375  		EndpointName:    argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "log"},
   376  		Topic:           argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "logs"},
   377  		Brokers:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "127.0.0.1,127.0.0.2"},
   378  		ParseLogKeyvals: argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   379  		RequestMaxBytes: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 11111},
   380  		UseSASL:         argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   381  		AuthMethod:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: authMethod},
   382  		User:            argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: user},
   383  		Password:        argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: password},
   384  	}
   385  }
   386  
   387  func createCommandMissingServiceID() *kafka.CreateCommand {
   388  	res := createCommandAll()
   389  	res.Manifest = manifest.Data{}
   390  	return res
   391  }
   392  
   393  func updateCommandNoUpdates() *kafka.UpdateCommand {
   394  	var b bytes.Buffer
   395  
   396  	g := global.Data{
   397  		Config: config.File{},
   398  		Env:    config.Environment{},
   399  		Output: &b,
   400  	}
   401  
   402  	return &kafka.UpdateCommand{
   403  		Base: argparser.Base{
   404  			Globals: &g,
   405  		},
   406  		Manifest: manifest.Data{
   407  			Flag: manifest.Flag{
   408  				ServiceID: "123",
   409  			},
   410  		},
   411  		EndpointName: "log",
   412  		ServiceVersion: argparser.OptionalServiceVersion{
   413  			OptionalString: argparser.OptionalString{Value: "1"},
   414  		},
   415  		AutoClone: argparser.OptionalAutoClone{
   416  			OptionalBool: argparser.OptionalBool{
   417  				Optional: argparser.Optional{
   418  					WasSet: true,
   419  				},
   420  				Value: true,
   421  			},
   422  		},
   423  	}
   424  }
   425  
   426  func updateCommandAll() *kafka.UpdateCommand {
   427  	var b bytes.Buffer
   428  
   429  	g := global.Data{
   430  		Config: config.File{},
   431  		Env:    config.Environment{},
   432  		Output: &b,
   433  	}
   434  
   435  	return &kafka.UpdateCommand{
   436  		Base: argparser.Base{
   437  			Globals: &g,
   438  		},
   439  		Manifest: manifest.Data{
   440  			Flag: manifest.Flag{
   441  				ServiceID: "123",
   442  			},
   443  		},
   444  		EndpointName: "log",
   445  		ServiceVersion: argparser.OptionalServiceVersion{
   446  			OptionalString: argparser.OptionalString{Value: "1"},
   447  		},
   448  		AutoClone: argparser.OptionalAutoClone{
   449  			OptionalBool: argparser.OptionalBool{
   450  				Optional: argparser.Optional{
   451  					WasSet: true,
   452  				},
   453  				Value: true,
   454  			},
   455  		},
   456  		NewName:           argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new1"},
   457  		Topic:             argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new2"},
   458  		Brokers:           argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new3"},
   459  		UseTLS:            argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: false},
   460  		RequiredACKs:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new4"},
   461  		CompressionCodec:  argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new5"},
   462  		Placement:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new6"},
   463  		Format:            argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new7"},
   464  		FormatVersion:     argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 3},
   465  		ResponseCondition: argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new8"},
   466  		TLSCACert:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new9"},
   467  		TLSClientCert:     argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new10"},
   468  		TLSClientKey:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new11"},
   469  		TLSHostname:       argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new12"},
   470  		ParseLogKeyvals:   argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: false},
   471  		RequestMaxBytes:   argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 22222},
   472  		UseSASL:           argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   473  		AuthMethod:        argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "plain"},
   474  		User:              argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new13"},
   475  		Password:          argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "new14"},
   476  	}
   477  }
   478  
   479  func updateCommandSASL(authMethod, user, password string) *kafka.UpdateCommand {
   480  	var b bytes.Buffer
   481  
   482  	g := global.Data{
   483  		Config: config.File{},
   484  		Env:    config.Environment{},
   485  		Output: &b,
   486  	}
   487  
   488  	return &kafka.UpdateCommand{
   489  		Base: argparser.Base{
   490  			Globals: &g,
   491  		},
   492  		Manifest: manifest.Data{
   493  			Flag: manifest.Flag{
   494  				ServiceID: "123",
   495  			},
   496  		},
   497  		EndpointName: "log",
   498  		ServiceVersion: argparser.OptionalServiceVersion{
   499  			OptionalString: argparser.OptionalString{Value: "1"},
   500  		},
   501  		AutoClone: argparser.OptionalAutoClone{
   502  			OptionalBool: argparser.OptionalBool{
   503  				Optional: argparser.Optional{
   504  					WasSet: true,
   505  				},
   506  				Value: true,
   507  			},
   508  		},
   509  		Topic:           argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "logs"},
   510  		Brokers:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "127.0.0.1,127.0.0.2"},
   511  		ParseLogKeyvals: argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   512  		RequestMaxBytes: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 11111},
   513  		UseSASL:         argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   514  		AuthMethod:      argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: authMethod},
   515  		User:            argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: user},
   516  		Password:        argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: password},
   517  	}
   518  }
   519  
   520  func updateCommandNoSASL() *kafka.UpdateCommand {
   521  	var b bytes.Buffer
   522  
   523  	g := global.Data{
   524  		Config: config.File{},
   525  		Env:    config.Environment{},
   526  		Output: &b,
   527  	}
   528  
   529  	return &kafka.UpdateCommand{
   530  		Base: argparser.Base{
   531  			Globals: &g,
   532  		},
   533  		Manifest: manifest.Data{
   534  			Flag: manifest.Flag{
   535  				ServiceID: "123",
   536  			},
   537  		},
   538  		EndpointName: "log",
   539  		ServiceVersion: argparser.OptionalServiceVersion{
   540  			OptionalString: argparser.OptionalString{Value: "1"},
   541  		},
   542  		AutoClone: argparser.OptionalAutoClone{
   543  			OptionalBool: argparser.OptionalBool{
   544  				Optional: argparser.Optional{
   545  					WasSet: true,
   546  				},
   547  				Value: true,
   548  			},
   549  		},
   550  		Topic:           argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "logs"},
   551  		Brokers:         argparser.OptionalString{Optional: argparser.Optional{WasSet: true}, Value: "127.0.0.1,127.0.0.2"},
   552  		ParseLogKeyvals: argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: true},
   553  		RequestMaxBytes: argparser.OptionalInt{Optional: argparser.Optional{WasSet: true}, Value: 11111},
   554  		UseSASL:         argparser.OptionalBool{Optional: argparser.Optional{WasSet: true}, Value: false},
   555  		AuthMethod:      argparser.OptionalString{Optional: argparser.Optional{WasSet: false}, Value: ""},
   556  		User:            argparser.OptionalString{Optional: argparser.Optional{WasSet: false}, Value: ""},
   557  		Password:        argparser.OptionalString{Optional: argparser.Optional{WasSet: false}, Value: ""},
   558  	}
   559  }
   560  
   561  func updateCommandMissingServiceID() *kafka.UpdateCommand {
   562  	res := updateCommandAll()
   563  	res.Manifest = manifest.Data{}
   564  	return res
   565  }
   566  
   567  func getKafkaSASL(i *fastly.GetKafkaInput) (*fastly.Kafka, error) {
   568  	return &fastly.Kafka{
   569  		ServiceID:         fastly.ToPointer(i.ServiceID),
   570  		ServiceVersion:    fastly.ToPointer(i.ServiceVersion),
   571  		Name:              fastly.ToPointer("log"),
   572  		Brokers:           fastly.ToPointer("127.0.0.1,127.0.0.2"),
   573  		Topic:             fastly.ToPointer("logs"),
   574  		RequiredACKs:      fastly.ToPointer("-1"),
   575  		UseTLS:            fastly.ToPointer(true),
   576  		CompressionCodec:  fastly.ToPointer("zippy"),
   577  		Format:            fastly.ToPointer(`%h %l %u %t "%r" %>s %b`),
   578  		FormatVersion:     fastly.ToPointer(2),
   579  		ResponseCondition: fastly.ToPointer("Prevent default logging"),
   580  		Placement:         fastly.ToPointer("none"),
   581  		TLSCACert:         fastly.ToPointer("-----BEGIN CERTIFICATE-----foo"),
   582  		TLSHostname:       fastly.ToPointer("example.com"),
   583  		TLSClientCert:     fastly.ToPointer("-----BEGIN CERTIFICATE-----bar"),
   584  		TLSClientKey:      fastly.ToPointer("-----BEGIN PRIVATE KEY-----bar"),
   585  		ParseLogKeyvals:   fastly.ToPointer(false),
   586  		RequestMaxBytes:   fastly.ToPointer(0),
   587  		AuthMethod:        fastly.ToPointer("plain"),
   588  		User:              fastly.ToPointer("user"),
   589  		Password:          fastly.ToPointer("password"),
   590  	}, nil
   591  }