コード例 #1
0
        public PublishedWorkbookResult PublishWorkbookWithEmbeddedCredentials(PublishWorkbookRequest publishRequest)
        {
            long fileSize = new System.IO.FileInfo(publishRequest.FilePath).Length;

            PublishedWorkbookResult result;

            if (fileSize > Constants.MaxFilePartSize ||
                Path.GetExtension(publishRequest.FilePath).Equals(".twbx", StringComparison.OrdinalIgnoreCase))
            {
                result = PublishMultiPart(publishRequest);
            }
            else
            {
                result = Publish(publishRequest);
            }

            // Add any tags to the newly-published workbook.
            if (result.IsSuccessful)
            {
                try
                {
                    AddTagsToWorkbook(result.WorkbookId, publishRequest.Tags);
                }
                catch
                {
                    // We swallow any errors here.
                }
            }

            return(result);
        }
コード例 #2
0
        private PublishedWorkbookResult PublishMultiPart(PublishWorkbookRequest publishRequest)
        {
            PublishedWorkbookResult publishedWorkbookResult = new PublishedWorkbookResult(publishRequest);

            try
            {
                // request a new upload session
                var session = this.InitiateFileUpload(publishRequest);

                // upload parts until there are no parts left to upload
                using (FileStream fs = new FileStream(publishRequest.FilePath, FileMode.Open, FileAccess.Read))
                {
                    while (fs.Position < fs.Length)
                    {
                        this.AppendToFileUpload(publishRequest, session, fs);
                    }
                }

                // Finish file upload
                var workbook = this.FinishUploadAndPublishWorkbook(publishRequest, session);

                publishedWorkbookResult.IsSuccessful = true;
                publishedWorkbookResult.WorkbookId   = workbook.id;
                publishedWorkbookResult.Uri          = GetWorkbookUrl(workbook.contentUrl);
            }
            catch (Exception ex)
            {
                publishedWorkbookResult.IsSuccessful = false;
                publishedWorkbookResult.ErrorMessage = ex.Message;
            }

            return(publishedWorkbookResult);
        }
コード例 #3
0
        public workbookType FinishUploadAndPublishWorkbook(PublishWorkbookRequest publishRequest, fileUploadType session)
        {
            var uri = Endpoints.GetFinishPublishWorkbookUri(baseUri, publishRequest.SiteId,
                                                            publishRequest.OverwriteExistingWorkbook, session.uploadSessionId,
                                                            Path.GetExtension(publishRequest.FilePath).Replace(".", ""));
            tsRequest requestPayload = new tsRequest
            {
                Item = new workbookType
                {
                    name = Path.GetFileNameWithoutExtension(publishRequest.FilePath),
                    //showTabs = publishRequest.ShowSheetsAsTabs,
                    //showTabsSpecified = publishRequest.ShowSheetsAsTabs,
                    project = new projectType
                    {
                        id = publishRequest.ProjectId
                    },
                }
            };

            var    boundaryString = Guid.NewGuid().ToString().Replace("-", "");
            string contentType    = String.Format("multipart/mixed; boundary={0}", boundaryString);

            byte[]     requestBody = PublishRequestBuilder.BuildFinishUploadBody(publishRequest.FilePath, requestPayload, boundaryString);
            ApiRequest apiRequest  = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.PublishingTimeoutSeconds);

            // Issue request.
            var        errorMessage = String.Format("Failed to finish multipart publish workbook '{0}'", publishRequest.WorkbookName);
            tsResponse response     = apiRequest.IssueRequest(errorMessage);

            return(response.GetWorkbook());
        }
コード例 #4
0
        public fileUploadType InitiateFileUpload(PublishWorkbookRequest publishRequest)
        {
            var        uri     = Endpoints.GetFileUploadUri(baseUri, publishRequest.SiteId);
            ApiRequest request = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: null, body: null, timeoutSeconds: publishRequest.PublishingTimeoutSeconds);

            var        errorMessage = String.Format("Failed to retrieve session id for new upload to site '{0}'", siteName);
            tsResponse response     = request.IssueRequest(errorMessage);

            // Extract site ID.
            fileUploadType uploadSession = response.GetFileUpload();

            return(uploadSession);
        }
コード例 #5
0
        public fileUploadType AppendToFileUpload(PublishWorkbookRequest publishRequest, fileUploadType fileUploadSession, FileStream fileStream)
        {
            var    uri            = Endpoints.GetFileUploadUri(baseUri, publishRequest.SiteId, fileUploadSession.uploadSessionId);
            var    boundaryString = Guid.NewGuid().ToString().Replace("-", "");
            string contentType    = String.Format("multipart/mixed; boundary={0}", boundaryString);

            byte[] requestBody = PublishRequestBuilder.BuildMultiPartAppendBody(publishRequest.FilePath, boundaryString, fileStream);

            var        errorMessage = String.Format("Failed to append file part for upload to site '{0}' with upload session id '{1}'", siteName, fileUploadSession.uploadSessionId);
            ApiRequest request      = new ApiRequest(uri, HttpMethod.Put, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.PublishingTimeoutSeconds);
            tsResponse response     = request.IssueRequest(errorMessage);

            return(response.GetFileUpload());
        }
コード例 #6
0
        protected PublishedWorkbookResult PublishWorkbook(IRestApiRequestor requestor, string pluginName, string workbookPath)
        {
            var workbookFilename = Path.GetFileName(workbookPath);

            Log.InfoFormat("Publishing workbook '{0}' to {1}..", workbookFilename, tableauConnectionInfo.Uri);

            var publishWorkbookRequest = new PublishWorkbookRequest(workbookPath)
            {
                PluginName  = pluginName,
                SiteId      = siteId,
                SiteName    = tableauConnectionInfo.Site,
                ProjectId   = projectId,
                ProjectName = publishingOptions.ProjectName,
                // Tag the workbook with the name of the plugin that generated it.
                Tags = new HashSet <string>(publishingOptions.Tags)
                {
                    pluginName
                },
                OverwriteExistingWorkbook = publishingOptions.OverwriteExistingWorkbooks,
                ShowSheetsAsTabs          = true,
                PublishingTimeoutSeconds  = tableauConnectionInfo.PublishingTimeoutSeconds
            };

            postgresConnectionInfo.MatchSome(user =>
            {
                publishWorkbookRequest.DatasourceUserName = user.Username;
                publishWorkbookRequest.DatasourcePassword = user.Password;
            });

            PublishedWorkbookResult result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest);
            int attemptsMade = 1;

            while (!result.IsSuccessful && attemptsMade < WorkbookPublishingMaxAttempts)
            {
                Log.WarnFormat("Workbook publishing attempt #{0} failed.  Retrying in {1} {2}..",
                               attemptsMade, WorkbookPublishingRetryDelaySec, "second".Pluralize(WorkbookPublishingRetryDelaySec));
                Thread.Sleep(1000 * WorkbookPublishingRetryDelaySec);

                result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest);
                attemptsMade++;
            }

            if (!result.IsSuccessful)
            {
                Log.ErrorFormat("Publishing of workbook '{0}' failed: {1} [{2} {3} made]", workbookFilename, result.ErrorMessage, attemptsMade, "attempt".Pluralize(attemptsMade));
            }

            return(result);
        }
コード例 #7
0
        protected PublishedWorkbookResult PublishWorkbook(RestApiRequestor requestor, string pluginName, string workbookPath, bool overwriteExistingWorkbook = true)
        {
            var workbookFilename = Path.GetFileName(workbookPath);

            // Tag the workbook with the name of the plugin that generated it.
            logsharkRequest.WorkbookTags.Add(pluginName);

            Log.InfoFormat("Publishing workbook '{0}' to {1}..", workbookFilename, tableauConnectionInfo.ToUri());

            var publishWorkbookRequest = new PublishWorkbookRequest(workbookPath)
            {
                PluginName         = pluginName,
                SiteId             = siteId,
                SiteName           = tableauConnectionInfo.Site,
                ProjectId          = projectId,
                ProjectName        = logsharkRequest.ProjectName,
                DatasourceUserName = postgresConnectionInfo.Username,
                DatasourcePassword = postgresConnectionInfo.Password,
                Tags = logsharkRequest.WorkbookTags,
                OverwriteExistingWorkbook = overwriteExistingWorkbook,
                ShowSheetsAsTabs          = true,
                publishingTimeoutSeconds  = tableauConnectionInfo.PublishingTimeoutSeconds
            };

            PublishedWorkbookResult result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest);
            int attemptsMade = 1;

            while (!result.IsSuccessful && attemptsMade < CoreConstants.WORKBOOK_PUBLISHING_MAX_ATTEMPTS)
            {
                Log.WarnFormat("Workbook publishing attempt #{0} failed.  Retrying in {1} {2}..",
                               attemptsMade, CoreConstants.WORKBOOK_PUBLISHING_RETRY_DELAY_SEC, "second".Pluralize(CoreConstants.WORKBOOK_PUBLISHING_RETRY_DELAY_SEC));
                Thread.Sleep(1000 * CoreConstants.WORKBOOK_PUBLISHING_RETRY_DELAY_SEC);

                result = requestor.PublishWorkbookWithEmbeddedCredentials(publishWorkbookRequest);
                attemptsMade++;
            }

            if (!result.IsSuccessful)
            {
                Log.ErrorFormat("Publishing of workbook '{0}' failed: {1} [{2} {3} made]", workbookFilename, result.ErrorMessage, attemptsMade, "attempt".Pluralize(attemptsMade));
            }

            return(result);
        }
コード例 #8
0
        private async Task <WorkbookPublishResult> PublishWorkbook(string projectId, CompletedWorkbookInfo completedWorkbookInfo, TableauServerRestApi restApi, IList <string> tags)
        {
            if (!completedWorkbookInfo.GeneratedSuccessfully)
            {
                return(new WorkbookPublishResult(
                           completedWorkbookInfo.OriginalWorkbookName,
                           new WorkbookPublishingException($"Workbook {completedWorkbookInfo.OriginalWorkbookName} was not generated successfully. Skipping publishing", completedWorkbookInfo.Exception)));
            }

            var publishWorkbookRequest = new PublishWorkbookRequest(
                completedWorkbookInfo.WorkbookPath,
                projectId,
                completedWorkbookInfo.FinalWorkbookName,
                overwriteExistingWorkbook: true)
            {
                Credentials = _dbCreds,
            };

            WorkbookInfo workbookInfo;

            try
            {
                workbookInfo = await Retry.DoWithRetries <RestApiException, WorkbookInfo>(
                    nameof(WorkbookPublisher),
                    _logger,
                    async() => await restApi.PublishWorkbook(publishWorkbookRequest));

                _logger.LogDebug("Workbook `{publishedWorkbookName}` was published to Tableau Server as ID `{newWorkbookId}`", publishWorkbookRequest.WorkbookNameOnTableauServer, workbookInfo.Id);
            }
            catch (RestApiException ex)
            {
                var errorMessage = $"Failed to publish workbook `{completedWorkbookInfo.WorkbookPath}` after multiple retries. Exception was: {ex.Message}";
                _logger.LogError(errorMessage);
                return(new WorkbookPublishResult(completedWorkbookInfo.OriginalWorkbookName, new WorkbookPublishingException(errorMessage)));
            }

            if (_publisherSettings.ApplyPluginProvidedTagsToWorkbooks && tags != null && tags.Count > 0)
            {
                await AddTagsToWorkbook(workbookInfo, tags, restApi);
            }

            return(new WorkbookPublishResult(workbookInfo.Name));
        }
コード例 #9
0
        private PublishedWorkbookResult Publish(PublishWorkbookRequest publishRequest)
        {
            PublishedWorkbookResult publishedWorkbookResult = new PublishedWorkbookResult(publishRequest);

            try
            {
                var workbook = PublishWorkbook(publishRequest);

                publishedWorkbookResult.IsSuccessful = true;
                publishedWorkbookResult.WorkbookId   = workbook.id;
                publishedWorkbookResult.Uri          = GetWorkbookUrl(workbook.contentUrl);
            }
            catch (Exception ex)
            {
                publishedWorkbookResult.IsSuccessful = false;
                publishedWorkbookResult.ErrorMessage = ex.Message;
            }

            return(publishedWorkbookResult);
        }
コード例 #10
0
        public workbookType PublishWorkbook(PublishWorkbookRequest publishRequest)
        {
            // Construct URI & compose request payload.
            var       uri            = Endpoints.GetPublishWorkbookUri(baseUri, publishRequest.SiteId, publishRequest.OverwriteExistingWorkbook);
            tsRequest requestPayload = new tsRequest
            {
                Item = new workbookType
                {
                    name              = Path.GetFileNameWithoutExtension(publishRequest.FilePath),
                    showTabs          = publishRequest.ShowSheetsAsTabs,
                    showTabsSpecified = publishRequest.ShowSheetsAsTabs,
                    project           = new projectType
                    {
                        id = publishRequest.ProjectId
                    },
                    connectionCredentials = new connectionCredentialsType
                    {
                        name           = publishRequest.DatasourceUserName,
                        password       = publishRequest.DatasourcePassword,
                        embed          = true,
                        embedSpecified = true
                    }
                }
            };

            // Construct multipart request body using a boundary string to delimit sections.
            var    boundaryString = Guid.NewGuid().ToString().Replace("-", "");
            string contentType    = String.Format("multipart/mixed; boundary={0}", boundaryString);

            byte[] requestBody = PublishRequestBuilder.BuildFileUploadBody(publishRequest.FilePath, requestPayload, boundaryString);

            // Issue request.
            var        errorMessage = String.Format("Failed to publish workbook '{0}'", publishRequest.WorkbookName);
            ApiRequest apiRequest   = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.PublishingTimeoutSeconds);
            tsResponse response     = apiRequest.IssueRequest(errorMessage);

            return(response.GetWorkbook());
        }
コード例 #11
0
        private async Task <WorkbookPublishResult> PublishWorkbook(string projectId, CompletedWorkbookInfo completedWorkbookInfo, TableauServerRestApi restApi, IList <string> tags)
        {
            if (!completedWorkbookInfo.GeneratedSuccessfully)
            {
                return(WorkbookPublishResult.Fail(
                           completedWorkbookInfo.OriginalWorkbookName,
                           new WorkbookPublishingException($"Workbook {completedWorkbookInfo.OriginalWorkbookName} was not generated successfully. Skipping publishing", completedWorkbookInfo.Exception)));
            }

            var publishWorkbookRequest = new PublishWorkbookRequest(
                completedWorkbookInfo.WorkbookPath,
                projectId,
                completedWorkbookInfo.FinalWorkbookName,
                overwriteExistingWorkbook: true)
            {
                Credentials = _dbCreds,
            };

            WorkbookPublishResult workbookPublishResult;

            try
            {
                var retryOnExceptionPolicy = Policy
                                             .Handle <RestApiException>()
                                             .WaitAndRetryAsync(
                    new []
                {
                    TimeSpan.FromSeconds(30),
                    TimeSpan.FromSeconds(60),
                },
                    (exception, timeSpan, retryCount, context) =>
                {
                    _logger.LogDebug("Got an exception trying to publish workbook `{failedWorkbookName}`. This is retry number {retryCount}. Exception was: `{exceptionMessage}`", completedWorkbookInfo.FinalWorkbookName ?? "null", retryCount, exception?.Message ?? "null");
                });

                var handleExceptionPolicy = Policy <WorkbookPublishResult>
                                            .Handle <RestApiException>(ex => ex.IsTimeoutException)
                                            .FallbackAsync(WorkbookPublishResult.Timeout(completedWorkbookInfo.FinalWorkbookName));

                workbookPublishResult = await retryOnExceptionPolicy
                                        .WrapAsync(handleExceptionPolicy)
                                        .ExecuteAsync(async() =>
                {
                    var workbookInfo = await restApi.PublishWorkbook(publishWorkbookRequest);
                    return(WorkbookPublishResult.Success(completedWorkbookInfo.FinalWorkbookName, workbookInfo));
                });
            }
            catch (RestApiException ex)
            {
                var errorMessage = $"Failed to publish workbook `{completedWorkbookInfo.WorkbookPath}` after multiple retries. Exception was: {ex.Message}";
                _logger.LogError(errorMessage);
                return(WorkbookPublishResult.Fail(completedWorkbookInfo.OriginalWorkbookName, new WorkbookPublishingException(errorMessage)));
            }

            if (workbookPublishResult.PublishState == WorkbookPublishResult.WorkbookPublishState.Success &&
                _publisherSettings.ApplyPluginProvidedTagsToWorkbooks &&
                tags != null &&
                tags.Count > 0)
            {
                await AddTagsToWorkbook(workbookPublishResult, tags, restApi);
            }

            if (workbookPublishResult.PublishState == WorkbookPublishResult.WorkbookPublishState.Success)
            {
                _logger.LogDebug("Workbook `{publishedWorkbookName}` was published to Tableau Server as ID `{newWorkbookId}`", publishWorkbookRequest.WorkbookNameOnTableauServer, workbookPublishResult.PublishedWorkbookId);
            }
            else
            {
                _logger.LogDebug("Publishing attempt for workbook `{originalWorkbookName}` returned non-successful publishing status. Status: {publishingStatus}", publishWorkbookRequest.WorkbookNameOnTableauServer, workbookPublishResult.PublishState.ToString());
            }

            return(workbookPublishResult);
        }
コード例 #12
0
        public PublishedWorkbookResult PublishWorkbookWithEmbeddedCredentials(PublishWorkbookRequest publishRequest)
        {
            PublishedWorkbookResult publishedWorkbookResult = new PublishedWorkbookResult(publishRequest);

            // Construct URI & compose request payload.
            var       uri            = Endpoints.GetPublishWorkbookUri(baseUri, publishRequest.SiteId, publishRequest.OverwriteExistingWorkbook);
            tsRequest requestPayload = new tsRequest
            {
                Item = new workbookType
                {
                    name              = Path.GetFileNameWithoutExtension(publishRequest.FilePath),
                    showTabs          = publishRequest.ShowSheetsAsTabs,
                    showTabsSpecified = publishRequest.ShowSheetsAsTabs,
                    project           = new projectType
                    {
                        id = publishRequest.ProjectId
                    },
                    connectionCredentials = new connectionCredentialsType
                    {
                        name           = publishRequest.DatasourceUserName,
                        password       = publishRequest.DatasourcePassword,
                        embed          = true,
                        embedSpecified = true
                    }
                }
            };

            // Construct multipart request body using a boundary string to delimit sections.
            var    boundaryString = Guid.NewGuid().ToString().Replace("-", "");
            string contentType    = String.Format("multipart/mixed; boundary={0}", boundaryString);

            byte[] requestBody = PublishRequestBuilder.BuildRequestBody(publishRequest.FilePath, requestPayload, boundaryString);

            // Issue request.
            var        errorMessage = String.Format("Failed to publish workbook '{0}'", publishRequest.WorkbookName);
            ApiRequest apiRequest   = new ApiRequest(uri, HttpMethod.Post, GetAuthToken(), headers: null, contentType: contentType, body: requestBody, timeoutSeconds: publishRequest.publishingTimeoutSeconds);

            try
            {
                tsResponse response = apiRequest.TryIssueRequest(errorMessage);

                publishedWorkbookResult.IsSuccessful = true;
                publishedWorkbookResult.WorkbookId   = response.GetWorkbook().id;
                publishedWorkbookResult.Uri          = GetWorkbookUrl(response.GetWorkbook().contentUrl);
            }
            catch (Exception ex)
            {
                publishedWorkbookResult.IsSuccessful = false;
                publishedWorkbookResult.ErrorMessage = ex.Message;
            }

            // Add any tags to the newly-published workbook.
            if (publishedWorkbookResult.IsSuccessful)
            {
                try
                {
                    AddTagsToWorkbook(publishedWorkbookResult.WorkbookId, publishRequest.Tags);
                }
                catch
                {
                    // We swallow any errors here.
                }
            }

            return(publishedWorkbookResult);
        }