upload.go 1.8 KB

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