2
0

random_string_driver.go 1.6 KB

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