environment.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package aws_manager
  2. import (
  3. "fmt"
  4. "net"
  5. "net/http"
  6. "os"
  7. "time"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
  9. )
  10. var (
  11. AWS_LAUNCH_LOCK_PREFIX = "aws_launch_lock_"
  12. )
  13. func (r *AWSPluginRuntime) InitEnvironment() error {
  14. if err := r.initEnvironment(); err != nil {
  15. return err
  16. }
  17. // init http client
  18. r.client = &http.Client{
  19. Transport: &http.Transport{
  20. Dial: (&net.Dialer{
  21. Timeout: 5 * time.Second,
  22. KeepAlive: 15 * time.Second,
  23. }).Dial,
  24. IdleConnTimeout: 120 * time.Second,
  25. },
  26. }
  27. return nil
  28. }
  29. func (r *AWSPluginRuntime) initEnvironment() error {
  30. r.Log("Starting to initialize environment")
  31. // check if the plugin has already been initialized, at most 300s
  32. if err := cache.Lock(AWS_LAUNCH_LOCK_PREFIX+r.Checksum(), 300*time.Second, 300*time.Second); err != nil {
  33. return err
  34. }
  35. defer cache.Unlock(AWS_LAUNCH_LOCK_PREFIX + r.Checksum())
  36. r.Log("Started to initialize environment")
  37. identity, err := r.Identity()
  38. if err != nil {
  39. return err
  40. }
  41. function, err := fetchLambda(identity, r.Checksum())
  42. if err != nil {
  43. if err != ErrNoLambdaFunction {
  44. return err
  45. }
  46. } else {
  47. // found, return directly
  48. r.lambda_url = function.FunctionURL
  49. r.lambda_name = function.FunctionName
  50. r.Log(fmt.Sprintf("Found existing lambda function: %s", r.lambda_name))
  51. return nil
  52. }
  53. // create it if not found
  54. r.Log("Creating new lambda function")
  55. // create lambda function
  56. packager := NewPackager(r, r.Decoder)
  57. context, err := packager.Pack()
  58. if err != nil {
  59. return err
  60. }
  61. defer os.Remove(context.Name())
  62. defer context.Close()
  63. response, err := launchLambda(identity, r.Checksum(), context)
  64. if err != nil {
  65. return err
  66. }
  67. for response.Next() {
  68. response, err := response.Read()
  69. if err != nil {
  70. return err
  71. }
  72. switch response.Event {
  73. case Error:
  74. return fmt.Errorf("error: %s", response.Message)
  75. case LambdaUrl:
  76. r.lambda_url = response.Message
  77. case Lambda:
  78. r.lambda_name = response.Message
  79. case Info:
  80. r.Log(fmt.Sprintf("installing: %s", response.Message))
  81. }
  82. }
  83. return nil
  84. }
  85. func (r *AWSPluginRuntime) Checksum() string {
  86. return ""
  87. }