Example #1
0
        public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems)
        {
            AmazonSimpleWorkflowConfig config = new AmazonSimpleWorkflowConfig();

            config.RegionEndpoint = region;
            ConfigureClient(config);
            AmazonSimpleWorkflowClient client = new AmazonSimpleWorkflowClient(creds, config);

            ActivityTypeInfos resp = new ActivityTypeInfos();

            do
            {
                ListActivityTypesRequest req = new ListActivityTypesRequest
                {
                    NextPageToken = resp.NextPageToken
                    ,
                    MaximumPageSize = maxItems
                };

                resp = client.ListActivityTypes(req);
                CheckError(resp.HttpStatusCode, "200");

                foreach (var obj in resp.TypeInfos)
                {
                    AddObject(obj);
                }
            }while (!string.IsNullOrEmpty(resp.NextPageToken));
        }
Example #2
0
        private static async Task MainAsync(string[] args)
        {
            var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("provide key", "provide secret key"), RegionEndpoint.EUWest2);
            var domain = new Domain("GuflowTestDomain", client);
            await domain.RegisterAsync(10, "test guflow");

            await domain.RegisterWorkflowAsync <ExpenseWorkflow>();

            await domain.RegisterWorkflowAsync <ExpenseWorkflowWithTimeout>();

            await domain.RegisterWorkflowAsync <PromotionWorkflow>();

            await domain.RegisterWorkflowAsync <PromotionWorkflowWithTimeout>();

            await domain.RegisterWorkflowAsync <PermitIssueWorkflow>();

            await domain.RegisterWorkflowAsync <PermitIssueWorkflowWithTimeout>();

            await domain.RegisterWorkflowAsync <UserActivateWorkflow>();

            await domain.RegisterWorkflowAsync <UserActivateWorkflowWithTimeout>();

            using (var workflowHost = domain.Host(new Workflow[] { new ExpenseWorkflow(), new ExpenseWorkflowWithTimeout(),
                                                                   new PromotionWorkflow(), new PromotionWorkflowWithTimeout(), new PermitIssueWorkflow(), new PermitIssueWorkflowWithTimeout(),
                                                                   new UserActivateWorkflow(), new UserActivateWorkflowWithTimeout() }))
            {
                workflowHost.OnError(e =>
                {
                    Console.WriteLine(e.Exception); return(ErrorAction.Continue);
                });
                workflowHost.StartExecution();
                Console.WriteLine("Press a key to terminate");
                Console.ReadKey();
            }
        }
        public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems)
        {
            AmazonSimpleWorkflowConfig config = new AmazonSimpleWorkflowConfig();

            config.RegionEndpoint = region;
            ConfigureClient(config);
            AmazonSimpleWorkflowClient client = new AmazonSimpleWorkflowClient(creds, config);

            DecisionTask resp = new DecisionTask();

            do
            {
                PollForDecisionTaskRequest req = new PollForDecisionTaskRequest
                {
                    NextPageToken = resp.NextPageToken
                    ,
                    MaximumPageSize = maxItems
                };

                resp = client.PollForDecisionTask(req);
                CheckError(resp.HttpStatusCode, "200");

                foreach (var obj in resp.Events)
                {
                    AddObject(obj);
                }
            }while (!string.IsNullOrEmpty(resp.NextPageToken));
        }
Example #4
0
        private static async Task MainAsync(string[] args)
        {
            var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("access key", "secret key"), RegionEndpoint.EUWest2);
            var domain = new Domain("GuflowTestDomain", client);
            await domain.RegisterAsync(10, "test guflow");

            await domain.RegisterWorkflowAsync <ParentWorkflow>();

            await domain.RegisterWorkflowAsync <KidPlayWorkflow>();

            var activities = new[] { typeof(PlayOnSwing), typeof(PlayOnZipWire) };

            foreach (var activity in activities)
            {
                await domain.RegisterActivityAsync(activity);
            }

            using (var workflowHost = domain.Host(new Workflow[] { new ParentWorkflow(), new KidPlayWorkflow() }))
                using (var activityHost = domain.Host(activities))
                {
                    workflowHost.OnError(e =>
                    {
                        Console.WriteLine(e.Exception); return(ErrorAction.Continue);
                    });
                    workflowHost.StartExecution();
                    activityHost.StartExecution();
                    Console.WriteLine("Press a key to terminate");
                    Console.ReadKey();
                }
        }
Example #5
0
 internal AWSOrchestration(AmazonSimpleWorkflowClient amazonSimpleWorkflowClient, string orchestrationId, IPersistantStore store, string lambdaRole)
 {
     _amazonSimpleWorkflowClient = amazonSimpleWorkflowClient;
     _orchestrationId            = orchestrationId;
     _store      = store;
     _lambdaRole = lambdaRole;
 }
Example #6
0
        private static async Task MainAsync(string[] args)
        {
            var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("access key", "secret key"), RegionEndpoint.EUWest2);
            var domain = new Domain("GuflowTestDomain", client);
            await domain.RegisterWorkflowAsync <DriverWorkflow>();

            await domain.RegisterWorkflowAsync <LogProcessWorkflow>();

            var activityTypes = new[] { typeof(DownloadLogActivity), typeof(UpdateMetricesActivity) };

            foreach (var activityType in activityTypes)
            {
                await domain.RegisterActivityAsync(activityType);
            }

            using (var activitiHost = domain.Host(activityTypes))
                using (var driverWorkflowHost = domain.Host(new[] { new DriverWorkflow() }))
                    using (var workflowHost = domain.Host(new[] { new LogProcessWorkflow() }))
                    {
                        activitiHost.StartExecution();
                        var taskList = new TaskList("tasklist");
                        taskList.ReadStrategy = TaskList.ReadFirstPage;
                        driverWorkflowHost.StartExecution(taskList);
                        workflowHost.StartExecution();
                        Console.WriteLine("Press any key to terminate");
                        Console.ReadKey();
                    }
        }
Example #7
0
        private static async Task MainAsync(string[] args)
        {
            var client = new AmazonSimpleWorkflowClient(new BasicAWSCredentials("secrete id",
                                                                                "secret"), RegionEndpoint.EUWest2);
            var domain = new Domain("GuflowTestDomain", client);
            await domain.RegisterAsync(10, "test guflow");

            await domain.RegisterWorkflowAsync <BookingWorkflow>();

            var activities = new[]
            {
                typeof(BookFlight), typeof(BookHotel), typeof(ChooseFlightMeal),
                typeof(BookDinner), typeof(SendConfirmation)
            };

            foreach (var activity in activities)
            {
                await domain.RegisterActivityAsync(activity);
            }

            using (var activityHost = domain.Host(activities))
                using (var workflowHost = domain.Host(new [] { new BookingWorkflow() }))
                {
                    activityHost.StartExecution();
                    workflowHost.StartExecution();

                    Console.WriteLine("Press a key to terminate");
                    Console.ReadKey();
                }
        }
 public AWSOrchestrationFactory(bool usePersistantStore, string lambdaRole)
 {
     _amazonSimpleWorkflowClient = new AmazonSimpleWorkflowClient();
     _lambdaRole = lambdaRole;
     if (usePersistantStore)
     {
         _store = new AWSPeristantStore( );
     }
 }
 public AWSOrchestrationFactory(string awsAccessKey, string awsSecretAccessKey, string awsRegion, bool usePersistantStore, string lambdaRole)
 {
     _amazonSimpleWorkflowClient = new AmazonSimpleWorkflowClient(awsAccessKey, awsSecretAccessKey, RegionEndpoint.GetBySystemName(awsRegion));
     _lambdaRole = lambdaRole;
     if (usePersistantStore)
     {
         _store = new AWSPeristantStore(awsAccessKey, awsSecretAccessKey, awsRegion);
     }
 }
        private static void StartEchoWorkflow()
        {
            var client = new AmazonSimpleWorkflowClient();

            var activity = WorkflowFactory.CreateActivity <string, string>("echo", Echo, 60, 10, 10, 20)
                           .Complete();
            var workflow = WorkflowFactory.CreateWorkflow("theburningmonk.com", "echo_cs", "1")
                           .Attach(activity)
                           .Complete();

            workflow.Start(client);
        }
        protected IAmazonSimpleWorkflow CreateClient(AWSCredentials credentials, RegionEndpoint region)
        {
            var config = new AmazonSimpleWorkflowConfig {
                RegionEndpoint = region
            };

            Amazon.PowerShell.Utils.Common.PopulateConfig(this, config);
            this.CustomizeClientConfig(config);
            var client = new AmazonSimpleWorkflowClient(credentials, config);

            client.BeforeRequestEvent += RequestEventHandler;
            client.AfterResponseEvent += ResponseEventHandler;
            return(client);
        }
        public async Task <bool> Run()
        {
            //Create dependencies
            var settings           = this.CreateSettings();
            var emrJobLogger       = new EmrJobLogger();
            var emrJobStateChecker = new EmrJobStateChecker();

            var emrClient = new AmazonElasticMapReduceClient(AccessKey, SecretKey, RegionEndpoint.USEast1);
            var swfClient = new AmazonSimpleWorkflowClient(AccessKey, SecretKey, RegionEndpoint.USEast1);
            var swfConfig = new DemoSwfConfiguration();

            SwfManager swfManager = new SwfManager(emrJobLogger, swfClient, swfConfig);
            await swfManager.SetupAsync();

            using (var decider = new SwfEmrJobDecider(emrJobLogger, swfClient, swfConfig))
                using (var runner = new SwfActivitiesRunner(emrJobLogger, emrJobStateChecker, settings, emrClient, swfClient, swfConfig))
                {
                    //decider.Start
                }

            return(true);
        }
        private static void StartCountHtmlElementsWorkflow()
        {
            var client = new AmazonSimpleWorkflowClient();

            var echo = WorkflowFactory.CreateActivity <string, string>("echo", Echo, 60, 10, 10, 20)
                       .Complete();
            var countDiv = WorkflowFactory.CreateActivity <string, int>("count_divs", address => CountMatches("<div", address), 60, 10, 10, 20)
                           .WithDescription("count the number of <div> elements")
                           .Complete();
            var countScripts = WorkflowFactory.CreateActivity <string, int>("count_scripts", address => CountMatches("<script", address), 60, 10, 10, 20)
                               .WithDescription("count the number of <script> elements")
                               .Complete();
            var countSpans = WorkflowFactory.CreateActivity <string, int>("count_spans", address => CountMatches("<span", address), 60, 10, 10, 20)
                             .WithDescription("count the number of <span> elements")
                             .Complete();

            var workflow = WorkflowFactory.CreateWorkflow("theburningmonk.com", "count_html_elements_cs", "1")
                           .Attach(echo)
                           .Attach(new[] { countDiv, countScripts, countSpans }, MatchesReducer)
                           .Attach(echo)
                           .Complete();

            workflow.Start(client);
        }
Example #14
0
 public AWSRESTService(string awsAccessKey, string awsSecretAccessKey, string awsRegion)
 {
     _amazonSimpleWorkflowClient = new AmazonSimpleWorkflowClient(awsAccessKey, awsSecretAccessKey, RegionEndpoint.GetBySystemName(awsRegion));
 }
Example #15
0
        public static void Main(string[] args)
        {
            // Define the workflows that we know of that event processor will be handling
            var workflows = new Dictionary <string, Type>
            {
                { "CustomerOrderWorkflow", typeof(CustomerOrderWorkflow) },
                { "VerifyCustomerWorkflow", typeof(VerifyCustomerWorkflow) }
            };


            // Stopwatch to see how well we are performing
            var stopwatch = new Stopwatch();

            // We will use this ID as our decision task ID and activity task ID to identify ourselves when polling for
            // decision and activity tasks.
            var workflowWorkerIdentity = Guid.NewGuid();

            // Print out our AWS SWF domains, workflows and activities
            Console.Write(GetServiceOutput());

            var loop = true;

            do
            {
                // Our super simple application menu
                Console.WriteLine("");
                Console.WriteLine("=============");
                Console.WriteLine("| Main Menu |");
                Console.WriteLine("=============");
                Console.WriteLine("[1] Submit a new workflow");
                Console.WriteLine("[2] Wait for decide using a decision task");
                Console.WriteLine("[3] Wait for and do some work for an activity task");
                Console.WriteLine("[4] Quit");

                Console.Write("\nChoice: ");
                var key = Console.ReadLine();

                if (String.IsNullOrEmpty(key))
                {
                    continue;
                }

                switch (key)
                {
                // Initiate a workflow execution
                case "1":
                {
                    Console.WriteLine("Option [1] selected - Submit a new workflow");

                    // SWF client is disposable, so dispose it
                    using (var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2))
                    {
                        // Our simple property bag: we just need to the email for the account
                        var propertyBag = new Dictionary <string, object> {
                            { "SampleOrderNumber", "12345" }
                        };

                        // Setup the workflow request
                        var workflowRequest = new StartWorkflowExecutionRequest
                        {
                            Domain       = "demo-domain",
                            WorkflowId   = Guid.NewGuid().ToString(),
                            WorkflowType = new WorkflowType
                            {
                                Name    = "CustomerOrderWorkflow",
                                Version = "1.0"
                            },
                            Input = JsonConvert.SerializeObject(propertyBag)
                        };

                        try
                        {
                            // Call AWS SWF and submit the workflow request
                            swfClient.StartWorkflowExecution(workflowRequest);
                        }
                        catch (AmazonSimpleWorkflowException ex)
                        {
                            Console.WriteLine("Caught Exception: " + ex.Message);
                            Console.WriteLine("Response Status Code: " + ex.StatusCode);
                            Console.WriteLine("Error Code: " + ex.ErrorCode);
                            Console.WriteLine("Error Type: " + ex.ErrorType);
                            Console.WriteLine("Request ID: " + ex.RequestId);
                            Console.WriteLine("Data: " + ex.Data);
                            Console.WriteLine("Stacktrace: " + ex.StackTrace);
                        }
                    }
                }
                break;

                // Poll for decision task
                case "2":
                {
                    Console.WriteLine("Option [2] selected - Wait for decide using a decision task");
                    Console.WriteLine("Waiting...");

                    // SWF client is disposable, so dispose it
                    using (var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2))
                    {
                        try
                        {
                            // Setup the decision request
                            var decisionTaskRequest = new PollForDecisionTaskRequest
                            {
                                Domain   = "demo-domain",
                                Identity = workflowWorkerIdentity.ToString(),
                                TaskList = new TaskList {
                                    Name = "DeciderTaskList-Default"
                                }
                            };

                            // Call AWS SWF and wait for (default timeout: 60 secs) a decision task
                            var decisionTaskResponse = swfClient.PollForDecisionTask(decisionTaskRequest);

                            // Task token being an empty string means there are no tasks available and
                            // we are past the 60 seconds that AWS holds a connection in case a task
                            // becomes available. If this is the case, we simply retry.
                            var taskToken =
                                decisionTaskResponse.DecisionTask.TaskToken;
                            if (!String.IsNullOrEmpty(taskToken))
                            {
                                // We have a valid task, do something...
                                var decisionTask =
                                    decisionTaskResponse.DecisionTask;

                                switch (decisionTask.WorkflowType.Name)
                                {
                                case "CustomerOrderWorkflow":
                                case "VerifyCustomerWorkflow":
                                {
                                    Debug.Assert(decisionTask.WorkflowType.Version == "1.0");
                                }
                                break;

                                default:
                                    Console.WriteLine("ERROR: Unknown workflow.");
                                    break;
                                }

                                // Define a new WorkflowEventsProcessor object and let it make the decision!
                                stopwatch.Start();
                                var workflowProcessor = new WorkflowEventsProcessor(decisionTask, workflows, decisionTaskRequest, swfClient);
                                var decisionRequest   = workflowProcessor.Decide();
                                stopwatch.Stop();

                                Console.WriteLine(">>> Decision(s) made in " + stopwatch.ElapsedMilliseconds + "ms");

                                // We have our decision, send it away and do something
                                // more productive with the response
                                swfClient.RespondDecisionTaskCompleted(decisionRequest);
                            }
                        }
                        catch (AmazonSimpleWorkflowException ex)
                        {
                            Console.WriteLine("Caught Exception: " + ex.Message);
                            Console.WriteLine("Response Status Code: " + ex.StatusCode);
                            Console.WriteLine("Error Code: " + ex.ErrorCode);
                            Console.WriteLine("Error Type: " + ex.ErrorType);
                            Console.WriteLine("Request ID: " + ex.RequestId);
                            Console.WriteLine("Data: " + ex.Data);
                            Console.WriteLine("Stacktrace: " + ex.StackTrace);
                        }
                    }
                }
                break;

                // Poll for activity task
                case "3":
                {
                    Console.WriteLine("Option [3] selected - Wait for decide using a activity task");
                    Console.WriteLine("Waiting...");

                    // SWF client is disposable, so dispose it
                    using (var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2))
                    {
                        try
                        {
                            // Setup the activity request
                            var activityTaskRequest = new PollForActivityTaskRequest
                            {
                                Domain   = "demo-domain",
                                Identity = workflowWorkerIdentity.ToString(),
                                TaskList = new TaskList {
                                    Name = "ActivityTaskList-Default"
                                }
                            };

                            // Call AWS SWF and wait for (default timeout: 60 secs) a activity task
                            var activityTaskResponse = swfClient.PollForActivityTask(activityTaskRequest);

                            // Task token being an empty string means there are no tasks available and
                            // we are past the 60 seconds that AWS holds a connection in case a task
                            // becomes available. If this is the case, we simply retry.
                            var taskToken =
                                activityTaskResponse.ActivityTask.TaskToken;
                            if (!String.IsNullOrEmpty(taskToken))
                            {
                                // We have a valid task, do something...
                                var activityTask =
                                    activityTaskResponse.ActivityTask;

                                Console.WriteLine("\n");
                                Console.WriteLine(">>> Activity: " + activityTask.ActivityType.Name);

                                // In the real world we would define the activity code in a separate object
                                // and fire off a thread to actually work on it but in this case we are just
                                // testing the workflow so this suffices
                                switch (activityTask.ActivityType.Name)
                                {
                                // CustomerOrderWorkflow activities
                                case "VerifyOrder":
                                case "ShipOrder":
                                {
                                    Debug.Assert(activityTask.ActivityType.Version == "1.0");
                                }
                                break;

                                // VerifyCustomerWorkflow activities
                                case "VerifyCustomerAddress":
                                case "CheckFraudDB":
                                case "ChargeCreditCard":
                                {
                                    Debug.Assert(activityTask.ActivityType.Version == "1.0");
                                }
                                break;

                                default:
                                    Console.WriteLine("ERROR: Unknown activity.");
                                    break;
                                }

                                var activityCompletedRequest = new RespondActivityTaskCompletedRequest
                                {
                                    TaskToken = activityTask.TaskToken,
                                    Result    = activityTask.Input
                                };

                                // Completion request setup complete, send it away. NOTE: Do something more
                                // productive with the response
                                swfClient.RespondActivityTaskCompleted(activityCompletedRequest);

                                //var activityFailedRequest = new RespondActivityTaskFailedRequest
                                //    {
                                //        TaskToken = activityTask.TaskToken,
                                //        Details = "Test failure."
                                //    };
                                //// Completion request setup complete, send it away. NOTE: Do something more
                                //// productive with the response
                                //swfClient.RespondActivityTaskFailed(activityFailedRequest);
                            }
                        }
                        catch (AmazonSimpleWorkflowException ex)
                        {
                            Console.WriteLine("Caught Exception: " + ex.Message);
                            Console.WriteLine("Response Status Code: " + ex.StatusCode);
                            Console.WriteLine("Error Code: " + ex.ErrorCode);
                            Console.WriteLine("Error Type: " + ex.ErrorType);
                            Console.WriteLine("Request ID: " + ex.RequestId);
                            Console.WriteLine("Data: " + ex.Data);
                            Console.WriteLine("Stacktrace: " + ex.StackTrace);
                        }
                    }
                }
                break;

                case "4":
                    // Quit
                    loop = false;
                    break;

                default:
                    Console.WriteLine("ERROR: Unknown command.");
                    break;
                }
            } while (loop);
        }
Example #16
0
        public static string GetServiceOutput()
        {
            var sb = new StringBuilder(1024);

            using (var sr = new StringWriter(sb))
            {
                sr.WriteLine("===============================");
                sr.WriteLine("| AWS Simple Workflow Service |");
                sr.WriteLine("===============================");

                try
                {
                    // Print the available domains, workflows and activities. Region endpoint depends on where
                    // you chose to set up your workflow domain
                    var swfClient = new AmazonSimpleWorkflowClient(RegionEndpoint.USWest2);

                    sr.WriteLine();
                    var listDomainRequest = new ListDomainsRequest
                    {
                        RegistrationStatus = "REGISTERED"
                    };

                    var listDomainResponse = swfClient.ListDomains(listDomainRequest);
                    foreach (var domain in listDomainResponse.DomainInfos.Infos)
                    {
                        sr.WriteLine("[" + domain.Name + "]");
                        sr.WriteLine("status: " + domain.Status);
                        sr.WriteLine("description: " + domain.Description);

                        sr.WriteLine("\n  WORKFLOWS");
                        var listWorkflowRequest = new ListWorkflowTypesRequest
                        {
                            Domain             = domain.Name,
                            RegistrationStatus = "REGISTERED"
                        };
                        var listWorkflowTypesResponse = swfClient.ListWorkflowTypes(listWorkflowRequest);
                        foreach (
                            var workflow in
                            listWorkflowTypesResponse.WorkflowTypeInfos.TypeInfos)
                        {
                            sr.WriteLine("  [" + workflow.WorkflowType.Name + "] (" + workflow.WorkflowType.Version + ") " + workflow.Status);
                            sr.WriteLine("  creation: " + workflow.CreationDate);
                            sr.WriteLine("  deprecation: " + workflow.DeprecationDate);
                            sr.WriteLine("  description:" + TrimStringToLength(workflow.Description, 60, "", "              "));
                            sr.WriteLine();
                        }

                        sr.WriteLine("\n  ACTIVITIES");
                        var listActivityRequest = new ListActivityTypesRequest
                        {
                            Domain             = domain.Name,
                            RegistrationStatus = "REGISTERED"
                        };
                        var listActivityResponse = swfClient.ListActivityTypes(listActivityRequest);
                        foreach (
                            var activity in listActivityResponse.ActivityTypeInfos.TypeInfos)
                        {
                            sr.WriteLine("  [" + activity.ActivityType.Name + "] (" + activity.ActivityType.Version + ") " + activity.Status);
                            sr.WriteLine("  creation: " + activity.CreationDate);
                            sr.WriteLine("  deprecation: " + activity.DeprecationDate);
                            sr.WriteLine("  description:" + TrimStringToLength(activity.Description, 60, "", "              "));
                            sr.WriteLine();
                        }
                    }
                }
                catch (AmazonSimpleWorkflowException ex)
                {
                    if (ex.ErrorCode != null && ex.ErrorCode.Equals("AuthFailure"))
                    {
                        sr.WriteLine("The account you are using is not signed up for Amazon SWF.");
                        sr.WriteLine("You can sign up for Amazon SWF at http://aws.amazon.com/swf");
                    }
                    else
                    {
                        sr.WriteLine("Caught Exception: " + ex.Message);
                        sr.WriteLine("Response Status Code: " + ex.StatusCode);
                        sr.WriteLine("Error Code: " + ex.ErrorCode);
                        sr.WriteLine("Error Type: " + ex.ErrorType);
                        sr.WriteLine("Request ID: " + ex.RequestId);
                        sr.WriteLine("Data: " + ex.Data);
                        sr.WriteLine("Stacktrace: " + ex.StackTrace);
                    }
                }
                sr.WriteLine();
            }
            return(sb.ToString());
        }