random_string_driver.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package preview
  2. import (
  3. "crypto/rand"
  4. "github.com/mitchellh/mapstructure"
  5. "github.com/porter-dev/porter/internal/integrations/preview"
  6. "github.com/porter-dev/switchboard/pkg/drivers"
  7. "github.com/porter-dev/switchboard/pkg/models"
  8. )
  9. const (
  10. defaultCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  11. lowerCharset = "abcdefghijklmnopqrstuvwxyz"
  12. )
  13. type RandomStringDriver struct {
  14. output map[string]interface{}
  15. config *preview.RandomStringDriverConfig
  16. }
  17. func NewRandomStringDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
  18. driver := &RandomStringDriver{
  19. output: make(map[string]interface{}),
  20. }
  21. driverConfig := &preview.RandomStringDriverConfig{}
  22. err := mapstructure.Decode(resource.Config, driverConfig)
  23. if err != nil {
  24. return nil, err
  25. }
  26. if driverConfig.Length == 0 {
  27. driverConfig.Length = 8
  28. }
  29. driver.config = driverConfig
  30. return driver, nil
  31. }
  32. func (d *RandomStringDriver) ShouldApply(resource *models.Resource) bool {
  33. return true
  34. }
  35. func (d *RandomStringDriver) Apply(resource *models.Resource) (*models.Resource, error) {
  36. useCharset := defaultCharset
  37. if d.config.Lower {
  38. useCharset = lowerCharset
  39. }
  40. d.output["value"] = randomString(int(d.config.Length), useCharset)
  41. return resource, nil
  42. }
  43. func (d *RandomStringDriver) Output() (map[string]interface{}, error) {
  44. return d.output, nil
  45. }
  46. func randomString(length int, charset string) string {
  47. ll := len(charset)
  48. b := make([]byte, length)
  49. rand.Read(b) // generates len(b) random bytes
  50. for i := 0; i < length; i++ {
  51. b[i] = charset[int(b[i])%ll]
  52. }
  53. return string(b)
  54. }