Base class on top of which requests to Tableau Server are based
Exemplo n.º 1
0
    private SiteProject CreateProject(string projectName, string projectDescription)
    {
        //ref: http://onlinehelp.tableau.com/current/api/rest_api/en-us/help.htm#REST/rest_api_ref.htm#Create_Project%3FTocPath%3DAPI%2520Reference%7C_____12
        var sb          = new StringBuilder();
        var xmlSettings = new XmlWriterSettings();

        xmlSettings.OmitXmlDeclaration = true;
        var xmlWriter = XmlWriter.Create(sb, xmlSettings);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("project");
        xmlWriter.WriteAttributeString("name", projectName);
        xmlWriter.WriteAttributeString("description", projectDescription);
        xmlWriter.WriteEndElement(); //</project>
        xmlWriter.WriteEndElement(); // </tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Generate the MIME message
        //var mimeGenerator = new OnlineMimeXmlPayload(xmlText);

        //Create a web request
        var urlCreateProject = _onlineUrls.Url_CreateProject(_onlineSession);
        var webRequest       = this.CreateLoggedInWebRequest(urlCreateProject, "POST");

        TableauServerRequestBase.SendPostContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "create project");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);


            //Get all the workbook nodes
            var nsManager    = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeProject = xmlDoc.SelectSingleNode("//iwsOnline:project", nsManager);

            try
            {
                return(new SiteProject(xNodeProject));
            }
            catch (Exception parseXml)
            {
                StatusLog.AddError("Data source upload, error parsing XML resposne " + parseXml.Message + "\r\n" + xNodeProject.InnerXml);
                return(null);
            }
        }
    }
Exemplo n.º 2
0
    private SiteUser UpdateUser(string userId, string newRole, SiteUserAuth newAuthentication)
    {
        AppDiagnostics.Assert(!string.IsNullOrWhiteSpace(userId), "missing user id");
        AppDiagnostics.Assert(!string.IsNullOrWhiteSpace(newRole), "missing role");

        string newAuthenticationText = SendCreateUser.SiteUserAuthToAttributeText(newAuthentication);

        //ref: https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#update_user
        var sb        = new StringBuilder();
        var xmlWriter = XmlWriter.Create(sb, XmlHelper.XmlSettingsForWebRequests);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("user");
        xmlWriter.WriteAttributeString("siteRole", newRole);
        xmlWriter.WriteAttributeString("authSetting", newAuthenticationText);
        xmlWriter.WriteEndElement(); //</user>
        xmlWriter.WriteEndElement(); // </tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Create a web request
        var urlUpdateUser = _onlineUrls.Url_UpdateSiteUser(_onlineSession, userId);
        var webRequest    = this.CreateLoggedInWebRequest(urlUpdateUser, "PUT");

        TableauServerRequestBase.SendPutContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "update yser (change auth or role)");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);


            //Get all the user nodes
            var nsManager = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeUser = xmlDoc.SelectSingleNode("//iwsOnline:user", nsManager);

            try
            {
                return(SiteUser.FromUserXMLWithoutUserId(xNodeUser, userId));
            }
            catch (Exception parseXml)
            {
                StatusLog.AddError("Update user, error parsing XML response " + parseXml.Message + "\r\n" + xNodeUser.InnerXml);
                return(null);
            }
        }
    }
Exemplo n.º 3
0
    /// <summary>
    /// Create the user on the server
    /// </summary>
    /// <param name="userName"></param>
    /// <param name="userRole"></param>
    /// <param name="userAuthentication"></param>
    /// <returns></returns>
    private SiteUser CreateUser(string userName, string userRole, SiteUserAuth userAuthentication)
    {
        string authSettingText = SiteUserAuthToAttributeText(userAuthentication);

        //ref: https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#add_user_to_site
        var sb        = new StringBuilder();
        var xmlWriter = XmlWriter.Create(sb, XmlHelper.XmlSettingsForWebRequests);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("user");
        xmlWriter.WriteAttributeString("name", userName);
        xmlWriter.WriteAttributeString("siteRole", userRole);
        xmlWriter.WriteAttributeString("authSetting", authSettingText);
        xmlWriter.WriteEndElement(); //</user>
        xmlWriter.WriteEndElement(); //</tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Generate the MIME message

        //Create a web request
        var urlCreateUser = _onlineUrls.Url_CreateSiteUser(_onlineSession);
        var webRequest    = this.CreateLoggedInWebRequest(urlCreateUser, "POST");

        TableauServerRequestBase.SendPostContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "create user");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);

            //Get all the workbook nodes
            var nsManager    = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeProject = xmlDoc.SelectSingleNode("//iwsOnline:user", nsManager);

            try
            {
                return(new SiteUser(xNodeProject));
            }
            catch (Exception parseXml)
            {
                StatusLog.AddError("Create user, error parsing XML response " + parseXml.Message + "\r\n" + xNodeProject.InnerXml);
                return(null);
            }
        }
    }
Exemplo n.º 4
0
    private SiteFlow ChangeContentOwner(string flowId, string newOwnerId)
    {
        AppDiagnostics.Assert(!string.IsNullOrWhiteSpace(flowId), "missing flow id");
        AppDiagnostics.Assert(!string.IsNullOrWhiteSpace(newOwnerId), "missing owner id");

        //ref: https://onlinehelp.tableau.com/current/api/rest_api/en-us/help.htm#REST/rest_api_ref.htm#Update_Flow%3FTocPath%3DAPI%2520Reference%7C_____76
        var sb        = new StringBuilder();
        var xmlWriter = XmlWriter.Create(sb, XmlHelper.XmlSettingsForWebRequests);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("flow");
        xmlWriter.WriteStartElement("owner");
        xmlWriter.WriteAttributeString("id", newOwnerId);
        xmlWriter.WriteEndElement(); //</owner>
        xmlWriter.WriteEndElement(); //</flow>
        xmlWriter.WriteEndElement(); // </tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Create a web request
        var urlUpdateFlow = _onlineUrls.Url_UpdateFlow(_onlineSession, flowId);
        var webRequest    = this.CreateLoggedInWebRequest(urlUpdateFlow, "PUT");

        TableauServerRequestBase.SendPutContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "update flow (change owner)");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);


            //Get all the flow nodes
            var nsManager = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeDs   = xmlDoc.SelectSingleNode("//iwsOnline:flow", nsManager);

            try
            {
                return(new SiteFlow(xNodeDs));
            }
            catch (Exception parseXml)
            {
                StatusLog.AddError("Change flow owner, error parsing XML response " + parseXml.Message + "\r\n" + xNodeDs.InnerXml);
                return(null);
            }
        }
    }
Exemplo n.º 5
0
    /// <summary>
    /// Create the group on the server
    /// </summary>
    /// <param name="groupName"></param>
    /// <returns></returns>
    private SiteGroup CreateGroup(string groupName)
    {
        //ref: https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#create_group
        var sb        = new StringBuilder();
        var xmlWriter = XmlWriter.Create(sb, XmlHelper.XmlSettingsForWebRequests);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("group");
        xmlWriter.WriteAttributeString("name", groupName);
        xmlWriter.WriteEndElement(); //</user>
        xmlWriter.WriteEndElement(); //</tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Generate the MIME message

        //Create a web request
        var urlCreateGroup = _onlineUrls.Url_CreateSiteGroup(_onlineSession);
        var webRequest     = this.CreateLoggedInWebRequest(urlCreateGroup, "POST");

        TableauServerRequestBase.SendPostContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "create group");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);

            //Get all the workbook nodes
            var nsManager  = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeGroup = xmlDoc.SelectSingleNode("//iwsOnline:group", nsManager);

            try
            {
                return(new SiteGroup(xNodeGroup, null));
            }
            catch (Exception exParseXml)
            {
                StatusLog.AddError("Create user, error parsing XML response " + exParseXml.Message + "\r\n" + xNodeGroup.InnerXml);
                return(null);
            }
        }
    }
    /// <summary>
    /// Create the user on the server
    /// </summary>
    /// <param name="userId"></param>
    /// <param name="groupId"></param>
    /// <param name="userAuthentication"></param>
    /// <returns>TRUE: Suceess</returns>
    private bool AddUserToGroup(string userId, string groupId)
    {
        //ref: https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#add_user_to_group
        var sb        = new StringBuilder();
        var xmlWriter = XmlWriter.Create(sb, XmlHelper.XmlSettingsForWebRequests);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("user");
        xmlWriter.WriteAttributeString("id", userId);
        xmlWriter.WriteEndElement(); //</user>
        xmlWriter.WriteEndElement(); //</tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Generate the MIME message

        //Create a web request
        var urlAddUserToGroup = _onlineUrls.Url_AddUserToGroup(_onlineSession, groupId);
        var webRequest        = this.CreateLoggedInWebRequest(urlAddUserToGroup, "POST");

        TableauServerRequestBase.SendPostContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "add user to group");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);

            //Get all the workbook nodes
            var nsManager = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeUser = xmlDoc.SelectSingleNode("//iwsOnline:user", nsManager);

            if (xNodeUser == null)
            {
                StatusLog.AddError("Add user to group failed. Repsonse was not a USER node");
                return(false); //Failure
            }

            return(true); //Success
        }
    }
Exemplo n.º 7
0
    /// <summary>
    /// Update the group
    /// </summary>
    /// <returns>TRUE: Success.  FALSE: failed/error</returns>
    private bool UpdateGroup()
    {
        AppDiagnostics.Assert(!string.IsNullOrWhiteSpace(this.GroupId), "920-1053: missing group id");
        AppDiagnostics.Assert(!string.IsNullOrWhiteSpace(this.UpdatedGroupName), "920-1054: missing role");

        //[2020-09-20] NOTE: Currently this function DOES NOT work for Active Directory syncronized groups (on premises Tableau Serer)

        //ref: https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#update_group
        var sb        = new StringBuilder();
        var xmlWriter = XmlWriter.Create(sb, XmlHelper.XmlSettingsForWebRequests);

        xmlWriter.WriteStartElement("tsRequest");
        xmlWriter.WriteStartElement("group");
        xmlWriter.WriteAttributeString("name", this.UpdatedGroupName);

        //If we are updating the grant license parts, write these here
        //[2020-09-20] For (on premises Server) Active Directory sync, this would need to be different XML (inside an "import" node)
        if (this.PerformUpdateGrantLicense)
        {
            xmlWriter.WriteAttributeString("grantLicenseMode", this.UpdatedGrantLicenseMode);

            //If the Grant license mode is blank, set the license role to be UNLICENSED
            //This is required to remove the licensing mode: https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm#update_group
            string updateLicenseMode = this.UpdatedGrantLicenseSiteRole;
            if (string.IsNullOrEmpty(this.UpdatedGrantLicenseMode))
            {
                updateLicenseMode = "UNLICENSED";
            }
            xmlWriter.WriteAttributeString("minimumSiteRole", updateLicenseMode);
        }

        xmlWriter.WriteEndElement(); //</group>
        xmlWriter.WriteEndElement(); // </tsRequest>
        xmlWriter.Close();

        var xmlText = sb.ToString(); //Get the XML text out

        //Create a web request
        var urlUpdateGroup = this._onlineSession.ServerUrls.Url_UpdateSiteGroup(_onlineSession, this.GroupId);
        var webRequest     = this.CreateLoggedInWebRequest(urlUpdateGroup, "PUT");

        TableauServerRequestBase.SendPutContents(webRequest, xmlText);

        //Get the response
        var response = GetWebReponseLogErrors(webRequest, "update group (change name/grant-license)");

        using (response)
        {
            var xmlDoc = GetWebResponseAsXml(response);

            //Get all the group nodes
            var nsManager         = XmlHelper.CreateTableauXmlNamespaceManager("iwsOnline");
            var xNodeUpdatedGroup = xmlDoc.SelectSingleNode("//iwsOnline:group", nsManager);

            try
            {
                //Sanity check on the expected results
                var updatesGroupId      = xNodeUpdatedGroup.Attributes["id"].Value;
                var returnedMinSiteRole = XmlHelper.SafeParseXmlAttribute(xNodeUpdatedGroup, "minimumSiteRole", "");

                if (updatesGroupId != this.GroupId)
                {
                    IwsDiagnostics.Assert(false, "920-1102: Error. Updated groups returned mismatching group id: " + this.GroupId + "/" + updatesGroupId);
                    StatusLog.AddError("920-1102: Error. Updated groups returned mismatching group id: " + this.GroupId + "/" + updatesGroupId);
                    return(false);
                }

                //See if the returned role matches
                if (this.PerformUpdateGrantLicense)
                {
                    if (!CompareGrantLicenseRoles(returnedMinSiteRole, this.UpdatedGrantLicenseSiteRole))
                    {
                        string errorText = "920-1206: Error. Updated Grant License role for group does not match expected role: "
                                           + NullSafeText(returnedMinSiteRole) + "/" + NullSafeText(this.UpdatedGrantLicenseSiteRole);
                        StatusLog.AddError(errorText);
                        return(false);
                    }
                }
            }
            catch (Exception parseXml)
            {
                StatusLog.AddError("920-1105: Update group, error parsing XML response " + parseXml.Message + "\r\n" + xmlDoc.InnerXml);
                return(false);
            }
        }
        return(true); //Success
    }