environment.go 1.7 KB

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